You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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服务器,再转交给客户端。

额外必须做的检查

  1. 确认L2TP客户端网段:不知道的话,在IN服务器上跑ip addr看ppp开头的接口(比如ppp0),或者查看L2TP配置文件里的地址池(比如/etc/ppp/options.xl2tpd)。
  2. 打开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
    
  3. 确认OUT服务器的IP转发已开启:你提到已经开了,这很重要,否则OUT服务器收到流量后没法转发到外网。

备注:内容来源于stack exchange,提问作者Arian Noshirvani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.20 07:07:58