linux nat网关必须启用ip转发(net.ipv4.ip_forward=1),否则snat/dnat规则无效;需通过sysctl -p或systemd-sysctl持久化,且forward链必须放行流量,masquerade适用于动态ip,snat适用于固定ip多地址场景。

Linux服务器要当NAT网关用,net.ipv4.ip_forward 必须为 1,否则所有转发规则(SNAT、DNAT)都无效——这不是“可选配置”,是硬性前提。
为什么 echo 1 > /proc/sys/net/ipv4/ip_forward 不够用
临时开启确实能让 iptables 规则跑起来,但重启后失效。更关键的是:很多云平台(AWS/Aliyun/Tencent Cloud)在实例启动时会重置内核参数,哪怕你改了 /etc/sysctl.conf,若没显式执行 sysctl -p 或启用 systemd-sysctl,实际运行中仍可能为 0。
验证方式必须用:
sysctl net.ipv4.ip_forward
返回值必须是 net.ipv4.ip_forward = 1,不能只看文件内容或执行过 echo 命令就认为 OK。
- Debian/Ubuntu 系统建议确认
systemd-sysctl服务已启用:systemctl is-enabled systemd-sysctl - CentOS/RHEL 7+ 默认启用,但若手动编辑过
/etc/sysctl.conf,仍需运行sysctl -p - 容器环境(如 Docker host)需额外检查是否被
--sysctl覆盖或 namespace 隔离
iptables FORWARD 链不放行,NAT 就是摆设
POSTROUTING 和 PREROUTING 规则只管地址转换,真正决定“包能不能过”的是 FORWARD 链。常见错误是只配了 NAT 规则,却忘了加 ACCEPT 策略。
典型最小化配置:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT<br>iptables -A FORWARD -i eth0 -o eth1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
注意点:
-
-i和-o接口名必须与实际物理/虚拟接口一致(ip link show确认),别把eth0和ens33搞混 - 云服务器上,若内网服务器回包不经过该网关(非对称路由),
conntrack可能无法匹配,此时需在内网服务器上加静态路由,或改用rp_filter=2(谨慎) - 如果
FORWARD默认策略是DROP,没显式ACCEPT的规则会直接丢弃,连日志都看不到
MASQUERADE vs SNAT:什么时候必须用哪个
MASQUERADE 自动取出口接口的主 IP,适合拨号、DHCP 获取公网 IP 的场景;SNAT --to-source 要求 IP 固定,否则规则失效。
但真实环境中容易踩坑:
- 多 IP 绑定在同一个外网接口(如
eth0有 203.0.113.5/24 和 203.0.113.6/24),MASQUERADE默认只用主 IP,想用副 IP 必须用SNAT --to-source 203.0.113.6 -
MASQUERADE性能略低于SNAT(每次查接口 IP),高并发下差异可测,但一般业务无感 - 某些老旧内核(MASQUERADE 的连接跟踪有 bug,出问题时换
SNAT是第一排查项
云平台源/目的检查(Source/Dest Check)是隐藏杀手
几乎所有主流云厂商(AWS、阿里云、腾讯云)默认开启该检查:只要数据包的源 IP 不等于该实例的主网卡 IP,就直接丢弃。这意味着,哪怕 ip_forward 开了、iptables 规则全对、路由也通,DNAT/SNAT 流量依然进不来/出不去。
解决方法不是改 Linux 配置,而是去云控制台关闭对应网卡的 “源/目的检查”:
- AWS EC2:在 ENI(弹性网卡)详情页 → “源/目标检查” → 设为 “停用”
- 阿里云 ECS:VPC 控制台 → 弹性网卡 → 找到对应网卡 → “管理源/目的检查” → 关闭
- 腾讯云 CVM:私有网络 → 弹性网卡 → 操作列 “修改” → 取消勾选 “启用源/目的检查”
这个开关和 Linux 内核参数、iptables 完全无关,但漏掉它,90% 的 NAT 排错都会卡死在“包明明到了网关,就是没响应”。










