WireGuard VPN客户端无法访问服务器后方特定子网的问题求助及解决方案
WireGuard VPN客户端无法访问服务器后方特定子网的问题求助及解决方案
最近折腾WireGuard VPN的时候遇到了个头疼的问题,搭好了服务器,但客户端只能访问服务器后方的部分子网,捣鼓了好久终于搞定了,把整个过程整理出来给大家参考:
问题描述
我搭建了一台WireGuard VPN服务器,客户端连接后能正常访问服务器所在的10.10.10.0/24网段,但就是没法访问服务器另一块网卡连接的10.10.11.0/24网段,试了好几种方法都没效果,急死人了。
服务器网络环境
先给大家列一下服务器的网卡配置:
- eno1:
10.10.10.2/24(作为网关接口) - eno2:
10.10.11.2/24(连接目标子网) - wg0(WireGuard虚拟接口):
10.66.66.1/24
当前路由表信息
用route -n命令查看的路由表如下:
Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 10.10.10.1 0.0.0.0 UG 0 0 0 eno1 10.10.10.0 0.0.0.0 255.255.255.0 U 0 0 0 eno1 10.10.11.0 0.0.0.0 255.255.255.0 U 0 0 0 eno2 10.66.66.0 0.0.0.0 255.255.255.0 U 0 0 0 wg0
当前iptables规则
执行iptables -S得到的规则:
-P INPUT ACCEPT -P FORWARD ACCEPT -P OUTPUT ACCEPT -A INPUT -p udp -m udp --dport 44021 -j ACCEPT -A FORWARD -i wg0 -j ACCEPT -A FORWARD -i eno1 -o wg0 -j ACCEPT
尝试过的无效方法
我之前试过手动添加静态路由,也尝试过配置iptables的masquerade规则,但都没解决问题。
最终解决方案
终于找到根源了!只需要在WireGuard的配置文件wg0.conf中添加以下PostUp和PostDown指令,就能让客户端正常访问10.10.11.0/24网段了:
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eno2 -j MASQUERADE PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eno2 -j MASQUERADE
简单说下原理:原来的iptables规则只针对eno1接口做了转发相关配置,而要访问eno2连接的子网,需要给eno2接口添加动态地址伪装(MASQUERADE),让来自VPN客户端的流量从eno2出去时,源IP替换成服务器eno2的IP,这样子网内的设备才能把回包正确发回给VPN客户端,整个通信链路就通了。
备注:内容来源于stack exchange,提问作者Arthurency




