firewalld端口转发需同时满足三点:开启内核ip转发、目标区域启用masquerade、添加permanent转发规则并reload生效;缺一不可,否则转发失败。

firewalld 开启端口转发不是加一条命令就完事,关键在三点:内核转发必须打开、目标区域要启用地址伪装、转发规则得用 permanent 模式添加并重载生效。
先确保系统级转发已启用
这是整个转发链路的底层开关,没开的话包进不来就直接丢弃,后续所有规则都无效。
- 临时开启:echo 1 > /proc/sys/net/ipv4/ip_forward
- 永久生效:往 /etc/sysctl.conf 追加 net.ipv4.ip_forward = 1,再运行 sysctl -p
- 验证是否成功:cat /proc/sys/net/ipv4/ip_forward 输出应为 1
确认并启用对应区域的地址伪装(masquerade)
端口转发本质是 DNAT,但内网服务回包时源 IP 是私有地址,外网客户端无法识别。必须靠 masquerade 把回程包的源 IP 替换成防火墙本机公网 IP,否则连接会静默失败。
- 查当前活跃区域:firewall-cmd --get-active-zones,常见为 public 或 external
- 临时启用伪装:firewall-cmd --zone=public --add-masquerade
- 永久启用(推荐):firewall-cmd --permanent --zone=public --add-masquerade
- 检查状态:firewall-cmd --zone=public --query-masquerade 返回 yes 才算生效
添加端口转发规则并重载配置
firewalld 的 --add-forward-port 是封装好的 DNAT 动作,但只写这条不 reload 就不会进内核;且必须指定完整参数,包括协议、源端口、目标地址和端口。
- 示例:把访问本机 2222/tcp 的流量转到内网 192.168.1.100:22
firewall-cmd --permanent --zone=public --add-forward-port=port=2222:proto=tcp:toaddr=192.168.1.100:toport=22 - 本地端口映射(如 80 → 8888)也一样写,toaddr 填本机 IP 或留空(默认本机)
- 添加后必须执行:firewall-cmd --reload,仅 --permanent 不 reload 不生效
- 查看是否加入:firewall-cmd --zone=public --list-forward-ports
验证与排错要点
连不上时别急着删规则,先看这几个硬性条件有没有漏:
- 确认 ip_forward 是 1
- 确认对应 zone 的 masquerade 是 enabled
- 确认 --permanent + --reload 都做了
- 确认目标主机(如 192.168.1.100)能被防火墙 ping 通,且服务本身在监听对应端口
- 如果用了多网卡,建议显式指定 zone 绑定的接口,避免规则匹配错方向











