iptables端口转发必须配齐四步:开启ip_forward、添加prerouting dnat规则、放行forward链、配置postrouting masquerade,缺一不可;否则现象为“能握手但无响应”。

iptables端口转发必须配齐这四步
只加一条 iptables -t nat -A PREROUTING 规则,99% 的情况连不上。真正生效要同时满足:内核转发开启、DNAT 地址转换、FORWARD 链放行、POSTROUTING 源地址伪装。漏任何一环,现象都是“能握手但无响应”。
- 临时开启转发:
echo 1 > /proc/sys/net/ipv4/ip_forward;永久生效需写入/etc/sysctl.conf并运行sysctl -p - 添加 DNAT(目标是内网服务):
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.100:80 - 放行 FORWARD 流量(关键!默认策略常为 DROP):
iptables -A FORWARD -p tcp -d 192.168.1.100 --dport 80 -j ACCEPT - 加 MASQUERADE(否则返回包源 IP 是私网地址,外网收不到):
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE
常见错误:用 curl 127.0.0.1:8080 测试 DNAT —— 本地回环不走 PREROUTING,得用真实外网 IP 或另一台机器测。
firewall-cmd 端口转发容易卡在 masquerade
firewall-cmd --add-forward-port 命令本身不触发 IP 伪装,而端口转发依赖它。没开 masquerade,内网服务回包时源 IP 还是 192.168.x.x,公网客户端根本无法路由回来。
- 必须显式启用伪装:
firewall-cmd --permanent --add-masquerade,再firewall-cmd --reload - 确认当前 zone(如
public)已激活:firewall-cmd --get-active-zones - 添加转发规则(例如把本机 2222 转到内网 192.168.2.5:22):
firewall-cmd --permanent --add-forward-port=port=2222:proto=tcp:toaddr=192.168.2.5:toport=22 - 规则加了
--permanent但没--reload,等于没配 —— reload 才真正载入规则
注意:toaddr 可省略,此时默认转发到本机;但只要指定了 toaddr,就必须开 masquerade,哪怕目标是同一台机器的另一个 IP。
宝塔Linux面板11.8.1为官网当前正式版,新增AI建站能力并经过宝塔网站工程师深度调教,开放自定义AI功能API,同时对WAF进行界面重构和深度优化,提升拦截能力与运维效率。
本地端口重定向别用 DNAT
想把访问本机 80 的请求转到本机 8080?别碰 PREROUTING + DNAT,那是给跨主机用的。本地流量走的是 OUTPUT 链,要用 REDIRECT。
- 正确做法:
iptables -t nat -A OUTPUT -p tcp --dport 80 -j REDIRECT --to-port 8080 - 如果还要支持
curl localhost:80,得额外加一条 loopback 规则:iptables -t nat -I OUTPUT -o lo -p tcp --dport 80 -j REDIRECT --to-port 8080 - 误用
PREROUTING的后果:本地测试全失败,只有从外部访问本机 IP 才生效 —— 这不是你要的效果
另外,确保目标服务监听 0.0.0.0:8080 而非 127.0.0.1:8080,否则 REDIRECT 后连接会被拒绝。
转发不通时优先查这三处
别一上来就删规则重试。先看最可能卡住的地方:
- 检查
ip_forward是否真开启:sysctl net.ipv4.ip_forward输出必须是1,不是0 - 确认
FORWARD链没被更早的规则拦截:iptables -L FORWARD -n --line-numbers,找是否有REJECT或DROP在你ACCEPT规则之前 - 验证目标服务是否可达且监听正确地址:
telnet 192.168.1.100 80从转发机上执行,失败说明服务本身问题,不是 iptables 配置问题
真正麻烦的点往往不在规则语法,而在链路完整性 —— 数据进得来、出不去、回不来,每一段都得单独验证。










