必须开启IP转发(net.ipv4.ip_forward=1),否则所有NAT规则无效;需永久配置并执行sysctl -p,验证输出为“net.ipv4.ip_forward = 1”,同时正确配置MASQUERADE规则、FORWARD链放行及客户端网关指向。

ip_forward 必须为 1,否则所有 NAT 规则都无效——这是 90% 的“配完了却上不了网”问题的根源。
确认并开启内核 IP 转发
IP 伪装(MASQUERADE)本质是源地址转换,但前提是 Linux 内核允许转发数据包。不开启它,iptables 或 firewalld 的 NAT 规则根本不会触发。
- 临时开启:
sysctl -w net.ipv4.ip_forward=1 - 永久生效:编辑
/etc/sysctl.conf,确保该行存在且未被注释:net.ipv4.ip_forward = 1 - 验证是否生效:
sysctl net.ipv4.ip_forward输出必须是net.ipv4.ip_forward = 1 - 常见错误:改了
/etc/sysctl.conf却忘了执行sysctl -p或重启,导致配置没加载
用 iptables 配置 MASQUERADE(绕过 firewalld 管理)
适合 firewalld 被禁用、最小化系统(如某些 CentOS 7 minimal)、或需要快速验证的场景。规则直击底层,不依赖 zone 逻辑。
- 基础命令:
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE,其中eth0必须是真实外网出口(如ens33、ppp0),填错接口名会导致规则无效果 - 若只允许特定内网段出网,加
-s 192.168.1.0/24限定源:iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE - 必须放行 FORWARD 链,否则包在 filter 表就被丢弃:
iptables -I FORWARD -i ens160 -o eth0 -j ACCEPT(ens160是内网口) - 动态 IP 场景(如 PPPoE、DHCP 获取的公网 IP)只能用
MASQUERADE,不能用SNAT --to-source——后者要求 IP 固定
用 firewalld 配置 masquerade(推荐用于 RHEL/CentOS 7+ 默认环境)
firewalld 的 masquerade 功能等价于 iptables 的 MASQUERADE,但依赖 zone 和接口绑定逻辑,配置错 zone 就会失效。
- 外网接口(如
ens36)必须加入externalzone:firewall-cmd --permanent --zone=external --add-interface=ens36 - 内网接口(如
ens160)建议加入internalzone:firewall-cmd --permanent --zone=internal --add-interface=ens160 - 启用 masquerade:
firewall-cmd --permanent --zone=external --add-masquerade -
必须 reload 才生效:
firewall-cmd --reload;不带--permanent的操作在 reload 后丢失 - 验证:
firewall-cmd --zone=external --query-masquerade应返回yes;firewall-cmd --get-zone-of-interface=ens36应返回external
内网客户端要能上网,还得配对网关和 DNS
NAT 网关配好了,但客户端如果没设对,照样上不了网。这不是服务端问题,但常被忽略。
- 客户端默认网关必须指向 NAT 主机的内网 IP(如
192.168.1.1),不是外网 IP - DNS 必须可解析:要么直接填公共 DNS(如
8.8.8.8),要么让 NAT 主机自己跑 DNS 转发(如 dnsmasq)并把客户端 DNS 指向网关 - 测试连通性顺序:先
ping 网关 IP→ 再ping 外网 IP(如 114.114.114.114)→ 最后curl https://baidu.com;若前两步通、第三步超时,大概率是 DNS 或 HTTPS 走不通(比如防火墙拦截了 outbound 443)


















