当我php -S localhost:80
在 WSL / Ubuntu 20.04.1 中执行此操作时,我可以在 WSL 内部进行连接,但不能在 WSL 外部进行连接。
根据 ifconfig 的显示,我的 WSL 实例的 eth0 IP 地址为 172.18.240.175。如果我在容器内,我可以毫无问题地连接到端口 80(例如php -r "fsockopen('127.0.0.1', 80);"
),但在容器外但仍在 Windows 11 WSL 主机上时,我无法连接。php -r "fsockopen('172.18.240.175', 80);"
给了我以下内容:
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
为了更好地衡量我这样做:
sudo iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT
现在,当我这样做时,sudo iptables -nL -v | grep 80
我看到了这个:
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
(好吧,从技术上讲,grep 只返回第二行,但无论如何)
事实上,每次我尝试发出 HTTP 请求时,pkts 和 bytes 列都会上升。因此,WSL 实例正在以某种方式接收请求,但随后该请求被拒绝。我会使用 Wireshark 捕获数据包,但不知道如何使用 Wireshark 捕获通过 WSL 发送的内容...
当我这样做时,sudo ufw status verbose
它说Status: inactive
。尽管如此,我尝试过sudo ufw allow 80/tcp
,但没有帮助。
有任何想法吗?
“主动拒绝”通常意味着 TCP RST,由响应系统发送,以表明没有服务正在侦听该地址:端口。
侦听套接字不仅绑定到(目标)端口,还绑定到(目标)IP 地址:端口,并且当您使用时,您要求
-S localhost:80
PHP 将侦听器绑定[::1]
到或127.0.0.1
专门绑定。ss -l sport 80
您可以在或的输出中看到这一点netstat -ln
。分别使用
[::]:80
或0.0.0.0:80
作为 IPv6 或 IPv4 的“所有本地地址”通配符地址。(前者在 Linux 上将接受两者。)WSL 版本 2“容器”是一个完整的 Hyper-V VM,具有自己的网络接口,您可以
tcpdump
在 VM 内部使用来查看收到的内容。在主机上,您还有一个(稍微隐藏的)Hyper-V vSwitch 接口,用于处理 172.18.240.0/24 的路由和 NAT,并且 Wireshark 也应该能够看到它。