马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
一、为什么需要 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 时要注意的三件事
- 超时时间要按业务调:长连接(数据库、WebSocket、SSH)如果 NAT 老化时间太短,连接会被静默断开;反之老化时间太长,表项堆积、内存吃紧。很多"每隔一段时间掉线"的问题根子就在 NAT 超时。
- 需要外部主动访问的业务必须做端口映射:网站、远程桌面、监控
摄像头这类服务要提前在边界设备上配好,否则从外网永远连不进来。
- Application 层带 IP 的协议要额外处理:像 FTP 的 PASV 模式会在报文里携带 IP,不经 ALG(应用网关)解析就会失败。这类协议在 NAT 后出问题,通常不是"网不通",而是"应用层数据里塞了私网 IP"。
小结
把 NAT 这条线压缩成三句话:
- NAT 是什么:在边界设备上转换 IP 地址,让多台内网设备共享少量公网地址出网,过程对双方透明。
- 四种类型:静态 NAT(固定一对一)、动态 NAT(地址池)、NAPT(加端口号,多对一,真正省地址的)、Easy IP(直接用出接口地址,常用于拨号)。
- NAPT 为什么能工作:映射关系是 "IP + 端口" 二元组,路由器为每个会话分配唯一出口端口,建表在连接建立时、删表在连接断开时;回包靠这张表认领。
理解到这里,再回头看家里的路由器、机房的防火墙策略、"外网访问不了内网服务"这类问题,就都能对上号了。
(本文由 qidao123.com企服评测-应用市场 编辑提示整理:内容对应 Linux 网络编程中"网络层"章节的 NAT / NAPT 部分,示例 IP 为教学用示意地址。) |