Linux环境下VPN路由问题:无法从服务器B访问VPN客户端侧的192.168.1.0/24网段
Linux环境下VPN路由问题:无法从服务器B访问VPN客户端侧的192.168.1.0/24网段
咱们一步一步来排查解决这个问题,核心要确保服务器A的转发功能正常,同时远程MikroTik配置了返回路由,下面是具体操作步骤:
1. 先开启服务器A的IP转发功能
Linux默认关闭IP转发,哪怕防火墙已经禁用,这个设置不开启的话,服务器A根本没法把来自服务器B的数据包转发到ppp0接口。
先检查当前状态:
sysctl net.ipv4.ip_forward如果返回
net.ipv4.ip_forward = 0,说明没开启。临时开启(重启后失效):
sysctl -w net.ipv4.ip_forward=1永久开启(重启后依然生效):
编辑/etc/sysctl.conf文件,找到net.ipv4.ip_forward=1这一行,去掉前面的注释符号#,然后执行:sysctl -p让配置立即生效。
2. 验证服务器A和B的路由配置是否生效
- 服务器A这边,你已经添加了
192.168.1.0/24 via 192.168.42.10 dev ppp0,执行ip route show确认这条路由存在,同时用ip link show ppp0检查ppp0接口是否处于UP状态。 - 服务器B这边,你添加的
192.168.1.0/24 via 10.9.96.3 dev enp8s0也要确认存在,执行ip route show就能看到。可以在B上跑个traceroute 192.168.1.1(替换成实际的客户端IP),看数据包是不是能到达服务器A的10.9.96.3地址。
3. 关键:给远程MikroTik添加返回路由
这是很多人容易漏掉的点!现在MikroTik只知道把192.168.1.0/24的流量发给服务器A,但它不知道10.9.96.0/20(服务器B所在的LAN网段)的数据包该怎么返回。
你需要在MikroTik上添加一条静态路由:
/ip route add dst-address=10.9.96.0/20 gateway=192.168.42.1
这条路由的意思是:所有目标是10.9.96.0/20的流量,都发给服务器A的ppp0地址(192.168.42.1),这样MikroTik收到服务器B的数据包后,才能正确返回。
4. 排查反向路径过滤(可选)
如果上面几步都做了还是不通,检查服务器A的反向路径过滤设置,这个可能会阻止跨接口的转发:
- 检查当前状态:
sysctl net.ipv4.conf.all.rp_filter - 如果返回
1,临时关闭测试:
如果关闭后能通了,就把这个配置永久写到sysctl -w net.ipv4.conf.all.rp_filter=0/etc/sysctl.conf里。
5. 用tcpdump验证数据包流向
可以在服务器A上抓包,确认数据包的走向:
- 查看是否收到来自服务器B的数据包:
tcpdump -i enp8s0 host 10.9.96.4 and host 192.168.1.x - 查看是否转发到ppp0接口:
tcpdump -i ppp0 host 192.168.42.10 and host 192.168.1.x
如果能看到数据包从enp8s0进来,却没从ppp0出去,那大概率是IP转发没开;如果ppp0有出去的数据包但没返回,那就是MikroTik的路由没配置对。
备注:内容来源于stack exchange,提问作者Emiliano Spada




