双网卡环境下如何配置两个WireGuard实例分别对应eth0和wlan0路由
双网卡环境下如何配置两个WireGuard实例分别对应eth0和wlan0路由
看起来你遇到的核心问题是路由规则的匹配逻辑没抓对,导致wg0-client的出站流量跑偏到eth0去了。咱们一步步来拆解和修复这个问题:
先说说你原来规则的问题
- 第一条规则
ip rule add iif lo ipproto udp dport 1111 lookup 1111:这条规则只认从本地回环接口(lo)发出来的UDP 1111流量,但WireGuard的出站流量是从wg0-client接口发的,根本碰不到这条规则,自然找不到正确的路由。 - 第二条规则
ip rule add from 0.0.0.0/32 ipproto udp dport 1111 lookup 1111:0.0.0.0/32是个无效的源地址范围(哪怕改成0.0.0.0/0,这条规则也会匹配所有发往UDP 1111的流量,系统大概率还是会优先选默认路由表的eth0路径,因为路由表1111里只有到目标域名的单条路由)。
正确的配置思路:绑定源+目标,精准匹配
要让wg0-client的流量死死绑定wlan0出站,得从「源地址/接口」和「目标地址/端口」两个维度来做规则,这样系统才会明确知道该走哪条路。
步骤1:给wg0-client设固定内网IP
先确保你的wg0-client配置里有固定的IP(比如Address = 10.0.0.2/24,具体根据你的WireGuard服务器配置调整),这样我们能基于这个固定源地址做精准规则。
步骤2:调整wg0-client的PostUp/PostDown规则
把原来的规则替换成下面的配置,每一条都给你标了作用:
[Interface] PrivateKey = 你的wg0-client私钥 Address = 10.0.0.2/24 # 这里是刚才说的固定内网IP # 把目标域名的所有解析IP都加入路由表1111,绑定wlan0网关 PostUp = for ip in $(dig +short some.domain.com); do ip route add $ip/32 via 192.168.0.1 dev wlan0 table 1111; done # 让从wg0-client源地址发往UDP 1111的流量强制用表1111 PostUp = ip rule add from 10.0.0.2 ipproto udp dport 1111 lookup 1111 # (可选)如果wg0-client的所有流量都要走wlan0,再加这条规则 PostUp = ip rule add from 10.0.0.2 lookup 1111 # (可选)如果需要让wg0-client访问其他资源也走wlan0,添加默认路由到表1111 PostUp = ip route add default via 192.168.0.1 dev wlan0 table 1111 # 对应清理规则,避免重启后残留 PostDown = for ip in $(dig +short some.domain.com); do ip route del $ip/32 via 192.168.0.1 dev wlan0 table 1111; done PostDown = ip rule del from 10.0.0.2 ipproto udp dport 1111 lookup 1111 PostDown = ip rule del from 10.0.0.2 lookup 1111 PostDown = ip route del default via 192.168.0.1 dev wlan0 table 1111
步骤3:验证配置是否生效
启动wg0-client后,用这些命令检查:
ip rule list:看看我们加的规则有没有出现在列表里ip route show table 1111:确认路由表1111里有目标域名的IP路由和(可选的)默认路由- 抓包验证:分别在wlan0和eth0上跑
tcpdump -i wlan0 udp port 1111和tcpdump -i eth0 udp port 1111,测试wg0-client的流量是不是只从wlan0走
额外小提示
dig +short some.domain.com可能返回多个IP,用循环处理能确保所有解析出来的IP都被加入路由,避免漏网之鱼。
备注:内容来源于stack exchange,提问作者Marko Kraljevic
相关产品推荐
相关产品推荐

