Linux 网络地址转换(NAT)是 Linux 内核 netfilter 子系统的重要组成部分,它通过修改数据包的 IP 头部信息来实现网络地址的转换,广泛应用于家庭、企业网络以及云计算环境中,NAT 的核心功能是允许内网中的多台设备通过单个公网 IP 地址访问互联网,同时也能实现服务器端口映射等高级功能,本文将深入探讨 Linux NAT 表的结构、工作原理、配置方法及应用场景。

NAT 的基本概念与作用
网络地址转换(NAT)是一种在 IP 数据包传输过程中重写源 IP 地址或目标 IP 地址的技术,在 Linux 系统中,NAT 主要通过 iptables 或 nftables 工具来实现,其核心作用包括:地址复用,将内网私有 IP 地址转换为公网 IP 地址,节省 IPv4 地址资源;隐藏内网结构,外部网络无法直接访问内网设备,提高网络安全性;负载均衡,通过端口映射将外部请求分发到内网多台服务器;故障转移,结合 keepalived 等工具实现高可用性。
NAT 的实现依赖于三个关键组件:源 NAT(SNAT),修改数据包的源 IP 地址,通常用于内网用户访问互联网;目标 NAT(DNAT),修改数据包的目标 IP 地址,通常用于将外部访问请求转发到内网服务器;端口地址转换(PAT),在 SNAT 或 DNAT 的基础上同时转换端口号,实现多对一的地址映射。
Linux NAT 表的结构与链
Linux 的 NAT 功能主要通过 netfilter 框架中的 nat 表来实现。nat 表与 filter 表、mangle 表、raw 表并列,专注于地址转换相关的操作。nat 表包含五条默认链,每条链负责处理不同网络节点的数据包:
- PREROUTING 链:数据包进入路由决策之前,在此链可以进行 DNAT 操作,修改目标 IP 地址,通常用于端口映射。
- INPUT 链:数据包 destined for 本机,在进入用户空间之前,可用于本机地址转换。
- OUTPUT 链:由本机产生的数据包,在离开本机之前,可进行源或目标地址转换。
- FORWARD 链:数据包需要被路由到其他主机,在此链可以进行 SNAT 或 DNAT,通常用于网关设备。
- POSTROUTING 链:数据包离开本机之前,在此链可以进行 SNAT 操作,修改源 IP 地址,通常用于内网用户上网。
以下是 nat 表各链的典型应用场景:
| 链名称 | 触发时机 | 典型操作 | 应用场景示例 |
|---|---|---|---|
| PREROUTING | 数据包进入路由前 | DNAT(目标地址转换) | 外部访问内网 Web 服务器 |
| INPUT | 数据包 destined for 本机 | DNAT/SNAT | 本机服务地址转换 |
| OUTPUT | 本机产生的数据包 | SNAT/DNAT | 本机访问外部地址转换 |
| FORWARD | 数据包转发到其他主机 | SNAT/DNAT | 内网用户通过网关上网 |
| POSTROUTING | 数据包离开本机前 | SNAT(源地址转换) | 内网私有 IP 转换为公网 IP |
NAT 的核心原理与数据包流程
理解 NAT 的工作原理需要结合数据包在 Linux 系统中的完整生命周期,以典型的内网用户通过网关访问互联网为例,数据包流程如下:

- 内网用户发送数据包:内网主机(如 192.168.1.100)访问公网服务器(如 8.8.8.8),数据包源 IP 为 192.168.1.100,目标 IP 为 8.8.8.8。
- PREROUTING 链处理:数据包到达网关,
PREROUTING链检查目标 IP,若非本机则进入路由决策。 - 路由决策与 FORWARD 链:路由表确定数据包需要转发,数据包进入
FORWARD链,此时可进行防火墙规则过滤。 - POSTROUTING 链处理:数据包即将离开网关,
POSTROUTING链执行 SNAT 操作,将源 IP 从 192.168.1.100 转换为公网 IP(如 203.0.113.10),同时记录连接跟踪(conntrack)信息。 - 公网通信:公网服务器看到的数据包源 IP 为 203.0.113.10,响应数据包目标 IP 为 203.0.113.10。
- 响应数据包返回:网关收到响应数据包,通过
PREROUTING链查询 conntrack 表,发现是之前建立的连接,执行反向 DNAT,将目标 IP 从 203.0.113.10 恢复为 192.168.1.100,再通过路由转发到内网主机。
连接跟踪(conntrack)是 NAT 的关键技术,它维护一个连接状态表,记录每个连接的源/目标 IP、端口等信息,确保双向通信的正确性,当连接结束时,conntrack 表会自动清理条目。
NAT 的配置与实战
Linux NAT 的配置主要通过 iptables 命令实现,以下为典型配置示例:
启用 IP 转发
首先需要启用 Linux 内核的 IP 转发功能:
echo 1 > /proc/sys/net/ipv4/ip_forward # 或永久修改 /etc/sysctl.conf 文件,添加 net.ipv4.ip_forward=1
配置 SNAT(内网用户上网)
假设内网网段为 192.168.1.0/24,公网 IP 为 203.0.113.10:
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 203.0.113.10 # 或使用 MASQUERADE(适用于动态公网 IP) iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
配置 DNAT(端口映射)
假设将公网 203.0.113.10 的 80 端口映射到内网 192.168.1.100 的 8080 端口:

iptables -t nat -A PREROUTING -i eth0 -d 203.0.113.10 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.100:8080
配置端口转发(FORWARD 链)
DNAT 后需允许 FORWARD 链的数据包通过:
iptables -A FORWARD -d 192.168.1.100/32 -p tcp --dport 8080 -j ACCEPT iptables -A FORWARD -s 192.168.1.100/32 -p tcp --sport 8080 -j ACCEPT
NAT 的应用场景与注意事项
典型应用场景
- 家庭/企业网络共享上网:通过路由器或 Linux 网关实现多台设备共享单一公网 IP。
- 服务器部署:将公网 IP 的不同端口映射到内网服务器的不同端口,实现 Web、FTP、SSH 等服务的外部访问。
- 云服务器多 IP 管理:通过 DNAT 为云主机提供多个虚拟 IP 地址,灵活分配服务资源。
注意事项
- 性能影响:NAT 会增加 CPU 和内存开销,在高并发场景下需优化硬件配置。
- 协议兼容性:部分协议(如 FTP、SIP)的报文包含 IP 地址信息,需配合
conntrack协议助手(如nf_conntrack_ftp)处理。 - 安全性:NAT 虽能隐藏内网结构,但不能替代防火墙,需结合
filter表的规则限制非法访问。 - IPv6 兼容性:Linux NAT 功能主要针对 IPv4,IPv6 环境推荐使用无状态地址转换(SIIT)或 NAT64/DNS64 技术。
Linux NAT 表是网络地址转换功能的核心实现,通过 PREROUTING、POSTROUTING 等链的灵活配置,实现了 SNAT、DNAT 等多种转换方式,它在网络共享、服务部署、安全隔离等方面发挥着不可替代的作用,掌握 NAT 表的结构、原理及配置方法,对于 Linux 系统管理员和网络工程师而言至关重要,在实际应用中,需根据场景需求选择合适的转换类型,并注意性能优化与安全性配置,以确保网络的稳定与高效运行,随着 IPv6 的普及,NAT 技术也将不断演进,但其核心思想——通过地址转换解决网络资源分配问题——仍将在未来网络架构中占据重要地位。
















