Linux端口映射必须开启IPv4转发并配置完整iptables规则链:先启用ip_forward(临时或永久),再配置PREROUTING DNAT、放行FORWARD链、设置POSTROUTING SNAT/MASQUERADE,缺一不可。

必须开启 IPv4 转发
端口映射不是单纯加几条 iptables 规则就能生效的。内核必须允许转发非本机目的地址的数据包,否则所有跨主机流量在进入网络栈早期就被丢弃,连错误提示都没有,只会显示“Connection refused”或无响应。
临时启用:
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 才算真正开启。
配置 PREROUTING DNAT 规则
这是端口映射的核心动作——把进来的流量目标地址和端口改写成内网服务的真实地址。
- 命令格式:iptables -t nat -A PREROUTING -p tcp --dport [外网端口] -j DNAT --to-destination [内网IP]:[内网端口]
- 如果服务器有多个网卡(如公网 ens33、内网 ens34),强烈建议加上 -i ens33 明确入口,避免规则误触发
- --to-destination 后的 IP 必须能被本机路由到达(比如同子网,或已配静态路由)
- 别用 REDIRECT 替代 DNAT:前者只适用于本机进程或回环流量,跨主机转发必须用 DNAT
放行 FORWARD 链流量
DNAT 只改目标地址,不决定是否放行。数据包随后进入 FORWARD 链,若此处无匹配规则且默认策略是 DROP(生产环境常见),包就静默丢失。
- 基础放行(不推荐用于生产):iptables -A FORWARD -p tcp -d [内网IP] --dport [内网端口] -j ACCEPT
- 更安全写法(绑定接口):iptables -A FORWARD -i ens33 -o ens34 -p tcp -d [内网IP] --dport [内网端口] -j ACCEPT
- 务必加上状态跟踪规则,保障 TCP 连接能完成三次握手:iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
设置 POSTROUTING SNAT 或 MASQUERADE
内网服务响应时,源 IP 是内网地址,外网客户端无法识别或路由回包。必须做源地址转换,让回程流量经由防火墙返回。
- 双网卡场景(明确出口网卡):iptables -t nat -A POSTROUTING -o ens33 -j MASQUERADE
- 单网卡或动态 IP 场景,直接用 MASQUERADE 更稳妥
- 若出口固定且需精确控制,可用 SNAT:iptables -t nat -A POSTROUTING -s [内网网段] -o ens33 -j SNAT --to-source [公网IP]


















