WSL2连接Cisco Anyconnect VPN后无法通过IP地址建立连接(非DNS问题)
WSL2连接Cisco Anyconnect VPN后无法通过IP地址建立连接(非DNS问题)
我之前也碰到过一模一样的问题,折腾了好一阵子才搞明白——这不是防火墙的问题,核心原因是Cisco Anyconnect连接VPN后,会修改Windows的路由表,把WSL2所在的虚拟子网流量给“拦截”了,导致不管是WSL连外部IP,还是Windows主机连WSL的IP都走不通。
下面给你几个亲测有效的解决思路,按操作复杂度从低到高来:
1. 先检查Anyconnect的「本地局域网访问」开关
这是最省心的办法,很多企业VPN默认会关闭这个选项来限制本地网络访问,但如果允许开启的话:
- 打开Cisco Anyconnect客户端,点击设置图标(齿轮)
- 找到「本地局域网访问」或者类似的选项(不同版本翻译可能有差异),勾选它
- 重新连接VPN,再试试WSL里的
telnet、curl命令
如果IT管理员锁了这个设置,那只能往下看其他方法了。
2. 手动添加静态路由(临时生效,每次连VPN都要操作)
这个方法需要你有点基础的网络知识,步骤如下:
获取WSL2的虚拟网卡信息:
- 在Windows的CMD里运行
ipconfig,找到名为「vEthernet (WSL)」的网卡,记下它的IPv4地址(比如172.17.0.1)和子网掩码(比如255.255.0.0) - 打开WSL终端,运行
ip addr,记下WSL实例的IP(比如172.17.0.2),确认子网和上面的一致
- 在Windows的CMD里运行
在Windows管理员CMD里添加路由:
运行这条命令(把参数换成你刚才查到的信息):route add 172.17.0.0 mask 255.255.0.0 172.17.0.1 metric 1这条命令的作用是让Windows把WSL子网的流量优先转发到WSL虚拟适配器,而不是走VPN隧道。
验证是否生效:
重新在WSL里尝试连接目标IP,或者从Windows主机ping WSL的IP,应该就能通了。
3. 把WSL2改成桥接网络模式(长期生效,需要Windows版本支持)
如果你的Windows 10版本够新(一般20H2及以上),可以把WSL2的网络模式改成桥接,这样WSL会直接获取和Windows主机同网段的IP,VPN的路由规则就不会影响它了:
- 先关闭所有WSL实例:
wsl --shutdown - 在管理员PowerShell里设置桥接模式:
先确认你的WSL发行版名称(比如Ubuntu-20.04),然后运行:
运行后会让你选择要桥接的网卡,选当前连VPN的物理网卡或者WSL虚拟网卡都行。wsl --configure <你的发行版名称> --networking-mode bridge - 重启WSL,运行
ip addr确认WSL的IP和Windows主机在同一网段,再连接VPN测试即可。
补充说明
为什么断开VPN就正常?因为断开后Windows的路由表会恢复默认状态,WSL虚拟子网的流量可以正常通过物理网卡转发,而VPN连接时,Anyconnect会把默认路由优先级设得很高,导致WSL的流量被强制走VPN隧道,但企业VPN一般不会把WSL的虚拟子网加入允许列表,所以就超时了。
备注:内容来源于stack exchange,提问作者user184190




