关键不是“打开端口”,而是构建完整nat路径:必须同时开启ip转发、启用masquerade、添加带toaddr/toport的转发规则、确保区域与接口匹配。

要将外网流量通过 Firewalld 转发到内网服务器的非标准端口(比如外网 8080 → 内网 192.168.10.5:8081),关键不是“打开端口”,而是构建一条完整、可回溯的 NAT 路径。必须同时满足四个条件:开启 IP 转发、启用伪装、添加转发规则、确保区域与接口匹配。
确认并启用 IPv4 转发
这是整个转发链路的底层前提,缺它则数据包进得来、回不去。
- 临时生效:sudo sysctl -w net.ipv4.ip_forward=1
- 永久生效:向 /etc/sysctl.conf 追加 net.ipv4.ip_forward = 1,再运行 sudo sysctl -p
- 验证是否成功:sysctl net.ipv4.ip_forward 应返回 1
为对应区域启用 masquerade(地址伪装)
伪装功能让内网服务器响应时,源 IP 显示为防火墙本机(而非私有地址),否则外网客户端无法识别回包。
- 查看当前活跃区域:sudo firewall-cmd --get-active-zones(常见如 public 对应外网网卡)
- 对目标区域启用伪装:sudo firewall-cmd --zone=public --add-masquerade --permanent
- 确认已启用:sudo firewall-cmd --query-masquerade --zone=public 应返回 yes
添加带目标地址和端口的转发规则
非标端口转发的核心就是明确指定 toaddr(内网真实 IP)和 toport(非默认端口,如 8081、9001 等)。
- 命令格式:sudo firewall-cmd --permanent --zone=public --add-forward-port=port=8080:proto=tcp:toport=8081:toaddr=192.168.10.5
- 若需限制仅某网段可触发转发,可改用 rich rule:sudo firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="1.2.3.0/24" port port="8080" protocol="tcp" forward-port port="8081" to-addr="192.168.10.5"'
- 务必执行重载:sudo firewall-cmd --reload
验证与排障要点
配置完成后不生效?多数问题出在链路断裂环节。
- 检查规则是否写入:sudo firewall-cmd --list-all --zone=public,确认 forward-ports: 下有对应条目
- 抓包确认 DNAT 是否触发:sudo tcpdump -i ens33 port 8080 -n(替换为外网网卡名),看请求是否抵达且目的端口是否被改写
- 内网服务本身需监听 0.0.0.0:8081(非 127.0.0.1),且其本地防火墙允许该端口入站
- SELinux 若启用,可能拦截转发,测试时可临时设为 permissive:sudo setenforce 0











