当我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
,但没有帮助。
有任何想法吗?
答案1
“主动拒绝”通常意味着 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 上,前者将同时接受两者。)
php -S "0.0.0.0:80"
php -S "[::]:80"
我会使用 Wireshark 来捕获数据包,但我不知道如何使用 Wireshark 来捕获通过 WSL 发送的内容……
WSL 版本 2“容器”是一个完整的 Hyper-V VM,具有自己的网络接口,您可以tcpdump
在 VM 内部使用它来查看正在接收的内容。在主机上,您还有一个(略微隐藏的)Hyper-V vSwitch 接口,用于处理 172.18.240.0/24 的路由和 NAT,Wireshark 也应该能够看到它。