为什么在 Ubuntu 中使用 VPN 后面的 WSL 2 没有网络连接?

为什么在 Ubuntu 中使用 VPN 后面的 WSL 2 没有网络连接?

前提:我正在尝试使用 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.88.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 值,就好像它认为它们无效一样:
vim 不喜欢在此处输入图片描述


更新 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 内核。

我的解决办法是

  1. 在 Windows 中ipconfig /all获取 VPN 适配器的 DNS 值
  2. 在 WSL 中将sudo vi /etc/resolv.confDNS 值添加为行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.1910.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

相关内容