如何实现两个WireGuard网络的客户端互通(避免内网不必要加密)
如何实现两个WireGuard网络的客户端互通(避免内网不必要加密)
兄弟,我懂你的困扰——不想在内网多一层没必要的加密,又不想靠难维护的iptables来搞转发,其实用静态路由+WireGuard AllowedIPs配置就能完美解决,步骤也不复杂,我给你掰扯清楚:
先假设一下基础环境方便举例(你可以根据自己的实际网段替换):
- Server1内网IP:192.168.XX.10,它的WireGuard客户端网段是
10.0.1.0/24 - Server2内网IP:192.168.XX.20,它的WireGuard客户端网段是
10.0.2.0/24
第一步:开启服务器的IP转发功能
这是流量能在服务器之间转发的基础,两个服务器都得开:
- 临时生效(重启后失效):执行
echo 1 > /proc/sys/net/ipv4/ip_forward - 永久生效:编辑
/etc/sysctl.conf,把net.ipv4.ip_forward=1这行的注释去掉,然后执行sysctl -p让配置生效。
第二步:给服务器配置静态路由,让它们“认识”对方的客户端网段
我们要让Server1知道:发往10.0.2.0/24的流量,得交给Server2的内网IP;同理让Server2知道发往10.0.1.0/24的流量交给Server1:
- 在Server1上执行:
ip route add 10.0.2.0/24 via 192.168.XX.20 - 在Server2上执行:
ip route add 10.0.1.0/24 via 192.168.XX.10 - 要是想让路由永久保存,不同系统操作略有不同:Debian/Ubuntu可以把命令加到
/etc/rc.local里,CentOS/RHEL可以写进/etc/sysconfig/network-scripts/route-<内网接口名>文件中。
第三步:调整WireGuard的AllowedIPs配置,让客户端能发流量到对方网段
关键是要让客户端知道:访问对方服务器的客户端网段时,把流量发给自己连接的WireGuard服务器,再由服务器转发。
- 以Server1上的客户端配置为例,在Server1的
wg0.conf里,对应每个客户端的[Peer]段,把对方的客户端网段加到AllowedIPs里:[Peer] PublicKey = 客户端1的公钥 AllowedIPs = 10.0.1.2/32, 10.0.2.0/24 - 同样,在Server2的
wg0.conf里,每个客户端的[Peer]段也要加上10.0.1.0/24:[Peer] PublicKey = 客户端4的公钥 AllowedIPs = 10.0.2.4/32, 10.0.1.0/24 - 修改完配置后,记得重启WireGuard服务:
wg-quick down wg0 && wg-quick up wg0
第四步:确保内网防火墙放行转发流量
如果你的内网服务器或路由器有防火墙,要允许两个服务器之间的10.0.1.0/24和10.0.2.0/24网段双向通行,比如在服务器上可以用iptables加个规则:
iptables -A FORWARD -s 10.0.1.0/24 -d 10.0.2.0/24 -j ACCEPT iptables -A FORWARD -s 10.0.2.0/24 -d 10.0.1.0/24 -j ACCEPT
为什么这个方案适合你?
- 完全避免了把两个服务器互加为WireGuard Peer,内网里转发的客户端流量都是明文的,符合你不想做不必要加密的需求;
- 相比iptables,用静态路由+AllowedIPs的配置逻辑更清晰,每个客户端的访问范围一目了然,维护起来更简单;要是需要DNS解析客户端,你可以在服务器上搭个内部DNS,把客户端IP和域名绑定,客户端用服务器的DNS就能正常解析,完全不存在iptables没DNS的问题。
另外补充个优化点:如果你的内网有核心路由器,也可以把静态路由配置在路由器上,让路由器负责把两个客户端网段的流量分别导向对应的WireGuard服务器,这样两个服务器就不用单独加路由,维护更集中。
备注:内容来源于stack exchange,提问作者Andrey Egorov




