必须开启firewalld的IP伪装(masquerade)功能,否则内网私有地址无法被外网路由;需将外网接口加入external区域、内网接口加入internal区域,永久启用masquerade并reload,同时开启内核IP转发并确保转发策略正确。

让内网主机通过 Linux 网关共享一个公网 IP 上网,必须开启 firewalld 的 IP 伪装(masquerade)功能,否则内网发出的流量源地址仍是私有地址,外网设备无法正确回包。
确认并分配网络接口到对应区域
先查当前活跃区域和接口归属:firewall-cmd --get-active-zones
若外网接口(如 ens38)未出现在 external 区域中,执行:
firewall-cmd --permanent --zone=external --add-interface=ens38
内网接口(如 ens33)应加入 internal 区域(比 trusted 更安全,且默认放行内网入向):
firewall-cmd --permanent --zone=internal --add-interface=ens33
【必须加 --permanent 参数】,否则 reload 后配置丢失;临时命令仅用于调试,不可用于生产环境。
启用地址伪装并重载规则
方法一:永久启用(推荐)
firewall-cmd --permanent --zone=external --add-masquerade → firewall-cmd --reload
方法二:临时启用(重启 firewalld 后失效)
firewall-cmd --zone=external --add-masquerade → firewall-cmd --reload
验证是否生效:
firewall-cmd --zone=external --query-masquerade
返回 yes 即成功。若返回 no,请立即检查上一步是否漏掉 --permanent 或未执行 --reload。
开启内核 IP 转发
第一步:临时开启(立即生效)
echo 1 > /proc/sys/net/ipv4/ip_forward
第二步:永久写入配置文件
echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf && sysctl -p
这一步不可跳过——没有 IP 转发,伪装规则根本不会触发;90% 的“配置完不通”问题都卡在这里。
检查并补全转发策略
internal 区域默认允许流量转发至 external,但若内网接口被误配在 public 区域,则需手动放行:
firewall-cmd --permanent --zone=public --add-forward-port=port=0-65535:proto=tcp:toport=0-65535
更稳妥的做法是把内网接口改回 internal:
firewall-cmd --permanent --zone=internal --change-interface=ens33
最后再 reload 一次:
firewall-cmd --reload

















