核心是SNAT用于固定出口IP映射,MASQUERADE适配动态IP场景:两者均作用于nat表POSTROUTING链,但SNAT需硬编码公网IP且依赖静态环境,MASQUERADE则自动读取接口实时IP适用于DHCP、PPPoE等动态场景,且必须启用IP转发(临时echo 1 > /proc/sys/net/ipv4/ip_forward或永久配置sysctl.conf)。

iptables 的 NAT 高级配置核心在于精准控制数据包的源地址修改行为——SNAT(源地址转换)用于固定出口 IP 映射,MASQUERADE(地址伪装)则适配动态或未知出口 IP 场景。两者都作用于 nat 表的 POSTROUTING 链,但适用逻辑和触发时机有本质区别。
SNAT:明确指定出口源 IP
适用于网关拥有静态公网 IP 的环境,例如企业出口路由器、云服务器固定弹性 IP 等。规则生效时,所有匹配的数据包源 IP 被强制替换为指定地址,不依赖接口实时地址。
- 语法格式:
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o eth0 -j SNAT --to-source 203.0.113.5 - 必须指定出站接口(
-o)或源网络(-s),避免误改其他流量 - 若出口接口 IP 可能变动(如 DHCP 获取),SNAT 会失效,此时应改用 MASQUERADE
MASQUERADE:自动适配动态出口地址
专为拨号上网、DHCP 分配公网 IP 或虚拟化桥接等场景设计。它在数据包发出前实时读取接口当前 IP,并自动填充为源地址,无需人工维护 IP 变更。
- 语法格式:
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o eth0 -j MASQUERADE - 仅适用于 IPv4;不支持指定端口范围,也不兼容 IPv6
- 性能略低于 SNAT(每次需查询接口地址),但在家庭宽带、移动热点等场景不可替代
关键前提:IP 转发必须启用
NAT 规则本身不转发数据包,只是改写地址。真正实现路由中转,依赖内核的 IP 转发功能。
- 临时开启:
echo 1 > /proc/sys/net/ipv4/ip_forward - 永久生效:在
/etc/sysctl.conf中添加net.ipv4.ip_forward = 1,再执行sysctl -p - 验证是否生效:
sysctl net.ipv4.ip_forward返回值应为1
常见组合与避坑点
实际部署中常需叠加其他规则,注意链顺序和匹配条件冲突:
- 多出口场景下,可结合
-o和-s精确限定某子网走某接口,避免 SNAT 错位 - 若同时配置了 DNAT(如端口映射),SNAT 规则不能覆盖返回流量——POSTROUTING 处理的是“发出方向”,DNAT 的反向映射由连接跟踪(conntrack)自动完成
- 使用
iptables-save保存规则,否则重启后丢失;systemd 环境建议通过iptables-persistent或 service 文件固化

















