我们都知道IPv4是一种数据报传输机制,但随着互联网的网络终端数量呈现爆炸式增长,IPv4拥有 2 32 2^{32} 232 个之多的地址空间也即将被耗尽,不足以满足全球的需求。人们开始考虑一系列措施来减缓IPv4的消耗,而NAT(网络地址转换)的出现几乎可以说是使IPv4起死回生。
工作模型
NAT的工作模型主要基于将内部网络的私有IP地址转换为公网IP地址,能够将一个IP地址共享给多个主机,并转化为内网使用,每个主机通过不同的端口与该IP地址关联。
- 地址转换:当内部设备尝试访问外部网络时,NAT设备(通常是路由器或防火墙)会将数据包中的源IP地址(私有地址)转换为公网IP地址。这个过程在IP层进行,确保内部网络的设备可以使用一个或多个合法的公网IP地址与外界通信。
- 端口地址转换:除了对IP地址进行转换外,NAT还可以修改TCP或UDP的源端口号,这称为端口地址转换(PAT)。这使得多个设备可以共享一个公网IP地址,通过不同的端口号区分不同的内部设备。
NAT的弊端
NAT破坏了IP端到端的通信能力,这意味着它改变了互联网原有的端到端透明性原则。
- 通信限制
NAT限制了通信的双向性,因为NAT后面设备的真实IP地址被隐藏,无法被外部网络访问,仅在内部主动发起连接,外部才可响应 - 部分应用失效
NAT将多个内部主机的连接复用到一个IP上,对于需要使用固定IP地址的应用或服务,NAT可能导致其功能受限。此外,NAT的存在使得基于IP协议的P2P数据共享变得困难。 - 延迟以及维护成本增加
由于需要进行地址转换,NAT可能增加数据传输的转发延迟
NAT需要维护专用IP地址与公共IP地址以及端口号之间的映射关系,这增加了网络管理的复杂度和成本。 - 安全性问题
NAT的工作机制可能会影响一些安全协议的工作,因为它在网络地址转换的过程中修改了IP地址、传输层端口号等信息,这甚至可能导致认证协议不能工作,因为认证的目的是要保证这些信息在传输过程中没有出现变化。 - 阻碍技术发展
NAT被视为缓解IPv4地址短缺的临时方案,但从某种意义上推迟了向IPv6迁移的过程,并没有从根本上解决地址不足的问题。
NAT穿越技术
为了解决IP端到端应用在NAT环境下遇到的问题,网络协议的设计者们创造了各种武器来进行应对。但每一个技术都不是完美的,还需要做许多额外处理。
-
应用层网关
ALG是一种应用层转换技术,它能够识别并修改IP报文中的地址和端口号信息,以实现私网到公网的通信。 -
探针技术
- STUN(Session Traversal Utilities for NAT)
- STUN服务器位于公网,帮助客户端发现NAT类型。
- 客户端发送请求到STUN服务器,比较响应中的地址端口信息以识别NAT存在。
- TURN(Traversal Using Relays around NAT)
- 针对对称型NAT,提供公网“地址端口对”实现数据中继。
- TURN分配的映射通过STUN响应给内网主机,用于通知通信对端。
- STUN(Session Traversal Utilities for NAT)
-
中间件技术
UPnP(Universal Plug and Play)- 允许设备间自动发现和进行网络配置。
- 客户端维护NAT映射信息,NAT只需按请求转换IP和端口。
- 直接携带映射信息建立连接,不解析应用层数据。
-
中继代理技术
- 旁路技术,在NAT旁部署应用服务器实现中继
- 客户端请求发送至代理服务器,后者从公网侧发起新请求并中继内容
-
特定协议的自穿越技术
- IKE(Internet Key Exchange)和IPesc设计时考虑了NAT穿越
- 使用UDP封装报文,内部报文不受NAT影响
- IKE增加了检查NAT存在和绕开NAT的能力
NAT的实现
-
静态一对一地址映射
NAT将一个私网地址和一个公网地址进行静态关联,从内而外的方向,将源IP匹配的私网IP替换为公网IP;在反方向,将目的IP匹配公网IP的报文替换为私网IP。网络层以上的部分不进行替换处理,只修正校验和。 -
静态多对多地址映射
与静态一对一地址映射类似,只是把一段私网地址映射到一段公网地址。 -
动态端口映射
这是最基本的工作方式,即前面多次介绍的将一段内网地址动态翻译为一个或多个公网IP,同时对传输层端口或其他上层协议信息进行转换,以实现IP复用。
对由内而外的报文,替换源地址和端口,反向报文替换目的地址和端口。仅以连接公网的接口IP作为NAT转换的公网地址时,这种配置最简化,又被称为EasyIP。 -
动态地址映射(no-pat)
介于静态多对多地址映射和动态端口映射方式之间的一种工作机制。当有一个私网向公网侧访问到达NAT网关时,NAT网关会检查这个私网IP是否已经有关联的公网IP映射。
若已存在,则按照转换表直接替换IP,不修改上层协议。
若不存在关联表项,则在空闲的公网IP池中占用一个IP,并写入关联表中,以后按照这个关联关系进行地址转换。
当这个私网主机发起的所有对外访问均关闭或超时后,回收公网IP。这种方式可以理解为一组内网主机抢占式地共享一个公网IP地址池。当公网IP地址池用完以后,新连接将无法建立。 -
静态端口映射
通过静态配置,把一个固定的私网IP地址和端口关联到一个公网地址和端口上。这种方式适用于在NAT网关上把一个知名服务(如HTTP)映射到一个内部主机上,也称为port forwarding。 -
应用层网关(ALG)
在所有NAT产品实现中,ALG是一个必需的功能组件。但在不同实现中,有些产品可以动态加载不同的ALG模块,有些产品可以提供ALG开关控制,有些则不提供任何用户接口。ALG解析上层应用协议的内容,并且根据需要修改IP和端口相关信息,创建和维护附加的关联表项。 -
NAT转换关联表
关联表中会记录源IP、目的IP、连接协议类型、传输层源端口、目的端口,以及转换后的源IP、源端口,目的IP、目的端口信息,这里的源和目的都是对应于从内网到外网的访问方向。
总结
总的来说,NAT技术虽然在节约IP地址资源方面发挥了重要作用,但也带来了一系列的挑战和问题。随着IPv6的逐渐推广,未来可能会有更多的解决方案来缓解NAT带来的这些问题。