iptables端口转发和NAT的核心是开启IP转发+配置nat表PREROUTING/POSTROUTING链+filter表放行流量:先启用ip_forward(临时或永久),再添加DNAT规则将外部端口映射至内网目标,接着在FORWARD链放行该流量,最后用MASQUERADE或SNAT确保返回路径正确。

用 iptables 实现端口转发和 NAT,核心是开启 IP 转发 + 操作 nat 表的 PREROUTING/POSTROUTING 链 + 配合 filter 表放行流量。它不依赖额外软件,但每一步都必须到位,缺一不可。
必须先启用 IP 转发
内核默认关闭路由转发,这是 NAT 生效的前提。
- 临时开启(重启失效):echo 1 > /proc/sys/net/ipv4/ip_forward
- 永久生效:在 /etc/sysctl.conf 中添加 net.ipv4.ip_forward = 1,再执行 sysctl -p
端口转发(DNAT)要配两条规则
仅写一条 DNAT 规则不能通——数据包能进来,但系统默认会丢弃转发流量。
- 第一步:在 nat 表 PREROUTING 链做目的地址转换
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.100:80
(把访问本机 8080 的请求,改目的地为内网 192.168.1.100 的 80 端口) - 第二步:在 filter 表 FORWARD 链放行该转发流量
iptables -A FORWARD -p tcp -d 192.168.1.100 --dport 80 -j ACCEPT
内网共享上网(SNAT/MASQUERADE)
让内网机器通过本机访问外网,关键在于修改出站包的源地址。
- 动态公网 IP(如家用宽带)用 MASQUERADE:
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE - 静态公网 IP 可用 SNAT(更明确):
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 203.0.113.5
常见问题与检查要点
规则写了不通?多半卡在这几个地方:
- IP 转发没开(cat /proc/sys/net/ipv4/ip_forward 应返回 1)
- FORWARD 链默认策略是 DROP,没加 ACCEPT 规则就必然被拦
- DNAT 规则里没指定接口(如 -i eth0),或接口名写错(比如写成 ens33 而不是 eth0)
- 目标主机防火墙(如 192.168.1.100 自身的 iptables)没放开对应端口
- 查看当前 nat 规则:iptables -t nat -vnL;查看转发是否放行:iptables -vnL FORWARD

















