WSL2双网卡(eth0/eth1)环境下,指定eth1访问外部网络失败的路由配置求助
嘿,我看了你的问题,核心原因很明确——当前系统的默认路由只绑定在了eth0上,所以所有对外的网络请求都会自动走WSL默认的虚拟网卡(eth0),而eth1虽然能通同网段设备,但没配置对外访问的路由规则,直接用它访问外部自然会提示“目标不可达”。不过好在你已经验证了eth1本身是能通外部的(用ping -I指定源IP就成功了),那只需要调整路由配置就能解决问题,我给你两种方案:
一、临时生效配置(重启WSL后失效,适合快速测试)
方法1:给eth1添加默认路由(优先级高于eth0)
首先确认eth1所在网段的网关,一般是192.168.1.1(你可以在Windows端看对应Hyper-V交换机的网络网关,或者在WSL里ping这个地址试试能不能通)。然后执行以下命令:
sudo ip route add default via 192.168.1.1 dev eth1 metric 50
这里的metric 50是设置路由优先级,数值越小优先级越高——eth0的默认路由metric一般是100,所以这条规则会让所有外部流量优先走eth1。如果之后想切回eth0默认,删掉这条路由就行:
sudo ip route del default via 192.168.1.1 dev eth1
方法2:给特定目标IP添加路由(仅指定流量走eth1)
如果你只想让访问某几个特定地址(比如8.8.8.8、1.1.1.1)的时候走eth1,不用全局切换,可以这样:
# 给8.8.8.8添加专属路由 sudo ip route add 8.8.8.8/32 via 192.168.1.1 dev eth1 # 给1.1.1.1添加专属路由 sudo ip route add 1.1.1.1/32 via 192.168.1.1 dev eth1
这样访问这两个地址时会自动走eth1,其他流量还是走eth0。
方法3:策略路由(让从eth1发出的请求自动走eth1)
这种方式更灵活,不管你访问什么地址,只要请求的源IP是eth1的192.168.1.8,就自动走eth1的路由:
# 新建一个编号为100的路由表,添加eth1的默认路由和本地网段路由 sudo ip route add default via 192.168.1.1 dev eth1 table 100 sudo ip route add 192.168.1.0/24 dev eth1 table 100 # 添加规则:源IP为192.168.1.8的请求,使用100号路由表 sudo ip rule add from 192.168.1.8 lookup 100
配置完后,你直接用ping 1.1.1.1的时候,如果系统选择了eth1的IP作为源,就会自动走eth1的路由,不用再手动加-I参数。
二、永久生效配置(重启WSL后依然保留)
WSL每次重启都会重置网络配置,所以要把规则写到配置文件里:
- 先创建/修改
/etc/wsl.conf,禁用自动生成的网络配置:
[network] generateResolvConf = false
- 创建
/etc/network/interfaces.d/eth1文件,添加eth1的启动后脚本:
auto eth1 iface eth1 inet dhcp # 这里选你想要的配置方式,比如方法1的默认路由 post-up ip route add default via 192.168.1.1 dev eth1 metric 50 # 如果是方法3的策略路由,就替换成下面三行: # post-up ip route add default via 192.168.1.1 dev eth1 table 100 # post-up ip route add 192.168.1.0/24 dev eth1 table 100 # post-up ip rule add from 192.168.1.8 lookup 100
- 在Windows的命令提示符里执行
wsl --shutdown,然后重新打开WSL,配置就会自动生效了。
最后再补充下为什么ping -I 192.168.1.8 1.1.1.1能成功:因为你强制指定了请求的源IP是eth1的,这时候系统会匹配到eth1的本地网段路由,然后通过192.168.1.1网关转发请求;但默认情况下,系统会优先用默认路由对应的网卡(eth0)的IP作为源,所以直接ping外部地址时走的是eth0,这就是问题所在啦。
备注:内容来源于stack exchange,提问作者Tiklyt

