使用 firewall-cmd --add-forward-port 配置端口转发时,必须同时启用 masquerade(IP 伪装)并开启 IPv4 转发功能,否则 HTTPS 等 TCP 流量通常会出现静默失败;另外,只有结合 --permanent 与 --reload,端口转发规则才会被真正加载并生效。

firewall-cmd --add-forward-port 必须配合 IP 伪装
在 CentOS 7 或其他使用 firewalld 的 Linux 系统中,端口转发并不会默认生效,前提条件是目标 zone 必须启用 masquerade。这不是可选配置,而是实现 NAT 转发所依赖的关键条件:如果没有开启地址伪装,Netfilter 的 DNAT/SNAT 链路就无法完整建立。
很多用户在配置防火墙端口转发时都会遇到这样的问题:明明已经执行了转发命令,外部流量却始终没有反应。即使通过 firewall-cmd --list-all 能看到规则存在,但数据包计数依然为零,这种情况大概率就是没有开启 masquerade。
firewall-cmd --zone=public --add-masquerade --permanent(建议务必加上--permanent)- 确认是否启用成功:
firewall-cmd --zone=public --query-masquerade返回yes - 如果使用的不是
publiczone(例如external),所有 firewalld 命令都应明确指定--zone=xxx - 同时不要忽略内核转发参数:
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf && sysctl -p
端口转发命令的 toaddr 和 toport 参数不能同时省略
--add-forward-port 的命令格式看起来比较灵活,但参数之间其实存在明确限制:如果指定了 toaddr,那么 toport 也必须一并写出;反过来,如果只填写 toport 而不写 toaddr,则表示把请求转发到本机的其他端口。
- 转发到本机其他端口(例如 80 → 8080):
firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080 --permanent - 转发到另一台内网服务器(例如 30306 → 192.168.1.100:3306):
firewall-cmd --add-forward-port=port=30306:proto=tcp:toaddr=192.168.1.100:toport=3306 --permanent - 错误示例:
toaddr=192.168.1.100单独使用 —— 系统会默认沿用源端口(30306),但目标主机上的服务未必监听这个端口
--permanent 不等于立即生效,reload 是硬性步骤
所有带有 --permanent 的 firewalld 操作,只是把规则写入 XML 配置文件(如 /etc/firewalld/zones/public.xml),并不会自动加载到当前运行环境中。如果没有执行 firewall-cmd --reload,这些规则就只是保存在磁盘上的配置内容,并不会真正参与流量转发。
- 先添加转发规则:
firewall-cmd --add-forward-port=... --permanent - 再开放源端口(这一步在端口转发配置中很容易被忽略):
firewall-cmd --add-port=30306/tcp --permanent - 最后执行重载:
firewall-cmd --reload - 验证规则是否已经加载成功:
firewall-cmd --zone=public --list-all | grep forward
UDP 转发和 TCP 转发要分开配置
在 firewalld 中,无法通过一条命令同时处理 TCP 和 UDP 两种协议。即使只是同一个端口需要同时支持这两类流量,也必须分别执行两次 --add-forward-port,并且 proto 参数需要分别设置为 tcp 和 udp。
- 例如放行并转发 DNS 端口时,需要分别执行:
firewall-cmd --add-port=53/tcp --permanent和firewall-cmd --add-port=53/udp --permanent - 对应的端口转发规则也要分别添加:
--add-forward-port=port=53:proto=tcp:toaddr=10.0.0.2:toport=53和--add-forward-port=port=53:proto=udp:toaddr=10.0.0.2:toport=53 - 如果漏掉 UDP,通常会导致 DNS 查询超时,而 TCP 查询可能仍然正常,这类防火墙转发问题往往非常隐蔽,不容易第一时间定位
