必须同时配置prerouting和output链的redirect规则,并开启ip转发,否则本地curl失败或外部请求静默丢包;prerouting处理外部流量,output处理本地回环及本机ip访问,两者缺一不可。

能直接用,但必须分清“谁访问”和“转发到哪”——本地访问和外部访问走的 iptables 链不同,漏掉 OUTPUT 链会导致 curl http://localhost 失败。
只对外部流量生效:PREROUTING + REDIRECT
这是最常见场景:让别人通过 http://192.168.2.1(不带端口)访问你本机运行在 8080 的服务。规则只处理经过网卡进来的包:
-
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080—— 注意是--to-port(单数),不是--to-ports(网上很多错写成复数,会报错) - 必须开启 IP 转发:
echo 1 > /proc/sys/net/ipv4/ip_forward,否则包进不来就丢了 - 这条规则对
curl http://localhost或curl http://192.168.2.1都有效,但仅限“从网卡进来”的请求;本机进程发起的连接不走 PREROUTING
本地 curl 也想通:补上 OUTPUT 链 DNAT
如果你在本机执行 curl http://localhost 或 curl http://192.168.2.1 却返回 connection refused,说明流量没被重定向——因为本地回环流量不经过 PREROUTING,只走 OUTPUT 链:
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
- 加一条:
iptables -t nat -A OUTPUT -p tcp -d 127.0.0.1 --dport 80 -j REDIRECT --to-port 8080 - 如果还要支持本机 IP 访问(比如
curl http://192.168.2.1),再加:iptables -t nat -A OUTPUT -p tcp -d 192.168.2.1 --dport 80 -j REDIRECT --to-port 8080 - 注意:OUTPUT 链不能用 DNAT 直接改目标 IP(内核限制),
REDIRECT是安全且等效的选择
规则保存和防火墙放行
临时加的规则重启就丢,而且默认 FORWARD 链是 DROP,不显式放行会断连:
- 保存规则(CentOS/RHEL):
service iptables save;Debian/Ubuntu 推荐用iptables-persistent:iptables-save > /etc/iptables/rules.v4 - 确保 FORWARD 链允许转发(即使只是本机 redirect,某些发行版策略也会拦截):
iptables -A FORWARD -p tcp --dport 8080 -j ACCEPT - 检查是否已有冲突规则:
iptables -t nat -L -n -v,确认 PREROUTING 和 OUTPUT 里都有对应条目
为什么不用 DNAT?什么情况下必须用
REDIRECT 只适用于转发到本机其他端口;一旦目标是另一台机器(比如把 80 转到 192.168.1.100:8080),就必须用 DNAT + POSTROUTING MASQUERADE:
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.100:8080-
iptables -t nat -A POSTROUTING -s 192.168.1.100 -j MASQUERADE—— 否则回包路径不对,客户端收不到响应 - 此时
OUTPUT链那套不管用,本地 curl 仍需额外配置,或干脆统一用 socat 做监听代理更可控
最容易被忽略的是 OUTPUT 链缺失导致本地测试失败,以及没开 ip_forward 导致外部请求静默丢包——这两处不验证,规则看起来“加了”,实际根本没生效。










