WireGuard隧道选择性路由与防火墙配置方案咨询
WireGuard隧道选择性路由与防火墙配置方案咨询
你已经把两台Linux主机的WireGuard基础隧道配置好了,互访(Ping、SSH、HTTP这些)都正常,现在想实现特定目标的流量通过WireGuard隧道转发,同时保留默认互联网流量走直连的规则对吧?我结合你的现有配置,给你一步步讲需要做的改动:
前提:开启IP转发功能
不管哪台主机要承担流量转发的角色,都得先开启内核的IP转发:
- 临时生效(重启后失效):
echo 1 > /proc/sys/net/ipv4/ip_forward - 永久生效:
编辑/etc/sysctl.conf,找到net.ipv4.ip_forward配置项,修改为:
执行net.ipv4.ip_forward = 1sysctl -p让配置立即生效。
场景1:让Computer1的特定流量通过WireGuard转发到Computer2(再由Computer2访问目标网络)
假设你想让Computer1访问192.168.100.0/24这个网段时,流量走WireGuard隧道,由Computer2转发出去:
1. 修改Computer1的WireGuard配置
在Computer1的[Peer]段里,把需要转发的目标网段加到AllowedIPs中(原来的10.6.0.1/32保留,确保互访正常):
[Interface] PrivateKey = <computer1-private-key> Address = 10.6.0.2/24 ListenPort = 51820 [Peer] PublicKey = <computer2-public-key> PresharedKey = <preshared-key> AllowedIPs = 10.6.0.1/32, 192.168.100.0/24
重启WireGuard接口(假设接口名为wg0):
wg-quick down wg0 && wg-quick up wg0
2. 在Computer2上配置SNAT(源地址转换)
目标网段的设备不知道WireGuard隧道IP,所以需要Computer2把转发过来的流量源地址替换成自己的公网/本地局域网IP:
iptables -t nat -A POSTROUTING -s 10.6.0.2/32 -d 192.168.100.0/24 -j MASQUERADE
如果要永久保存iptables规则,不同发行版操作略有不同:
- Debian/Ubuntu:安装
netfilter-persistent后执行netfilter-persistent save - RHEL/CentOS:执行
iptables-save > /etc/sysconfig/iptables
场景2:让Computer2的特定流量通过WireGuard转发到Computer1
操作逻辑和上面完全一致:
- 在Computer2的
[Peer]段里,把需要转发的目标网段加到AllowedIPs中 - 在Computer1上配置对应的SNAT规则,把源地址为
10.6.0.1/32的流量做地址转换
验证配置是否生效
- 在发起转发的主机上(比如Computer1),执行
traceroute 192.168.100.1,查看第一跳是否为10.6.0.1(Computer2的隧道IP) - 测试访问目标网段的服务,确认能正常连通
- 同时访问普通互联网地址(比如
8.8.8.8),确认走的是原有直连路由,没有被隧道接管
备注:内容来源于stack exchange,提问作者Abraxas




