Linux环境下通过VPN实现两个局域网互通的iptables规则配置咨询
Linux环境下通过VPN实现两个局域网互通的iptables规则配置咨询
老兄,你这个场景我之前折腾过好几次,核心就是要配置**源地址转换(SNAT)**和放行必要的转发规则——毕竟你已经把IP转发和路由都搞定了,差的就是iptables这临门一脚。我给你分节点一步步说清楚:
客户端A(192.168.5.5 / 10.0.0.5)的规则
假设你的本地局域网接口是eth0,VPN隧道接口是tun0(如果是PPTP这类可能是ppp0,自己用ip addr确认下),执行以下命令:
- 放行VPN到本地局域网、本地局域网到VPN的转发流量:
iptables -A FORWARD -i tun0 -o eth0 -s 10.0.0.0/24 -d 192.168.5.0/24 -j ACCEPT iptables -A FORWARD -i eth0 -o tun0 -s 192.168.5.0/24 -d 192.168.10.0/24 -j ACCEPT
- 配置SNAT,让本地局域网机器访问B的局域网时,源地址替换成A的VPN地址(不然B那边的回包找不到路):
iptables -t nat -A POSTROUTING -o tun0 -s 192.168.5.0/24 -d 192.168.10.0/24 -j SNAT --to-source 10.0.0.5
客户端B(192.168.10.10 / 10.0.0.10)的规则
和A的逻辑完全对称,只是把网段反过来:
- 放行转发流量:
iptables -A FORWARD -i tun0 -o eth0 -s 10.0.0.0/24 -d 192.168.10.0/24 -j ACCEPT iptables -A FORWARD -i eth0 -o tun0 -s 192.168.10.0/24 -d 192.168.5.0/24 -j ACCEPT
- 配置SNAT:
iptables -t nat -A POSTROUTING -o tun0 -s 192.168.10.0/24 -d 192.168.5.0/24 -j SNAT --to-source 10.0.0.10
VPN服务器(10.0.0.1)的规则
需要允许两个客户端的VPN流量互相转发,毕竟所有VPN流量都要经过服务器中转:
iptables -A FORWARD -i tun0 -o tun0 -s 10.0.0.5/32 -d 10.0.0.10/32 -j ACCEPT iptables -A FORWARD -i tun0 -o tun0 -s 10.0.0.10/32 -d 10.0.0.5/32 -j ACCEPT
如果服务器的iptables默认转发策略是拒绝,你可能还要加一条更宽泛的规则放行整个VPN段的转发:
iptables -A FORWARD -i tun0 -o tun0 -s 10.0.0.0/24 -d 10.0.0.0/24 -j ACCEPT
额外注意事项
- 确认每个节点的IP转发已经永久生效:编辑
/etc/sysctl.conf,把net.ipv4.ip_forward改成1,然后执行sysctl -p生效。 - 如果用了
firewalld或者ufw这类防火墙管理工具,要么把上述规则导入到对应工具里,要么临时关闭工具测试(避免规则冲突)。 - 测试时可以在A的局域网机器ping B的局域网机器,用
iptables -L -v和iptables -t nat -L -v查看规则是否有匹配的流量,方便排查问题。
备注:内容来源于stack exchange,提问作者is_this_taken




