前提:我正在尝试使用 WSL 将 Ubuntu 作为 Windows 10 应用程序运行。
TL;DR 问题:当 Ubuntu 使用 WSL 2 时,使用公司 VPN 时网络连接会“消失”。
尝试使用在 Windows 10 工作笔记本电脑上运行 Ubuntu 18.04(从 Microsoft Store 下载)(IT 不支持 Linux - 我自己使用)WSL 2
。当公司 VPN 开启时离开,我似乎有网络连接;当我连接到 VPN 时,突然无法连接(ping
等)任何东西。
可能需要处理一系列问题,因此我将尝试限制这个问题的范围:为什么 Ubuntuwifi0
在使用时报告 NIC WSL 1
,但在使用时不报告WSL 2
(这重要吗)?
WSL 2
为什么使用且启用了 VPN时我无法连接到任何地方?修复是否只需添加权限即可nameserver
?/etc/resolv.conf
如果是,有效值是多少?我已经尝试过8.8.8.8
了8.8.4.4
。
Ubuntu 18.04 WSL 1
:
$ ifconfig wifi0
wifi0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.0.0.96 netmask 255.255.255.0 broadcast 10.0.0.255
$ ifconfig eth0
eth0: flags=64<RUNNING> mtu 1500
inet 169.254.91.163 netmask 255.255.0.0
$ ping www.google.com # No VPN
PING forcesafesearch.google.com (216.239.38.120) 56(84) bytes of data.
64 bytes from any-in-2678.1e100.net (216.239.38.120): icmp_seq=1 ttl=119 time=19.8 ms
64 bytes from any-in-2678.1e100.net (216.239.38.120): icmp_seq=2 ttl=119 time=22.0 ms
$ ping www.google.com # VPN active
PING forcesafesearch.google.com (216.239.38.120) 56(84) bytes of data.
64 bytes from any-in-2678.1e100.net (216.239.38.120): icmp_seq=1 ttl=119 time=19.8 ms
64 bytes from any-in-2678.1e100.net (216.239.38.120): icmp_seq=2 ttl=119 time=22.0 ms
Ubuntu 18.04 WSL 2
:
$ ifconfig wifi0
wifi0: error fetching interface information: Device not found
$ ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.34.56 netmask 255.255.255.240 broadcast 192.168.34.63
$ ping www.google.com # No VPN
PING www.google.com (142.250.68.100) 56(84) bytes of data.
64 bytes from lax31s12-in-f4.1e100.net (142.250.68.100): icmp_seq=1 ttl=118 time=27.7 ms
64 bytes from lax31s12-in-f4.1e100.net (142.250.68.100): icmp_seq=2 ttl=118 time=19.6 ms
$ ping www.google.com # VPN active -- Both the generated and hand-edited /etc/resolv.conf failed
^C
更新:
我尝试了@StuartBrock 的有希望的答案,但不幸的是它没有起作用。
在 Windows 中,ipconfig /all
产生了以下内容,我认为这些是 VPN 适配器的 DNS 值:
Ethernet adapter vEthernet (Default Switch):
Connection-specific DNS Suffix . :
Description . . . . . . . . . . . : Hyper-V Virtual Ethernet Adapter
...
DNS Servers . . . . . . . . . . . : fec0:0:0:ffff::1%1
fec0:0:0:ffff::2%1
fec0:0:0:ffff::3%1
Ethernet adapter vEthernet (WSL):
Connection-specific DNS Suffix . :
Description . . . . . . . . . . . : Hyper-V Virtual Ethernet Adapter #2
...
DNS Servers . . . . . . . . . . . : fec0:0:0:ffff::1%1
fec0:0:0:ffff::2%1
fec0:0:0:ffff::3%1
中已存在以下几行/etc/wsl.conf
:
[network]
generateResolvConf = false
...并且我已经验证,结果是,编辑的内容/etc/resolve.conf
在“重启”(停止/重启 Ubuntu 18.04 LTS Windows 应用程序)后仍然有效。
我不确定前缀fec
和%1
后缀是什么,但这些值看起来像是 IPV6 地址。所以我继续并/etc/resolve.conf
相应地更新了我的:
user@LOC-USER-LT:~$ cat /etc/resolv.conf
nameserver 10.0.0.1
nameserver 10.100.98.237
nameserver 10.100.98.21
nameserver fec0:0:0:ffff::1%1
nameserver fec0:0:0:ffff::2%1
nameserver fec0:0:0:ffff::3%1
...然后进行相同的测试,即ping www.google.com
,其行为与最初描述的行为没有变化。
停止/重新启动 Ubuntu 18.04 LTS Windows 应用程序后问题仍然存在。
如果我在重新启动 Ubuntu 18.04 LTS Windows 应用程序之前和之后更新/etc/resolve.conf
内容以删除fec
前缀和后缀,问题也不会改变:%1
nameserver 10.0.0.1
nameserver 10.100.98.237
nameserver 10.100.98.21
nameserver 0:0:0:ffff::1
nameserver 0:0:0:ffff::2
nameserver 0:0:0:ffff::3
我不确定vim
的内容有多智能/etc/resolve.conf
,但我发现有趣的是它选择用红色突出显示这些新的 IPV6 值,就好像它认为它们无效一样:
更新 2:
我想知道内容的顺序是否/etc/resolve.conf
重要,所以我尝试将新的 IPV6 值放在文件顶部。有趣的是,这做过改变行为:不再挂起几秒钟然后失败并出现 stderr ping: www.google.com: Temporary failure in name resolution
,而是立即地返回相同的 stderr 消息。
答案1
我在使用 Cisco AnyConnect 时也遇到了类似的问题。我认为 WSL1 是通过 Windows(通过 Hyper-V?)进行联网的,而 WSL2 实际上是与 Windows 一起虚拟化运行的 Linux 内核。
我的解决办法是
- 在 Windows 中
ipconfig /all
获取 VPN 适配器的 DNS 值 - 在 WSL 中将
sudo vi /etc/resolv.conf
DNS 值添加为行nameserver <DNS IP>
您可以选择添加下面的块来/etc/wsl.conf
阻止 resolv.conf 在重新启动时被“刷新”(擦除)。但您需要记住它不会在将来自动更新。
[network]
generateResolvConf = false
至于为什么在连接 VPN 时没有网络连接,我认为它试图连接到 VPN 阻止的“关闭 VPN”DNS。WSL2 和 VPN 似乎存在一些 GitHub 问题,所以我希望某个时候能得到修复。
答案2
我使用了 ubuntu_20 和 WSL2,并按照以下步骤修复了该问题:
以管理员身份运行 Powershell
Get-NetAdapter | Where-Object {$_.InterfaceDescription -Match "Cisco AnyConnect"} | Set-NetIPInterface -InterfaceMetric 4000 Get-NetIPInterface -InterfaceAlias "vEthernet (WSL)" | Set-NetIPInterface -InterfaceMetric 1
查找名称服务器(Windows Powershell 命令)
ipconfig /all
就我而言,我发现了价值观:
10.150.54.19
和10.158.55.13
/etc/wsl.conf
通过编辑(在 WSL 实例内部)对 DNS 进行永久更改[network] generateResolvConf = false
关闭 WSL2(PowerShell 命令)
wsl --shutdown
然后用 wsl 打开新的终端窗口
删除并创建新
/etc/resolv.conf
文件sudo rm /etc/resolv.conf sudo nano /etc/resolv.conf
在添加以下内容
resolv.conf
nameserver 8.8.8.8 nameserver 10.150.54.19 nameserver 10.158.55.13
第一步(两个 powershell 命令)每次连接到 vpn 时都需要执行
答案3
有一个简单的解决方法它在安装了 WSL2+Ubuntu 20.04 和 Cisco AnyConnect 的 Windows 10 上对我有用:
在连接到 VPN 之前启动 WSL:
wsl --shutdown
# disconnect VPN
wsl
# connect VPN again
答案4
如果你正在使用 Mcafee,请参阅本文 -https://kc.mcafee.com/corporate/index?page=content&id=KB94601