firewalld的ip伪装本质是ipv4源nat,需将外网接口加入external区域、启用masquerade并reload,同时开启内核ip转发、配置内网接口区域及客户端网关。

在 Linux 中配置 firewalld 的 IP 伪装(masquerade),本质是启用 IPv4 源地址 NAT,让内网设备通过防火墙的外网接口共享一个公网 IP 上网。它不是针对某条流量的单独转发,而是作用于整个区域的出向流量——只要流量从该区域的接口发出,源地址就会被自动替换成该接口的 IP。
确认并设置外网接口所属区域
IP 伪装必须在明确分配了外网接口(如 ens38、eth0)的区域上启用,推荐使用 external 区域,因为它默认设计支持伪装:
- 查看当前活跃区域和对应接口:
firewall-cmd --get-active-zones - 检查 external 区域是否已包含你的外网接口:
firewall-cmd --zone=external --list-interfaces - 若未包含,将其加入:
firewall-cmd --zone=external --add-interface=ens38 - 如需永久生效,加
--permanent参数,并在最后执行firewall-cmd --reload
启用并持久化 masquerade 功能
启用后,所有从 external 区域发出的 IPv4 出向流量都会自动做 SNAT:
- 临时启用(重启 firewalld 后失效):
firewall-cmd --zone=external --add-masquerade - 永久启用(写入配置文件):
firewall-cmd --permanent --zone=external --add-masquerade - 重载配置使规则生效:
firewall-cmd --reload - 验证是否成功:
firewall-cmd --zone=external --query-masquerade(返回 yes 即为开启)
确保系统允许 IP 转发与区域间通信
仅开启 masquerade 不够,还需底层转发能力与信任关系:
- 开启内核 IPv4 转发:
echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf && sysctl -p - 内网接口(如 ens33)应归属 trusted 或 internal 区域,这两个区域默认允许流量转发至 external
- 若内网接口在 public 区域,需额外放行转发:
firewall-cmd --permanent --zone=public --add-forward-port=port=any:proto=tcp:toport=any(不推荐,安全性低) - 确认内网主机默认网关指向防火墙的内网 IP(例如 192.168.1.1)
排查常见不通问题
伪装已开但内网仍无法上网,重点检查以下几点:
- 外网接口是否确实在 external 区域(
firewall-cmd --zone=external --list-all) -
sysctl net.ipv4.ip_forward是否返回 1 - 是否有云平台安全组、宿主机 iptables 或其他防火墙拦截回程流量
- IPv6 流量不会被 masquerade 处理(firewalld 不支持 IPv6 masquerade)











