IPTables 端口转发自动化脚本
你可以将以下代码保存为 forward.sh,方便后续管理。
#!/bin/bash
# 转发服务器的本地端口
LOCAL_PORT=999
# 目标服务器的 IP
REMOTE_IP="8.8.8.8"
# 目标服务器的端口
REMOTE_PORT=22
echo "正在配置端口转发: 本机:$LOCAL_PORT -> $REMOTE_IP:$REMOTE_PORT"
#1. 开启系统内核转发
sysctl -w net.ipv4.ip_forward=1 > /dev/null
#2. 清理可能存在的旧规则(根据端口和目标IP精确删除)
iptables -t nat -D PREROUTING -p tcp --dport $LOCAL_PORT -j DNAT --to-destination $REMOTE_IP:$REMOTE_PORT 2>/dev/null
iptables -D FORWARD -p tcp -d $REMOTE_IP --dport $REMOTE_PORT -j ACCEPT 2>/dev/null
iptables -t nat -D POSTROUTING -p tcp -d $REMOTE_IP --dport $REMOTE_PORT -j MASQUERADE 2>/dev/null
#3. 插入新规则到第一行 (解决 Docker 冲突关键)
#NAT 入站转换
iptables -t nat -I PREROUTING 1 -p tcp --dport $LOCAL_PORT -j DNAT --to-destination $REMOTE_IP:$REMOTE_PORT
#转发链放行
iptables -I FORWARD 1 -p tcp -d $REMOTE_IP --dport $REMOTE_PORT -j ACCEPT
#允许已建立连接的包回流 (常用全局规则)
iptables -I FORWARD 1 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
#本机入站放行 (防止某些环境下INPUT拦截)
iptables -I INPUT 1 -p tcp --dport $LOCAL_PORT -j ACCEPT
#出站伪装 (确保回包路径)
iptables -t nat -I POSTROUTING 1 -p tcp -d $REMOTE_IP --dport $REMOTE_PORT -j MASQUERADE
echo "转发设置完成!"
echo "请确保云服务器安全组已放行端口: $LOCAL_PORT"
脚本说明
- 优先级 (PREROUTING 1):Docker 会在 nat 表里插入很多规则。使用 -I 1(Insert at position 1)可以确保转发规则在 Docker 逻辑运行之前拦截并处理流量。
- 转发链 (FORWARD):配置了 DNAT,流量就不再进入 INPUT 链(那是给本机进程用的,比如 nc),而是进入 FORWARD 链。系统默认 FORWARD DROP,所以必须在第一行显式允许流量流向目标 IP。
- 回包伪装 (MASQUERADE):这是为了“欺骗”目标机。让目标机以为是转发服务器在访问它,这样它就会把包回给转发服务器,再由转发服务器转交给客户端。
使用方法
- 保存脚本:vi forward.sh
- 赋予权限:chmod +x forward.sh
- 执行脚本:./forward.sh
如何持久化(重启不丢失)?
- iptables 命令执行后是即时生效的,但重启服务器会重置。
- CentOS/RHEL:
service iptables save或iptables-save > /etc/sysconfig/iptables - Ubuntu/Debian: 安装工具
apt install iptables-persistent,然后执行netfilter-persistent save

