【探索Linux】P.45(NAT技能 | NAPT技能)

[复制链接]
发表于 2026-10-3 16:14:13 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×

一、为什么需要 NAT:IPv4 地址不够用了

在上一篇里我们讲了网络层的核心协议——IP 协议,它作为互联网通信的基础,确保数据包能够在复杂的网络环境中从源头传送到目的地。

但互联网的迅猛发展和 IPv4 地址的日益紧张,逼出了一种新的技术:网络地址转换,简称 NAT。

NAT 技术不但缓解了 IP 地址不足的问题,还为网络安全提供了额外的保护——内网结构对公网是不可见的,外部攻击面被压缩到了边界那台 NAT 设备上。

二、NAT 技术:把私网地址换成公网地址

1. 引入背景

IPv4 使用 32 位地址,理论上最多可以提供约 43 亿个地址。随着互联网的爆炸性增长,这个数量远远不能满足全球联网设备的需求。

NAT 技术应运而生,通过允许多台设备共享一个或少数几个公网 IP 地址,有效缓解了这个问题——这就是今天每个家庭路由器都在干的事。

2. 基本原理

NAT 技术通过在网络边界设备上转换数据包的源 IP 地址或目的 IP 地址来工作。当内部网络(私网)的设备与外部网络(公网)通信时,NAT 设备将私网 IP 地址转换为公网 IP 地址。这一过程对于通信的双方是透明的。

举个具体的例子:

内网主机        10.0.0.10
NAT 路由器      202.244.174.37(公网)
外网主机        163.221.120.9

当 10.0.0.10 发送数据到 163.221.120.9 时,通信过程是这样的:

  • 出方向:NAT 路由器把源地址 10.0.0.10 改成一个全局 IP,比如 202.244.174.37。
  • 入方向:收到外部数据时,路由器再把目标 IP 从 202.244.174.37 转换回 10.0.0.10。

关键在路由器内部的地址转换表(NAT 映射表):转换关系是由 NAT 路由器在首次通信时主动创建的——只有内网先发起过一次连接,映射才存在,外部回来的包才有地方可去。

这也解释了一个常见困惑:为什么外网主机不能主动 Ping 进内网——因为映射表是被动建立的,表里没有对应条目,回包就被丢弃了。

3. 主要类型

类型做法能省地址吗
静态 NAT(Static NAT)为内部网络的每台设备设置一个固定的公网 IP 地址映射否(一对一,还占一个公网地址)
动态 NAT(Dynamic NAT)使用一个公网 IP 地址池,动态地为内部设备分配公网 IP有限(池子大小决定并发数)
NAPT网络地址端口转换,多台设备共享单个公网 IP,靠端口号区分会话是(真正解决地址紧缺的那一套)
Easy IP一种简化的 NAPT,通常用于拨号连接,直接使用当前公网的接口地址做转换是

日常说的"家里几百台设备共用一个 IP 上网",实现的就是 NAPT,不是静态 NAT。

4. 技术优势

  • 节省 IP 地址:允许多台设备共享少量的公网 IP 地址。
  • 增强安全性:隐藏内部网络结构,减少外部攻击的风险——公网根本看不到内网有几台机器、用什么地址。
  • 简化网络管理:便于网络管理员管理地址分配和路由策略;内网重新规划网段也不用改公网侧。

5. 技术挑战

  • 应用程序兼容性:某些依赖于 IP 地址的应用(如部分 FTP、语音视频、P2P、主动外连的网关类应用)可能在 NAT 环境下无法正常工作。
  • 网络复杂性:增加了网络设置和管理的复杂性;映射表本身也要占内存。
  • 性能影响:NAT 设备需要处理大量的数据包转换,大并发下可能成为瓶颈。

6. 应用场景

NAT 技术广泛应用于家庭、企业和服务提供商网络中。

  • 家庭:让家庭用户能用单个公网 IP 把手机、电脑、电视、智能家居多台设备连到互联网。
  • 企业:用来优化 IP 地址的使用,同时把内部网络保护在不被外部直接访问的屏障之后。
  • 运营商:大西洋飓风级的 CGNAT(运营商级 NAT)把有限的公网地址再往下一层复用一层,推迟 IPv6 迁移压力。

三、NAPT:多台机器抢一个出口,回包怎么认领

