Linux iptables端口转发需四步协同:开启IP转发、配置DNAT规则、放行FORWARD链、添加SNAT/MASQUERADE;缺一不可,否则流量中断或回程失败。

Linux iptables 的 NAT 和端口转发本身不带安全属性,它只是按规则转发流量。安全取决于你是否严格控制谁可以访问、访问什么、从哪来、到哪去——漏掉任意一环,就可能把内网服务直接暴露在公网。
必须开启 IP 转发,但不能只开这个
内核参数 /proc/sys/net/ipv4/ip_forward 是总开关,设为 1 才允许数据包跨接口流转。但仅开启它毫无意义:没有规则,包进不来;有规则但没放行,包在 FORWARD 链就被丢弃;开了转发又没 SNAT/MASQUERADE,回程包源地址仍是私网 IP,客户端收不到响应。
临时启用:
echo 1 > /proc/sys/net/ipv4/ip_forward
永久生效:
编辑 /etc/sysctl.conf,确保含 net.ipv4.ip_forward = 1,再运行 sysctl -p
验证:
cat /proc/sys/net/ipv4/ip_forward 输出 1 即成功
DNAT 规则要精准,避免宽泛匹配
用 iptables -t nat -A PREROUTING 做目的地址转换是核心动作,但写法松散等于开门揖盗:
在无 root/sudo 权限的环境(云容器、VPS、隔离主机)中安装并配置 OpenClaw 浏览器工具的 headless Chrome。适用场景:...
- 务必指定协议和端口:-p tcp --dport 3306,别省略 -p
- 限定入口接口(尤其双网卡):-i ens33,防止规则被内网流量误触发
- 明确目标公网 IP:-d 203.0.113.10,避免匹配到本机其他绑定地址
- 源 IP 限制不能靠“信任”:-s 202.100.1.5 比不加更安全;多个 IP 写多条规则,别用逗号分隔(iptables 不支持)
- 禁止用 REDIRECT 替代 DNAT:它只适用于本机进程发包或 loopback,跨主机转发必须用 DNAT
FORWARD 链不是摆设,必须显式放行
PREROUTING 改完目标地址后,数据包进入 FORWARD 链。若此处无匹配规则且默认策略是 DROP(生产环境应如此),包立刻消失,客户端看到的是 “Connection refused” 或超时,毫无提示。
最小必要放行示例:
iptables -A FORWARD -i ens33 -o ens34 -p tcp -d 192.168.0.80 --dport 3306 -j ACCEPT
同时补上状态跟踪,保障 TCP 连接能完成三次握手:
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
最后加一条兜底拒绝:
iptables -A FORWARD -p tcp -d 192.168.0.80 --dport 3306 -j DROP
SNAT 或 MASQUERADE 是回程关键,不是可选项
内网服务器返回响应时,源 IP 是 192.168.0.80,目的 IP 是客户端公网地址(如 202.100.1.5)。客户端收到私网源地址的包,会直接丢弃——它根本没发过请求给这个地址。
必须做源地址伪装:
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE
或更精确地限定目标:
iptables -t nat -A POSTROUTING -p tcp -d 202.100.1.5 --sport 3306 -j SNAT --to-source 203.0.113.10
注意:MASQUERADE 适合动态 IP 环境,SNAT 更适合固定公网 IP 场景

















