如何将指定源IP的流量路由至跨子网的远程网关?
没问题,这个需求完全可以通过策略路由来实现,结合你已经打通WireGuard站点到站点连接的现状,我给你分两种常见场景讲解操作步骤,你可以根据实际情况选择:
场景一:在本地网关(192.168.0.20)上配置(推荐)
这种方式不需要修改目标主机(192.168.0.4)的设置,所有规则都集中在网关上管理,更适合多设备统一管控的场景:
创建自定义路由表
先在本地网关的路由表配置文件里新增一个专门的表,用来处理192.168.0.4的流量:echo "100 remotegw" >> /etc/iproute2/rt_tables这里
100是路由表的编号(只要不冲突就行),remotegw是自定义的表名,方便识别。给自定义表添加默认路由
让这个路由表的所有默认流量都指向远程网关192.168.2.254,因为你的WireGuard已经打通,所以这个地址是可达的:ip route add default via 192.168.2.254 table remotegw添加策略路由规则
指定源IP为192.168.0.4的流量,优先使用我们刚创建的remotegw路由表:ip rule add from 192.168.0.4 lookup remotegw priority 100priority 100表示这条规则的优先级较高(数值越小优先级越高),会先于默认路由规则生效。确保远程网关的返回流量可达
因为你已经确认两边LAN能互访,远程网关(192.168.2.254)应该已经有到192.168.0.0/24的路由了,如果没有的话,需要在远程网关添加:ip route add 192.168.0.0/24 via <WireGuard接口的本地IP>比如WireGuard接口在远程侧的IP是10.0.0.2,就填这个地址。
远程网关的SNAT配置(可选但必要)
如果要让192.168.0.4能通过远程网关访问互联网,需要在远程网关配置SNAT,把源IP转换成远程网关的公网IP:iptables -t nat -A POSTROUTING -s 192.168.0.4 -o <远程网关的互联网接口> -j MASQUERADE把
<远程网关的互联网接口>换成实际的接口名,比如eth0、ppp0等。
场景二:直接在目标主机(192.168.0.4)上配置
如果你的目标主机是Linux系统,也可以直接在它上面做配置,不需要动网关:
创建自定义路由表
和网关操作一样,先新增路由表:echo "100 remotegw" >> /etc/iproute2/rt_tables添加到远程网关的路由
确保主机能先到达192.168.2.254(如果已经能互访,这一步可能已经存在):ip route add 192.168.2.0/24 via 192.168.0.20给自定义表添加默认路由
ip route add default via 192.168.2.254 table remotegw添加策略路由规则
ip rule add from 192.168.0.4 lookup remotegw priority 100
永久化配置(重要)
上面的命令都是临时生效的,重启后会丢失,需要根据你的系统类型保存配置:
- Debian/Ubuntu:可以把路由和规则写到
/etc/network/interfaces里,或者用netplan配置; - RHEL/CentOS:在
/etc/sysconfig/network-scripts/目录下创建route-<接口名>和rule-<接口名>文件,写入对应的规则。
备注:内容来源于stack exchange,提问作者sndrvanes

