linux 中“端口映射表”实为 iptables nat 表中 prerouting、output、postrouting 链的规则集合,依赖 ip 转发启用、防火墙服务协调及目标端口真实监听三大前提,须按流量路径精准挂载 dnat/redirect/snat 规则,并通过 comment 注释、分段组织与持久化保存保障可维护性。

Linux 系统本身没有内置的“端口映射表”这一独立实体,所谓“映射表”实际是 iptables nat 表中 PREROUTING、OUTPUT 和 POSTROUTING 链上的一组规则集合。它的设计与管理不依赖图形界面或配置文件模板,而是围绕网络数据流向、协议匹配逻辑和 NAT 动作类型展开。规范性体现在规则结构清晰、链路选择准确、转发前提完备、持久化机制可靠。
映射规则必须匹配正确的链路位置
端口映射不是简单写一条“把 A 端口转到 B 地址”,而要依据报文路径决定规则挂载点:
-
外部设备访问本机映射端口(如公网访问服务器 80 → 转发到 8080):用
PREROUTING链 +DNAT或REDIRECT -
本机自己访问映射端口(如 curl http://127.0.0.1:8080 实际连本地 80):必须加
OUTPUT链 +DNAT,否则回环流量不走 PREROUTING -
跨主机转发(网关场景):除
PREROUTING做 DNAT 外,还需POSTROUTING做 SNAT/MASQUERADE,并开放FORWARD链策略
所有映射依赖三个基础前提同时生效
缺一不可,否则规则静默失效:
- 启用 IPv4 转发:
echo 1 > /proc/sys/net/ipv4/ip_forward或在/etc/sysctl.conf中设net.ipv4.ip_forward = 1并执行sysctl -p - 确保底层防火墙服务不冲突:若使用
firewalld,需停用或改用firewall-cmd --add-forward-port;若用iptables,应先systemctl stop firewalld - 目标服务端口真实监听且未被本机其他规则拦截:检查
ss -tlnp | grep :端口号和iptables -L INPUT -n
规则命名与组织建议保持可读性
iptables 本身不支持注释,但可通过以下方式提升可维护性:
- 用
-m comment --comment "web-80-to-8080"在规则末尾添加说明(需加载xt_comment模块) - 按用途分段追加规则,例如先集中处理 Web 类(80/443),再处理 SSH/DB 类,避免混杂
- 删除或修改前先用
iptables -t nat -L -n --line-numbers查看编号,精准操作,避免误删
必须显式持久化,否则重启丢失
iptables 规则默认只存在于内存,关机即清空:
- Debian/Ubuntu 系统:保存为
/etc/iptables/rules.v4,并启用iptables-persistent服务 - RHEL/CentOS 7+:执行
iptables-save > /etc/sysconfig/iptables,确保iptables服务已启用(systemctl enable iptables) - 通用做法:将关键命令写入
/etc/rc.local(注意权限与执行时机),但不如服务化方案健壮
不复杂但容易忽略











