我今天刚刚升级到 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 的示例:
- 通过控制面板启动 Windows Defender 防火墙。
- 选择“高级设置”(左侧)
- 右键单击“入站规则”,然后选择“新建规则...”
- 选择“自定义”,点击“下一步”
- 选择“所有程序”,然后单击“下一步”
- 选择“ICMPv4”协议类型,然后单击“自定义……”
- 选择“特定 ICMP 类型”并选中“Echo Request”,单击“确定”,然后单击“下一步”
- 选择“任何 IP 地址”或根据需要为本地和远程添加特定地址(根据您的情况),然后单击“下一步”
- 选择“允许连接”,点击“下一步”
- 选择公共、域和私人,然后单击“下一步”
- 为规则指定一个有意义的名称,然后单击“完成”
答案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 中关闭 WSL
wsl --shutdown
sudo bash -c 'echo "nameserver gateway_ip" > /etc/resolv.conf'