linux防火墙nat端口映射关键在于启用ip转发、配置nat表prerouting链dnat规则、显式放行forward链,并限制源ip、启用连接跟踪与反向路径过滤,最后保存规则防重启丢失。

配置 Linux 防火墙的 NAT 规则实现端口映射,关键在于精准控制流量走向、限制访问来源,并防止规则被绕过。iptables 是最常用且内核原生支持的工具,但默认不带安全防护逻辑,需手动叠加访问控制和状态检查。
明确端口映射类型与链位置
NAT 端口映射主要依赖 nat 表 中的 PREROUTING 链(处理进入本机的外网请求)和 POSTROUTING 链(处理本机发出的流量)。对外提供服务时,只需配置 PREROUTING + FORWARD 即可:
- DNAT 规则必须放在 nat 表的 PREROUTING 链:用于改写目的 IP 和端口,例如把公网 8080 请求转到内网 192.168.1.100:80
- FORWARD 链需放行该连接:DNAT 后数据包会进入转发流程,若 FORWARD 默认 DROP,则必须显式允许
- 不要在 INPUT 链做 DNAT —— INPUT 处理目标为本机的数据包,而端口映射是转发给其他内网设备
添加带源限制的 DNAT 规则
直接开放端口映射等于暴露内网服务,应限定可访问的源 IP 或网段。例如只允许公司办公网(203.0.113.0/24)通过公网 IP 的 2222 端口访问内网 SSH 服务(192.168.1.5:22):
iptables -t nat -A PREROUTING -s 203.0.113.0/24 -p tcp --dport 2222 -j DNAT --to-destination 192.168.1.5:22 iptables -A FORWARD -s 203.0.113.0/24 -d 192.168.1.5 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
- -s 参数限制来源:避免被全网扫描或暴力破解
- --state NEW,ESTABLISHED 确保只放行新建连接及已有会话:拒绝非法状态包
- 若用 conntrack 替代 state 模块(推荐较新内核),可写为
-m conntrack --ctstate NEW,ESTABLISHED
启用连接跟踪与反向路径过滤
Linux 内核的连接跟踪(nf_conntrack)是 DNAT 正常工作的基础;同时开启反向路径过滤(rp_filter)可防御源地址伪造攻击:
- 确认已加载模块:
modprobe nf_conntrack_ipv4(IPv4)或nf_conntrack(通用) - 检查当前 rp_filter 设置:
sysctl net.ipv4.conf.all.rp_filter,建议设为 1(严格模式) - 临时启用:
sysctl -w net.ipv4.conf.all.rp_filter=1;永久生效写入/etc/sysctl.conf - rp_filter 能拦截伪造源 IP 的 SYN 包,降低端口映射被滥用的风险
保存规则并防止重启丢失
iptables 规则是内存态的,系统重启后清空。必须保存并设置开机加载:
- Debian/Ubuntu:
iptables-save > /etc/iptables/rules.v4,并确保iptables-persistent服务已启用 - RHEL/CentOS 7+:
service iptables save或使用iptables-services包 - 务必先测试规则有效性(如用另一台机器 telnet 测试端口),再保存 —— 错误规则可能导致 SSH 断连
- 建议备份原始规则:
iptables-save > /root/iptables-before-nat.bak
端口映射本身不等于安全,它只是打通通道。真正安全靠的是“最小权限原则”:只开必需端口、只允许可信来源、只转给可信内网设备、全程跟踪连接状态。做到这几点,NAT 映射就能既可用又可控。











