firewall-cmd --add-forward-port 必须配合启用 masquerade 和开启 ipv4 转发才能生效;缺一将导致 https 等 tcp 流量静默失败,且需 --permanent 加 --reload 才真正加载规则。

firewall-cmd --add-forward-port 必须配合 IP 伪装
端口转发在 firewalld 中不会生效,除非对应 zone 已启用 masquerade。这不是可选项,是内核级依赖:没有地址伪装,Netfilter 就无法完成 DNAT/SNAT 链路闭环。
常见错误现象是执行了转发命令但流量完全无响应,firewall-cmd --list-all 显示规则存在,却查不到任何包计数 —— 八成没开伪装。
-
firewall-cmd --zone=public --add-masquerade --permanent(务必加--permanent) - 确认开启:
firewall-cmd --zone=public --query-masquerade返回yes - 如果用的是非
publiczone(比如external),所有命令都要显式指定--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 的操作只是写入 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 查询可能成功 —— 这类问题排查起来特别隐蔽











