WireGuard:如何通过一个接口建立对等端连接,通过另一个接口转发出站流量
WireGuard:如何通过一个接口建立对等端连接,通过另一个接口转发出站流量
看起来你遇到的是典型的策略路由场景——需要让特定来源的流量(WireGuard对等端的流量)走指定网卡,同时保留全局默认路由不被修改(避免实例对外连接中断)。下面是针对Ubuntu 22.04的具体解决方案:
第一步:确认关键信息
先搞清楚ens7的网关IP,执行命令:
ip route show dev ens7
输出里会有类似default via 192.168.x.x dev ens7的行,把这个网关IP记下来(后面用ENS7_GATEWAY指代)。另外,确认你的WireGuard子网(比如配置里的Address段,假设是10.0.0.0/24)。
第二步:创建自定义路由表
我们需要给WireGuard流量单独建一个路由表,方便管理:
echo "100 wireguard-out" >> /etc/iproute2/rt_tables
这里100是路由表的编号(只要是未被占用的编号就行),wireguard-out是表的别名,方便后续识别。
第三步:配置WireGuard的PostUp/PostDown规则
编辑你的WireGuard配置文件(通常是/etc/wireguard/wg0.conf),添加以下PostUp和PostDown指令,替换里面的ENS7_GATEWAY和WIREGUARD_SUBNET为你实际的参数:
[Interface] # 你的其他配置(PrivateKey、Address、ListenPort等) PostUp = ip rule add from WIREGUARD_SUBNET table wireguard-out; ip route add default via ENS7_GATEWAY dev ens7 table wireguard-out PostDown = ip rule del from WIREGUARD_SUBNET table wireguard-out; ip route del default via ENS7_GATEWAY dev ens7 table wireguard-out [Peer] # 你的对等端配置
原理说明
ip rule add from WIREGUARD_SUBNET table wireguard-out:告诉系统,所有来自WireGuard子网的流量,优先使用我们自定义的wireguard-out路由表。ip route add default via ENS7_GATEWAY dev ens7 table wireguard-out:在自定义路由表里设置默认路由,让流量走ens7的网关。- 全局默认路由还是ens3,所以实例本身的对外连接(比如SSH、curl)依然用浮动IP,不会断开;只有WireGuard对等端发起的出站流量会走ens7的网关,满足IP白名单需求。
验证方法
- 重启WireGuard服务:
wg-quick down wg0 && wg-quick up wg0 - 在WireGuard对等端上执行
curl ifconfig.me,应该返回ens7对应的网关IP - 在实例本地执行
curl ifconfig.me,依然返回ens3的浮动IP
备注:内容来源于stack exchange,提问作者Dreamplay
相关产品推荐
相关产品推荐

