无法通过其 IP 地址连接到 WSL 容器

无法通过其 IP 地址连接到 WSL 容器

当我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

分别使用[::]:800.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 也应该能够看到它。

相关内容