Windows WSL 2 无法 ping 主机

Windows WSL 2 无法 ping 主机

我今天刚刚升级到 Windows WSL 2。问题是我无法 ping 主机。

我从 /etc/resolv.conf 获取了主机的 IP。

从 WSL 2 Ubuntu 控制台:

  • 我可以 ping 8.8.8.8。
  • 我无法 ping 172.17.12.65 (主机)。
  • 我无法 ping www.google.com

请帮忙,谢谢!

答案1

来自这个 github 线程的一些迹象表明,这可能只是 Windows 主机上的防火墙阻止了流量......

https://github.com/microsoft/WSL/issues/4192#issuecomment-503804455

引用 xtremeperf 的话:

“实际上……您可能被 Windows 防火墙阻止了,因为 WSL2 被视为位于“公共网络”上。您需要在 Windows 防火墙上手动打开这些端口,因为在此早期测试版中,它们在安装时尚未自动配置。”

就像 harrymc 和 andoryu- 所说的那样,检查“/etc/resolv.conf”的内容以检查 WSL2 IP。据我所知,它应该是需要解除阻止的 IP。

不幸的是,WSL2 的虚拟交换机适配器连接配置文件默认为“公共”,除非您可以为适配器分配 VLAN ID,否则无法永久设置为“私有”,但我目前不知道如何使用 Microsoft 的虚拟机平台功能(我正在使用的功能)来做到这一点。希望 Microsoft 允许在未来的版本中轻松更改这一点。我还没有研究是否可以仅使用 Microsoft 的虚拟机管理程序平台功能来运行 WSL2。如果有人知道,那可能会有所帮助。

尽管这可能不是理想的做法,但您可以简单地允许主机防火墙上的“公共”配置文件的入站 ICMP 回显流量。使用 Windows Defender 的示例:

  1. 通过控制面板启动 Windows Defender 防火墙。
  2. 选择“高级设置”(左侧)
  3. 右键单击“入站规则”,然后选择“新建规则...”
  4. 选择“自定义”,点击“下一步”
  5. 选择“所有程序”,然后单击“下一步”
  6. 选择“ICMPv4”协议类型,然后单击“自定义……”
  7. 选择“特定 ICMP 类型”并选中“Echo Request”,单击“确定”,然后单击“下一步”
  8. 选择“任何 IP 地址”或根据需要为本地和远程添加特定地址(根据您的情况),然后单击“下一步”
  9. 选择“允许连接”,点击“下一步”
  10. 选择公共、域和私人,然后单击“下一步”
  11. 为规则指定一个有意义的名称,然后单击“完成”

答案2

默认情况下,Windows 防火墙阻止对主机的 Ping 操作。

Johan van Tonder 的解答有点太复杂了。您不需要创建新规则,因为 ICMP 回显规则已经存在。它们只是被禁用了。请参阅对 GitHub 问题的评论:WSL2 无法 ping 主机 #4171

启用防火墙规则

在 Windows 中运行提升的 PowerShell 并执行(不需要同时启用 ICMPv4 和 ICMPv6):

Enable-NetFirewallRule -DisplayName 'Virtual Machine Monitoring (Echo Request - ICMPv4-In)'
Enable-NetFirewallRule -DisplayName 'Virtual Machine Monitoring (Echo Request - ICMPv6-In)'

测试对主机的 ping

~$ ip route show default
default via 172.26.224.1 dev eth0
~$ ping -c1 172.26.224.1
PING 172.26.224.1 (172.26.224.1) 56(84) bytes of data.
64 bytes from 172.26.224.1: icmp_seq=1 ttl=128 time=0.375 ms

--- 172.26.224.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.375/0.375/0.375/0.000 ms

无法 pingwww.google.com是另一个问题,可能取决于 DNS 解析失败或其他原因。

答案3

允许 ping(ICMP 数据包)进入您的 Windows 防火墙,如下所示:

在 Windows 中,按下Windows键 --> 搜索“cmd” --> 右键单击​​“命令提示符”并转到“以管理员身份运行” --> 以管理员身份运行以下命令:

# Allow IPv4 ICMP ping packets in through the Windows firewall
netsh advfirewall firewall add rule name="ICMPv4 Allow Ping Requests" protocol=icmpv4:8,any dir=in action=allow

来源:参见此处“方法 3”:https://www.wintips.org/how-to-allow-ping-in-windows-firewall/

现在您可以从 WSL ping Windows!至少对我来说是有效的。

如果要撤消该操作并再次阻止 ping 数据包进入 Windows,请运行以下命令:

# Block incoming ping packets again
netsh advfirewall firewall add rule name="ICMPv4 Allow Ping Requests" protocol=icmpv4:8,any dir=in action=block

笔记:

在 Windows 中,使用 查看接口和 IP 地址ipconfig。在 WSL 或 Linux 中,使用 查看所有接口和 IP 地址ip address。我不再推荐ifconfig在 Linux 中使用,因为我认为它已被弃用,并且如果您在 Linux 中为单个接口适配器分配了多个 IP 地址,则ifconfig只会显示第一的一,而ip address(或ip a简称)将显示全部其中。

答案4

您可以在这里找到解决方案:https://github.com/microsoft/WSL/issues/5420

  • 找出你的路由器网关
  • 在 WSL 中创建/etc/wsl.conf以下内容:
[network]
generateResolvConf = false
  • 在 Powershell 中关闭 WSLwsl --shutdown
  • sudo bash -c 'echo "nameserver gateway_ip" > /etc/resolv.conf'

相关内容