You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动