这里是 NAT 最关键、也最容易被讲糊的一个问题。

问题在哪

当多个局域网主机访问同一个外网服务器时,会出现一个问题:服务器返回的数据包目的 IP 地址都一样(都是那个公网出口地址)。那 NAT 路由器怎么区分,并正确地把这些数据包转发给局域网中的特定主机呢?

只靠 IP 地址根本分不清——因为出口地址就那一个。

解法:把端口号也用上

这个问题通过 NAPT(Network Address Port Translation,网络地址端口转换)技术来解决,它也被称为 NAT Overload。

NAPT 不但使用 IP 地址,还结合端口号来创建映射关系。也就是说,NAT 路由器会为每个会话分配一个唯一的端口号,从而确保即便目的 IP 相同,也能根据"IP 地址 + 端口号"的组合正确地识别并转发数据到局域网中的相应主机。

转换前(内网)                转换后(出口)
10.0.0.10:5001   ────────▶  202.244.174.37:40001
10.0.0.10:5002   ────────▶  202.244.174.37:40002
10.0.0.11:5001   ────────▶  202.244.174.37:40003

看到关键点没有:内网各自行号(5001/5002)可能重复,但转换后出口端口各不相同。服务器把响应还给 202.244.174.37:40002,路由器查表就知道该还给人 10.0.0.10:5002。

映射表的生命周期

NAT 路由器主动维护这种基于 IP 地址和端口号的关联关系。具体行为是:

  • 在 TCP 连接的情况下,创建连接时,NAT 路由器会创建相应的表项来记录这种映射关系。
  • 一旦连接断开,相应的表项就会被主动删除,释放资源以供其他会话使用。
  • TCP 有超时机制兜底;UDP 没有"连接"概念,靠老化时间(aging time)回收表项(常见几十秒到几分钟)。

这个过程确保了 NAT 路由器即使在高流量和多个并发连接的情况下,也能有效地管理和转发数据。

由此延伸出的几个常识

  • 端口不够用会失败:理论上一个公网 IP 有 6 万多个可用端口,远大于 IPv4 地址总数,所以"地址不够"在 NAPT 下基本不成问题;真正撑不住的是并发表项数(内存)。
  • 内网往外传可以,外面往里进很难:映射是内网发起时才建的。要让外网主动访问内网服务,得在 NAT 设备上配端口映射/端口转发(端口映射),把某个出口端口固定映射到内网某台机器的某端口。
  • 内网两台机器不能同时占同一组内网 IP:端口对外,这正是 NAT 需要分配新出口端口的原因。

四、部署 NAT 时要注意的三件事

  1. 超时时间要按业务调:长连接(数据库、WebSocket、SSH)如果 NAT 老化时间太短,连接会被静默断开;反之老化时间太长,表项堆积、内存吃紧。很多"每隔一段时间掉线"的问题根子就在 NAT 超时。
  2. 需要外部主动访问的业务必须做端口映射:网站、远程桌面、监控监控摄像头这类服务要提前在边界设备上配好,否则从外网永远连不进来。
  3. Application 层带 IP 的协议要额外处理:像 FTP 的 PASV 模式会在报文里携带 IP,不经 ALG(应用网关)解析就会失败。这类协议在 NAT 后出问题,通常不是"网不通",而是"应用层数据里塞了私网 IP"。

小结

把 NAT 这条线压缩成三句话:

  • NAT 是什么:在边界设备上转换 IP 地址,让多台内网设备共享少量公网地址出网,过程对双方透明。
  • 四种类型:静态 NAT(固定一对一)、动态 NAT(地址池)、NAPT(加端口号,多对一,真正省地址的)、Easy IP(直接用出接口地址,常用于拨号)。
  • NAPT 为什么能工作:映射关系是 "IP + 端口" 二元组,路由器为每个会话分配唯一出口端口,建表在连接建立时、删表在连接断开时;回包靠这张表认领。

理解到这里,再回头看家里的路由器、机房的防火墙策略、"外网访问不了内网服务"这类问题,就都能对上号了。

(本文由 qidao123.com企服评测-应用市场 编辑提示整理:内容对应 Linux 网络编程中"网络层"章节的 NAT / NAPT 部分,示例 IP 为教学用示意地址。)

回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表