位置:首页 > Shell > iptables 中 NAT 配置方法

iptables 中 NAT 配置方法

时间:2026-08-25  |  作者:骑光打字机  |  阅读:0

目录

  1. SNAT:让内网主机以公网地址访问外网
  2. DNAT:把公网访问转发到内网服务器
  3. 为什么规则写对了,流量还是不通:别漏掉 IP 转发
  4. 规则持久化:重启后不丢配置
  5. 操作时要注意的 3 个关键点

前言

很多人在用 iptables 配 NAT 时,命令能抄下来,但一到实际环境就容易混淆:内网机器出网该用哪种转换、端口映射该挂在哪条链、规则为什么写了却不生效。下面按实际配置顺序,把 SNAT、DNAT、IP 转发和规则保存四部分拆开说明,保留原始示例命令,并补足每一步背后的判断依据,方便你照着配也知道为什么这样配。

很多人在用 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

这里的几个关键参数分别对应明确含义:

SNAT 与 DNAT 在 iptables 中的链路位置对比信息图
SNAT 与 DNAT 的位置区别用一张对比图说明 SNAT 与 DNAT 分别处理哪一侧流量,以及它们对应的链与地址变化。
  • -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

这条规则里同样有几个判断点:

iptables NAT 生效条件与持久化检查项信息图
NAT 生效与保存检查表把 NAT 生效所需的系统条件和重启后保留配置的方法放在一张图里,方便排查。
  • -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 配置就能完整跑起来。

免责声明:文中图文均来自网络,如有侵权请联系删除,心愿游戏发布此文仅为传递信息,不代表心愿游戏认同其观点或证实其描述。

相关文章

更多

精选合集

更多

大家都在玩

热门话题

大家都在看

更多