firewalld开启masquerade即启用snat,需确保ip转发开启、外网接口加入external zone、执行--permanent和reload,且内网主机正确配置网关与dns。

firewalld 里开 masquerade 就是 NAT
firewalld 的 masquerade 功能本质就是源 NAT(SNAT),它自动把内网流量的源 IP 替换为外网接口的 IP,不需要手动写 iptables 规则。很多人卡在“开了 masquerade 却上不了网”,其实根本原因是没配对 zone 和接口,或者没 reload。
常见错误现象:firewall-cmd --zone=external --query-masquerade 返回 no;firewall-cmd --get-zone-of-interface=ens36 显示 no zone;内网 ping 外网通但 curl https://baidu.com 超时。
- 必须用
--permanent参数加接口到 zone,临时操作(不带--permanent)在 reload 后会丢失 - 外网接口(如
ens36)要进external区域,不能进public或默认default区域——只有external默认允许 masquerade - 内网接口(如
ens160)推荐进internal区域,它默认放行来自内网的连接,比trusted更安全 - 执行
firewall-cmd --reload是必须步骤,否则--add-masquerade不生效
iptables -t nat -A POSTROUTING -j MASQUERADE 是等效替代
如果你不用 firewalld,或者 firewalld 被禁用/卸载了,直接走 iptables 更底层、更可控。这条命令和 firewalld 的 masquerade 效果一致,但绕过了 zone 管理逻辑,适合调试或嵌入式环境。
使用场景:CentOS 7 默认启 firewalld,但某些最小化安装可能只留 iptables;RHEL 8+/Fedora 默认用 nftables,但 iptables 命令仍兼容(实际调用 nft 后端)。
-
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE中的eth0必须是真实外网出口,不能填错成内网口 - 如果外网口 IP 是动态获取(比如 DHCP 或 PPPoE),务必用
MASQUERADE,别用SNAT --to-source——后者需要固定 IP - 这条规则只管“出去的包”,你还得确保内核转发开启:
echo 1 > /proc/sys/net/ipv4/ip_forward,且写入/etc/sysctl.conf持久化 - 别漏掉 FORWARD 链放行,否则包卡在 filter 表:
iptables -I FORWARD -i ens160 -o ens36 -j ACCEPT
IP 转发没开,NAT 规则全是摆设
所有 NAT 配置的前提是内核允许 IP 转发。这是最常被忽略的一步,90% 的“配置完了却不通”问题都出在这儿。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
验证方法:sysctl net.ipv4.ip_forward 输出必须是 net.ipv4.ip_forward = 1;如果输出 = 0,说明没开。
- 临时开启:
sysctl -w net.ipv4.ip_forward=1 - 永久生效:编辑
/etc/sysctl.conf,确保有net.ipv4.ip_forward = 1这一行(不要带#注释) - 改完后运行
sysctl -p加载,不是重启才生效 - 某些发行版(如 Ubuntu Server 22.04+)默认关闭 IPv6 转发,如果用了 IPv6 内网,还得加
net.ipv6.conf.all.forwarding = 1
内网主机网关和 DNS 必须指向 Linux 网关机
NAT 配置再正确,内网主机自己没配对网关和 DNS,照样上不了网。这不是 Linux 主机的问题,而是终端配置遗漏。
典型错误:内网主机 ip route show 显示默认路由是 via 192.168.10.1 dev eth0,但 192.168.10.1 并不是你 Linux 网关的内网 IP;或者能 ping 通网关 IP,但 nslookup baidu.com 超时。
- 确认 Linux 网关内网口 IP(比如
ens160的 IP 是192.168.10.1),内网主机的默认网关必须设成这个地址 - DNS 推荐设成网关本机(即
192.168.10.1),前提是已装dnsmasq或bind;否则直接填运营商 DNS(如114.114.114.114) - 检查内网主机是否启用了多个默认路由(比如同时有 Wi-Fi 和有线),会导致流量走错路径
- 测试顺序建议:先
ping 192.168.10.1→ 再ping 223.5.5.5(阿里 DNS)→ 最后curl -v https://baidu.com
真正麻烦的不是命令记不住,而是每个环节都依赖前一个环节成立:IP 转发关了,firewalld 的 masquerade 就没意义;masquerade 没开,iptables 规则就白写;网关配错了,前面全对也连不上。建议按“转发 → 接口 zone → masquerade → 内网主机配置”这个顺序逐项验证,别跳步。










