如何修改iptables脚本实现客户端经L2TP连接境内服务器后流量转发至境外服务器
如何修改iptables脚本实现客户端经L2TP连接境内服务器后流量转发至境外服务器
兄弟,我完全懂你现在的困境——境内普通网络把VPN卡得没法用,还好商用线路的IN服务器还能和境外的OUT服务器正常通信,想让客户端通过L2TP连到IN服务器后,所有流量都中转到OUT服务器对吧?你之前的脚本有几个逻辑问题,导致没生效,我给你改改,顺便说清楚为什么这么改:
先理清楚原脚本的问题
- PREROUTING规则逻辑错误:你原来写的
--dport "${IN_server}"是把目标端口设成IN服务器的IP,这完全不符合逻辑,应该匹配的是L2TP客户端发过来的流量,而非某个不存在的端口。 - 仅针对特定端口转发:你要的是所有流量都走OUT服务器,但原脚本只处理了22和11111端口,其他流量根本没被转发。
- SNAT规则范围太窄:原脚本只针对发往OUT服务器特定端口的流量做SNAT,没法覆盖所有返回的流量,导致客户端收不到响应。
修改后的脚本(根据实际情况替换参数)
#!/bin/bash set -x set -e # 请根据你的实际环境修改以下参数 OUT_SERVER_IP="2.2.2.2" # 境外OUT服务器的公网IP L2TP_CLIENT_SUBNET="10.0.0.0/24" # L2TP给客户端分配的网段(必须准确!) IN_SERVER_PUB_IP="1.1.1.1" # 境内IN服务器用于访问OUT服务器的公网IP # 1. 开启IP转发(必须步骤) echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward # 2. 清空nat表的旧规则(避免和之前的规则冲突,可选但建议) sudo iptables -t nat -F PREROUTING sudo iptables -t nat -F POSTROUTING # 3. 把L2TP客户端的所有TCP/UDP流量转发到OUT服务器 sudo iptables -t nat -A PREROUTING -s "${L2TP_CLIENT_SUBNET}" -p tcp -j DNAT --to-destination "${OUT_SERVER_IP}" sudo iptables -t nat -A PREROUTING -s "${L2TP_CLIENT_SUBNET}" -p udp -j DNAT --to-destination "${OUT_SERVER_IP}" # 4. 对发往OUT服务器的流量做SNAT,确保返回的流量能回到IN服务器 sudo iptables -t nat -A POSTROUTING -d "${OUT_SERVER_IP}" -p tcp -j SNAT --to-source "${IN_SERVER_PUB_IP}" sudo iptables -t nat -A POSTROUTING -d "${OUT_SERVER_IP}" -p udp -j SNAT --to-source "${IN_SERVER_PUB_IP}" # (可选)如果需要转发ICMP流量(比如ping),取消下面两行的注释 # sudo iptables -t nat -A PREROUTING -s "${L2TP_CLIENT_SUBNET}" -p icmp -j DNAT --to-destination "${OUT_SERVER_IP}" # sudo iptables -t nat -A POSTROUTING -d "${OUT_SERVER_IP}" -p icmp -j SNAT --to-source "${IN_SERVER_PUB_IP}"
关键修改说明
- 锁定L2TP客户端网段:规则只针对L2TP分配给客户端的网段,不会影响IN服务器自身的其他流量,避免误操作。
- 覆盖所有流量:去掉了特定端口的限制,所有客户端的TCP/UDP流量都会被转发到OUT服务器。
- 修正SNAT逻辑:只要是发往OUT服务器的流量,都用IN服务器的公网IP做源地址,这样OUT服务器返回的流量能准确回到IN服务器,再转交给客户端。
额外必须做的检查
- 确认L2TP客户端网段:不知道的话,在IN服务器上跑
ip addr看ppp开头的接口(比如ppp0),或者查看L2TP配置文件里的地址池(比如/etc/ppp/options.xl2tpd)。 - 打开IN服务器的FORWARD链:默认FORWARD链可能是拒绝的,得允许客户端和OUT服务器之间的流量通行:
sudo iptables -A FORWARD -s "${L2TP_CLIENT_SUBNET}" -d "${OUT_SERVER_IP}" -j ACCEPT sudo iptables -A FORWARD -d "${L2TP_CLIENT_SUBNET}" -s "${OUT_SERVER_IP}" -j ACCEPT - 确认OUT服务器的IP转发已开启:你提到已经开了,这很重要,否则OUT服务器收到流量后没法转发到外网。
备注:内容来源于stack exchange,提问作者Arian Noshirvani
相关产品推荐
相关产品推荐

