很多人在用 iptables 配 NAT 时,命令能抄下来,但一到实际环境就容易混淆:内网机器出网该用哪种转换、端口映射该挂在哪条链、规则为什么写了却不生效。下面按实际配置顺序,把 SNAT、DNAT、IP 转发和规则保存四部分拆开说明,保留原始示例命令,并补足每一步背后的判断依据,方便你照着配也知道为什么这样配。
SNAT:让内网主机以公网地址访问外网
SNAT(源地址转换)的作用,是把内网主机发出的数据包源地址改写成公网地址。典型场景就是一组使用私有地址的内网设备,需要通过网关统一访问外部网络。
例如,内网网段是 192.168.1.0/24,出口公网 IP 是 202.100.100.100。这时要在 nat 表的 POSTROUTING 链上做源地址改写,因为数据包是在离开本机、即将发往外网之前完成地址替换。
示例命令
# 清除现有的SNAT规则
iptables -t nat -D POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 202.100.100.100
# 添加新的SNAT规则
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 202.100.100.100
这里的几个关键参数分别对应明确含义:

-t nat:表示操作的是 NAT 表。POSTROUTING:表示在包离开本机前处理。-s 192.168.1.0/24:限定来源是这个内网网段。-o eth0:限定从eth0这个外网接口发出。-j SNAT --to-source 202.100.100.100:把源地址改写为指定公网 IP。
先删旧规则、再加新规则的写法,适合直接在已有环境里调整,能减少重复规则或历史配置冲突的问题。
DNAT:把公网访问转发到内网服务器
DNAT(目的地址转换)解决的是反向需求:外部访问先到达公网地址,再由网关把目标地址改写成内网服务器地址。最常见的用途就是端口映射,例如把公网 80 端口转发到内网 Web 服务。
假设公网 IP 是 202.100.100.100,内网目标主机是 192.168.1.10,开放端口是 80,那么规则应写在 nat 表的 PREROUTING 链。原因是外部流量刚进入主机时,就要先改写目标地址,之后系统才能把它正确路由到内网主机。
示例命令
# 清除现有的DNAT规则
iptables -t nat -D PREROUTING -d 202.100.100.100 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.10:80
# 添加新的DNAT规则
iptables -t nat -A PREROUTING -d 202.100.100.100 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.10:80
这条规则里同样有几个判断点:

-d 202.100.100.100:表示只处理发往这个公网地址的流量。-p tcp --dport 80:限定协议与目标端口,避免误转发其他业务。--to-destination 192.168.1.10:80:把目标改写到内网服务器的 80 端口。
如果你是在做 Web、SSH 或其他固定端口服务发布,核心思路都是一样的,只需把目标地址、协议和端口按实际情况替换即可。
为什么规则写对了,流量还是不通:别漏掉 IP 转发
很多 NAT 配置失败,并不是规则本身有问题,而是系统没有开启 IP 转发。对于充当网关或转发节点的 Linux 主机来说,这一步不是可选项;如果内核不允许转发,SNAT 和 DNAT 规则即使存在,也无法形成完整的数据通路。
# 编辑sysctl配置文件
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
# 应用配置
sysctl -p
net.ipv4.ip_forward=1 的作用,是开启 IPv4 转发功能;sysctl -p 则用于重新加载配置,使改动立即生效。
如果你已经写好了 NAT 规则,但内网机器仍然不能出网,或者公网流量无法真正进入内网主机,这一项应该优先检查。
规则持久化:重启后不丢配置
iptables 规则默认保存在运行时内存中,系统一旦重启,未持久化的配置就会消失。因此,NAT 调通之后还需要根据发行版保存规则。
Debian/Ubuntu
iptables-sa ve > /etc/iptables/rules.v4
Red Hat/CentOS
service iptables sa ve
不同系统的保存方式并不统一,这也是很多教程里容易一句带过、但线上环境很容易踩坑的地方。实际操作时,按你所使用的发行版选择对应方式即可。
操作时要注意的 3 个关键点
1. 必须使用 root 权限
iptables 直接修改内核网络规则,普通用户通常没有权限执行。若命令报权限相关错误,先确认当前会话是否具备 root 权限。
2. 规则顺序会影响结果
iptables 按顺序匹配规则,先命中的规则会优先生效。所以在已有复杂规则集的机器上新增 NAT 配置时,不只是“写对”就够了,还要确认插入位置是否合理。
3. 持久化方式要看发行版
教程里的保存命令通常带有系统差异,不能直接跨发行版照搬。尤其是 Debian/Ubuntu 与 Red Hat/CentOS,规则保存路径和服务方式并不一样。
如果只看配置逻辑,iptables 中的 NAT 基本可以归纳为两类:内网访问外网时用 SNAT,外网访问内网服务时用 DNAT。再配合开启 IP 转发和规则持久化,这套基础 NAT 配置就能完整跑起来。







