Quando faço isso php -S localhost:80
no WSL/Ubuntu 20.04.1, consigo me conectar dentro do WSL, mas não fora do WSL.
Minha instância WSL tem um endereço IP eth0 de 172.18.240.175, conforme revelado pelo ifconfig. Se eu estiver dentro do contêiner, posso me conectar à porta 80 sem problemas (por exemplo php -r "fsockopen('127.0.0.1', 80);"
), mas, fora do contêiner, mas ainda no host WSL do Windows 11, não consigo me conectar. php -r "fsockopen('172.18.240.175', 80);"
me dá o seguinte:
Warning: fsockopen(): unable to connect to 172.18.240.175:80 (No connection could be made because the target machine actively refused it.
) in php shell code on line 1
Para garantir, fiz isso:
sudo iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT
Agora, quando faço sudo iptables -nL -v | grep 80
isso, vejo isso:
pkts bytes target prot opt in out source destination
5 260 ACCEPT tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
(bem, tecnicamente, o grep retorna apenas a segunda linha, mas tanto faz)
Na verdade, toda vez que tento fazer uma solicitação HTTP, as colunas pkts e bytes aumentam. Portanto, a instância WSL está recebendo a solicitação de alguma maneira, mas ela é negada. Eu usaria o Wireshark para capturar os pacotes, mas não sei como usar o Wireshark para capturar o que está sendo enviado através do WSL...
Quando eu faço sudo ufw status verbose
isso diz Status: inactive
. Mesmo assim, tentei sudo ufw allow 80/tcp
e não adiantou.
Alguma ideia?
"recusou ativamente" normalmente significa TCP RST, enviado pelo sistema de resposta para indicar que nenhum serviço está escutando nesse endereço:porta.
Os soquetes de escuta não estão vinculados apenas a uma porta (destino), eles estão vinculados a um endereço IP: porta (destino), e quando você está usando,
-S localhost:80
você está pedindo ao PHP para vincular o ouvinte a[::1]
ou127.0.0.1
especificamente.Você pode ver isso na saída de
ss -l sport 80
ounetstat -ln
.Use
[::]:80
ou0.0.0.0:80
para o endereço curinga "todos os endereços locais" para IPv6 ou IPv4, respectivamente. (O primeiro, no Linux, aceitará ambos.)Os "contêineres" WSL versão 2 são uma VM Hyper-V completa com suas próprias interfaces de rede e você pode usar
tcpdump
dentro da VM para ver o que está sendo recebido. No host, você também tem uma interface Hyper-V vSwitch (ligeiramente oculta) que lida com o roteamento e o NAT para 172.18.240.0/24, e o Wireshark também deve ser capaz de vê-lo.