我的 Windows 10 笔记本电脑上运行着 Ubuntu-20.04 版本 2 WSL。一切正常,我有互联网连接。但前提是我没有连接到 VPN 网络。
如果我使用 Cisco AnyConnect 连接到我大学的网络,我将无法再在 WSL 上连接到互联网,而使用 Windows 系统中的 Firefox 等浏览器则一切正常。我收到:ping:google.de:名称解析暂时失败
我已经尝试了以下操作:
以管理员模式打开 Windows cmd 并输入以下命令:
netsh winsock reset
netsh int ip reset all
netsh winhttp reset proxy
ipconfig /flushdns
reboot
这种方法曾经有效,我可以访问互联网。但是,当我断开 VPN 连接并重新连接时,我又遇到了同样的问题。我尝试再次执行命令并重新启动,但现在这种方法不再起作用了。
所以我真的不知道还能做什么。我真的需要在通过 VPN 连接时使用 WSL
答案1
使用 VPN 时,WSL2 中的 DNS 转发存在问题(参见 github 问题)此外,思科 AnyConnect。因此,这里有一个解决这些问题的方法。应该适用于 Ubuntu 和 Debian。
解决方法(新 - 自动)
此解决方案是自动的,由愛德華·庫克(看https://www.frakkingsweet.com/automatic-dns-configuration-with-wsl-and-anyconnect-client/)这只是他的解决方案的第一部分启动 WSL 时更新 resolv.conf。
重新启用 resolv.conf 的自动生成(若已禁用)
通过评论禁用
#
sudo nano /etc/wsl.conf
#[network] #generateResolvConf = false
创建脚本
sudo nano /bin/vpn-dns.sh
#!/bin/bash echo "Getting current DNS servers, this takes a couple of seconds" /mnt/c/Windows/System32/WindowsPowerShell/v1.0/powershell.exe -Command ' $ErrorActionPreference="SilentlyContinue" Get-NetAdapter -InterfaceDescription "Cisco AnyConnect*" | Get-DnsClientServerAddress | Select -ExpandProperty ServerAddresses Get-NetAdapter | ?{-not ($_.InterfaceDescription -like "Cisco AnyConnect*") } | Get-DnsClientServerAddress | Select -ExpandProperty ServerAddresses ' | \ awk 'BEGIN { print "# Generated by vpn fix func on", strftime("%c"); print } { print "nameserver", $1 }' | \ tr -d '\r' > /etc/resolv.conf clear
使其可执行/以 sudo 身份运行
sudo chmod +x /bin/vpn-dns.sh echo "$(whoami) ALL=(ALL) NOPASSWD: /bin/vpn-dns.sh" | sudo tee /etc/sudoers.d/010-$(whoami)-vpn-dns
做了跑步在wsl 启动
echo "sudo /bin/vpn-dns.sh" | sudo tee /etc/profile.d/vpn-dns.sh
您也可以手动运行它:
sudo /bin/vpn-dns.sh
解决方法(旧手册)
使用以下方法查找名称服务器视窗电源外壳(VPN 会话期间)
nslookup
您将获得公司名称服务器的 IPv4 地址复制此地址。
禁用解析配置文件一代在 wsl 中:
sudo nano /etc/wsl.conf
将此文本复制到文件中(当 wsl 启动时禁用 resolve.conf 生成)
[network] generateResolvConf = false
在 wsl 中将您的公司名称服务器添加到
resolv.conf
sudo nano /etc/resolv.conf
删除其他条目并添加您的公司名称服务器 IP(如果您有辅助名称服务器,请在单独的行中添加)
nameserver X.X.X.X
(其中 XXXX 是您在步骤 1 中获得的地址)
设置您的 VPN 适配器(如果有)思科 AnyConnect)打开管理员 powershell
- 找出您的 VPN 适配器名称:(
Get-NetIPInterface
就我而言"Cisco AnyConnect"
:) - 设置适配器指标(用您的名称替换-Match),在我的情况下,我必须在每次重启或 VPN 重新连接后运行这个:
Get-NetAdapter | Where-Object {$_.InterfaceDescription -Match "Cisco AnyConnect"} | Set-NetIPInterface -InterfaceMetric 6000
(什么是接口度量:用于确定路由,Windows 使用度量最低的接口)
- 找出您的 VPN 适配器名称:(
重启 wsl在 powershell 中:
wsl.exe --shutdown
测试一下在 wsl 中运行:
wget google.com
-如果此命令有效,则您已完成。
就我而言,当我尝试通过浏览器(在 Windows 10 上,fe:内联网)连接到内部内容时,我遇到了 DNS 问题,这是由于步骤 4 中设置的度量值过高(基本上是禁用 VPN 路由)造成的。因此,以下是解决方法:
- 检查您的默认指标(VPN 接口)在 powershell 中(将 -Match 替换为您的接口名称)
Get-NetAdapter | Where-Object {$_.InterfaceDescription -Match "Cisco AnyConnect"} | Get-NetIPInterface
- 在 Windows 10 上遇到问题时,使用以下命令恢复此默认值管理员 powershell(将末尾的值替换为您的默认值):
Get-NetAdapter | Where-Object {$_.InterfaceDescription -Match "Cisco AnyConnect"} | Set-NetIPInterface -InterfaceMetric 1
答案2
这似乎是 WSL 2 中的一个错误,请参阅https://github.com/microsoft/WSL/issues/4277。
提供的解决方法这里对我有用:卸载 Cisco AnyConnect 客户端并安装来自Microsoft Store。
答案3
对于 Windows 11,WSL2 于 2023 年 9 月进行了更新,(希望)可以修复此问题。创建一个%UserProfile%\.wslconfig
包含以下内容的文件,然后重新启动 wsl。运行wsl.exe --shutdown
。我还必须重新启动计算机,但我不确定这是否总是必要的。
[experimental]
networkingMode=mirrored
dnsTunneling=true
更改这些设置后,重新启动 WSL(即运行wsl --shutdown
;仅关闭正在运行的分发版是不够的)。
更新 2024-02-27
这些设置现在应该属于[wsl2]
而不是[experimental]
。 相关文档
参考:
答案4
我解决了这个问题。 打开微软商店 ->搜索并安装Anyconnect -> vpn 连接现在可与 WSL2 配合使用。