如何让Hyper-V或WSL Linux实例绕过PIA VPN实现直连互联网?
如何让Hyper-V或WSL Linux实例绕过PIA VPN实现直连互联网?
我之前也碰到过类似的问题,折腾了好一阵才搞定,给你分享几个亲测有效的方法:
针对WSL(尤其是WSL2)的解决方案
方法1:通过Windows路由表强制WSL流量走本地网关
- 先获取WSL的子网段:打开Windows命令提示符(管理员权限),运行
wsl hostname -I,得到WSL的IP地址(比如172.18.0.2),WSL2默认使用172.16.0.0/12段的子网,对应掩码是255.240.0.0。 - 找到你的本地物理网卡网关:运行
ipconfig,找到未连接VPN时的以太网/Wi-Fi适配器,记下默认网关(比如192.168.1.1)。 - 添加路由规则:在管理员cmd中执行:
把route add 172.16.0.0 mask 255.240.0.0 192.168.1.1 metric 1192.168.1.1替换成你自己的本地网关。这条命令会让所有WSL子网的流量直接走本地网关,绕过PIA VPN。注意:如果WSL重启后子网段变化,可能需要重新执行这条命令。如果想永久生效,可以把这条命令做成批处理脚本,设置开机自动运行。
方法2:固定WSL的IP和网关(更稳定)
- 在Windows的用户目录下创建
wsl.conf文件(路径:C:\Users\你的用户名\.wslconfig),添加以下内容:
这里的[wsl2] networkingMode=bridged vmSwitch=你的物理网卡名称你的物理网卡名称可以在Hyper-V管理器的虚拟交换机里找到,或者通过Get-NetAdapter在PowerShell中查看。 - 重启WSL:在cmd中运行
wsl --shutdown,然后重新打开WSL。 - 在WSL内部设置静态IP:以Ubuntu为例,编辑
/etc/netplan/00-installer-config.yaml,添加:
替换成你本地网段的静态IP、网关和DNS,然后执行network: ethernets: eth0: addresses: [192.168.1.100/24] gateway4: 192.168.1.1 nameservers: addresses: [8.8.8.8, 1.1.1.1] version: 2sudo netplan apply生效。这样WSL就会直接使用物理网卡的网络,完全绕过VPN。
针对Hyper-V虚拟机的解决方案
方法1:创建独立的外部虚拟交换机
- 打开Hyper-V管理器,点击右侧的
虚拟交换机管理器。 - 选择
外部类型,点击创建虚拟交换机,命名为External-Non-VPN,然后选择你的物理网卡(不要选PIA的虚拟网卡),取消勾选允许管理操作系统共享此网络适配器,点击确定。 - 打开你的Hyper-V虚拟机设置,把网络适配器改成刚才创建的
External-Non-VPN交换机。 - 在虚拟机内部设置静态IP:和WSL的步骤类似,设置虚拟机的IP为本地网段的地址,网关设为物理网卡的网关,DNS用公共DNS(比如8.8.8.8)。这样虚拟机的流量会直接通过物理网卡走互联网,不经过PIA VPN。
方法2:通过Windows路由表排除虚拟机子网
- 启动Hyper-V虚拟机,获取它的IP地址(比如
192.168.1.101),对应的子网是192.168.1.0/24(假设和物理网卡同网段)。 - 在管理员cmd中添加路由规则:
这条命令会让该子网的流量直接走本地网关,绕过VPN。如果虚拟机使用动态IP,只要子网不变,这条路由就一直有效。route add 192.168.1.0 mask 255.255.255.0 192.168.1.1 metric 1
通用补充技巧
如果PIA VPN会自动覆盖路由表,你可以写一个批处理脚本,在启动PIA后自动添加上述路由规则,比如:
@echo off route delete 172.16.0.0 mask 255.240.0.0 route add 172.16.0.0 mask 255.240.0.0 192.168.1.1 metric 1 route delete 192.168.1.0 mask 255.255.255.0 route add 192.168.1.0 mask 255.255.255.0 192.168.1.1 metric 1
把这个脚本保存为bypass-vpn.bat,每次启动PIA后运行一次即可。
备注:内容来源于stack exchange,提问作者rettiseert
相关产品推荐
相关产品推荐

