NAT技术详解(网络地址转换)

组织对不起,90年的事我瞒不住了——NAT(网络地址转换)

NAT(Network Addresss Translation),网络地址转换,本质上是一种允许在互联网的不同地方重复使用相同的IP地址集的机制,同时作为公网IP地址和私网IP地址的过渡环节,同时也具有了一定的防御功能——过滤数据包。NAT作为IPv4和IPv6的过渡方案,它的出现缓解了20世纪90年代初的IPv4地址数量不足的问题。,但也在一定程度上阻挠了IPv6的发展。

NAT是一个非常复杂的东西,因为NAT与许多协议都有着非常紧密的关系,特别是防火墙,许多协议甚至针对NAT会有一些特定的规定。很难在一篇文章内将这些乱七八糟的的东西,全部都讲的非常清楚,该文章只讲述NAT一些比较基础的概念,与其他协议交互方面不打算细说。

致敬一下大佬的文章:CSDN博主逃离地球的小小呆的《NAT(地址转换技术)详解》,大佬的文章给我了许多帮助,让我在看TCP/IP协议的时候有了更加深刻的理解。
网址:https://blog.csdn.net/gui951753/article/details/79593307?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

1. 那一年(20世纪90年代)互联网的发展究竟遭遇了什么

20世纪80年代,也就是互联网刚刚出现的时候,由于受到硬件条件的限制,IPv4网络地址最多可以分配16 777 216+65 536+256 = 16 843 008个,而且还是一个萝卜一个坑,一个电脑一个IP地址。这种主机数量在80年代确实也没有什么问题,但是到了90年代IPv4地址数量不足的问题开始越来越严重。
在这里插入图片描述
在这里插入图片描述
在当时有两个方法处理这个问题:一个是IPv6地址,一种在现有的基础上进行改造,并且采取有效的措施来管理IP地址的分配和使用(也就是现在的NAT)。但是全都用IPv6地址,硬件措施跟不上(很贵,小钱包顶不住啊)。所以,为了省钱,当时互联网大佬就在IPv4上发展出了子网,同时也有了NAT在子网内允许地址重复的协议。采用NAT技术之后,互联网地址就不再需要是全球唯一的,因此可以在互联网的不同部分(称为地址范围(address realm))被重复使用。允许在多个范围中的同一地址重复使用,大大缓解了地址耗尽的问题。一个坑可以塞多几个地瓜,这个世界的IP地址也分成了公网IP和私网IP。

那么事实证明,这个NAT协议那是相当的顶,直到最近IPv4的43亿个地址才被分配完成。

2011年2月3日中国农历新年, IANA对外宣布:IPv4地址空间最后5个地址块已经被分配给下属的5个地区委员会。2011年4月15日,亚太区委员会APNIC对外宣布,除了个别保留地址外,本区域所有的IPv4地址基本耗尽。UTC+1时间2019年11月25日 15:35 分(北京时间 22:35 分),负责英国、欧洲、中东和部分中亚地区互联网资源分配的欧洲网络协调中心(RIPE NCC)宣布,全球所有 43 亿个 IPv4 地址已全部分配完毕,这意味着没有更多的 IPv4 地址可以分配给 ISP(网络服务提供商)和其他大型网络基础设施提供商。(腾讯新闻,百度百科)——————————图片来自CSDN咨询,下文链接。

在这里插入图片描述

但具有讽刺意味的是,快速发展和广泛使用的NAT却严重影响了IPv6的推进进程。在IPv6的诸多益处中,其中一项就是使得不再需要NAT。

上面提到的IPv4,IPv6,子网都是一些很长的事情,所以我不打算细说。在这里放一个链接,有兴趣看一下。(博主自己的还没有写嘛)

  1. CSDN博主逃离地球的小小呆的《子网划分详解与子网划分实例精析》,网址:https://blog.csdn.net/gui951753/article/details/79412524?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
  2. CSDN博主chao199512的《IPV4与IPV6的区别(史上最详细)》,网址:https://blog.csdn.net/chao199512/article/details/86139714

2. 讲完了NAT的前世今生,来更加直观的感受到NAT的作用

1.打开百度搜索->打IP地址查询
在这里插入图片描述

2.用命令行,《如何在电脑上查找ip地址》,网址:http://xinzhi.wenda.so.com/a/1520415964612980
在这里插入图片描述
电脑IP:169.254.120.+++以及113.117.208.+++,有明显的不同,这就是NAT非常直观的一种体现:私网IP和公网IP的不同。
在这里插入图片描述

3. NAT工作机理(数据进入之前的处理)

NAT的工作原理就是重写通过路由器的数据包的识别信息,可以这样不太准确的理解,NAT的工作原理就是替换IP报文头部的地址信息,实现由公网IP地址向私网IP地址的转换

NAT需要重写往一个方向传输的数据包的源IP地址,重写往另一个方向传输的数据包的目的IP地址。这允许传出的数据包的源IP地址变为NAT路由器中面向Intemet的网络接日地址,而不是原始主机的接口地址。因此,在另外一边的互联网上的主机看来,数据包是来自于具备全局路由IP的NAT路由器,而不是位于NAT内部的私有地址的主机。

3.1 对于如何替换IP报文头部的地址信息,有两种基本思路:

基本NAT(即静态NAT)和NAPT(也称为动态NAT),除非进行区分很重要,否则我们所说的NAT将同时包括传统的NAT和NAPT。

  1. 基本NAT,也称为静态NAT(边路单挑,极限一换一):利用地址池中的地址重写IP地址,但是保留端口不变,即只执行IP地址重写,本质上就是将私有地址改写为一个公共地址——往往取自于一个由ISP(Internet服务供应商)提供的地址池或公有地址范围。这种类型的NAT不是最流行的,因为它无助于减少需要使用的IP地址数量,而且全局可路由的地址数量必须大于或等于希望同时访间Intemet的内部主机数量。
  2. NAPT,也称为动态NAT(团战多对多):NAPT也称为IP伪装,通常将所有的地址都重写到一个地址,NAPT有时必须重写端口号,以避免冲突。NAPT使用传输层标识符(即TCP和UDP端日, ICMP查询标识符)来确定一个特定的数据包到底和NAT内部的哪台私有主机关联。这使得大量的内部主机(即好几千台)能够同时访问互联网,而使用的公有地址数量却很少,通常只需要一个。
    在这里插入图片描述

在NAT “后面”或者“内部”使用的私有地址范围不受除了本地网络管理人员之外的任何人的限制。因此,有可能在私有范围内采用全局地址空间。原则上,这是可以接受的。然而,当这样的全局地址也被互联网上的另一个实体所使用时,在私有范围内的本地系统极有可能无法达到使用相同地址的公共系统,这是因为采用相同地址的本地系统会屏蔽掉使用相同地址的远端系统。

为了避免这种不良情况的发生,保留了三个IPv4地址范围作为私有地址范围使用 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/160这些地址范围经常被用来作为嵌人式DHCP服务器的地址池的默认值。

3.2 NAT工作步骤

  1. 网络被分为私网和公网两个部分,NAT网关设置在私网到公网的路由出口位置,双向流量必须都要经过NAT网关
  2. 网络访问只能先由私网侧发起,公网无法主动访问私网主机;
  3. NAT网关在两个访问方向上完成两次地址的转换或翻译,出方向做源信息替换,入方向做目的信息替换;
  4. NAT网关的存在对通信双方是保持透明的;
  5. NAT网关为了实现双向翻译的功能,需要维护一张关联表,把会话的信息保存下来。

3.3 也正是因为NAT重写数据包的识别信息的基本原理,带来许多问题

  1. 需要做特殊配置才能使处于NAT内部的主机能够提供可供互联网访问的服务,因为互联网上的用户无法直接访问具备私有地址的主机,
  2. 同时NAT协议破坏了破坏了IP端到端通信的能力,让外网无法直接访问NAT之后的主机提供的服务。(比如翻墙出去怼某国“** virus”)
  3. 为了使NAT正常工作,每一个隶属于同一个连接或关联的双向数据包都必须通过相同的NAT。这是因为NAT必须重写每个数据包的寻址信息,以便私有地址空间的系统和Intemet主机之间能够正常通信。
  4. NAT会对一些应用协议造成困扰,尤其是那些在应用层的有效载荷内记录IP地址信息的协议。NAT在实现上将多个内部主机发出的连接复用到一个IP上,这就使依赖IP进行主机跟踪的机制都失效了。如网络管理中需要的基于网络流量分析的应用无法跟踪到终端用户与流量的具体行为的关系。基于用户行为的日志分析也变得困难,因为一个IP被很多用户共享,如果存在恶意的用户行为,很难定位到发起连接的那个主机。
  5. NAT使IP会话的保持时效变短。因为一个会话建立后会在NAT设备上建立一个关联表,在会话静默的这段时间,NAT网关会进行老化操作。

弊端5:参考了,CSDN博主逃离地球的小小呆的《NAT(地址转换技术)详解》,网址:https://blog.csdn.net/gui951753/article/details/79593307?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

4. NAT访问:地址和端口转换行为(数据报过了NAT之后的处理)

这一点应该大部分用于NAPT,用来处理公网IP地址向私网IP地址转换问题。

  1. 使用符号X:x表示在私有地址范围中的主机使用IP地址X、端口号x
  2. Y:y表示远程地址Y:y
  3. NAT需要NAT需要使用一个外部地址(通常是公共的和全局路由的) x1′和端日号x1l′来创建一个映射

在这里插入图片描述
在这里插入图片描述

4.1 过滤行为

在这里插入图片描述

4.2 端口转发,处理位于NAT之后的服务器

通过端口转发,进人NAT的流量被转发到一个位于NAT后面的特定配置的目的地址。通过采用NAT端口转发,就可以让服务器给互联网提供服务,即使它们被分配了私有的、不可路由的地址。

端口转发,通常需要采用转发到的服务器的地址和端口号来静态配置NAT端口转发就像一个始终存在的静态NAT映射。如果服务器的IP地址被更改, NAT必须更新寻址信息。端口转发也有局限性,只有一个端口号集合用于绑定每个(IP地址,传输协议)组合。因此,如果NAT只有一个外部IP地址,它最多将相同传输协议的一个端口转发到一个内部机器。

4.3 发夹和NAT环回,处理处于同一个NAT私有地址空间内服务器访问问题

在这里插入图片描述

5. NAT穿越(NAT-T,NAT traversal)(进入的过程中的处理)

那么好前面讲完了,公网IP与端口和私网IP地址与端口如何进行转换的问题,现在来谈一下使用了NAT设备之后主机之间如何创建连接的问题。

NAT穿越(NAT traversal)涉及TCP/IP网络中的一个常见问题,即在处于使用了NAT设备的私有TCP/IP网络中的主机之间建立连接的问题。

5.1 针孔(pinhole)和打孔(hole punching)

先讲解一下概念:

  1. 当NAT对在执行时间内的单一应用程序创建一种临时映射,且这种临时映射只允许通过一部分的临时信息流量,这种映射被称为针孔(pinhole),随着程序之间的通信,针孔通常会动态地创建和删除。
  2. 通过采用针孔试图使位于NAT之后的两个或两个以上的系统直接通信的方法称为打孔(hole punching)。

为了打一个孔,一个客户机需通过一个向外的连接来访问一台已知的服务器,这样便在本地的NAT中创建了一个映射。当另一个客户机访问同一台服务器时,由于服务器和每个客户机均有连接,因此知道它们的外部寻址信息。它然后在客户机之间交换它们的外部寻址信息。一旦知道了这个信息,一个客户机便可以尝试直接连接到其他的客户机。流行的对等应用Skype便使用了这种方法。
在这里插入图片描述

5.2 单边的自地址确定(UNilateral Self-Address)

单边的自动地址确定(UNSAF,UNilateral Self-Address),确定如何识别通过NAT的流量的启发式尝试,它是一个脆弱的过程,类似于ICE技术,已被推荐为其他替代品)。

应用程序使用一系列方法来定位其流量在通过NAT时所采用的地址。这便称为确定(fixing) (学习和维护)地址信息。地址确定的方法分为直接和间接两种。

  1. 间接方法涉及通过NAT与NAT交换流量来推测其行为,这是最广泛的用法,最知名便是VoIP应用。VoIP应用参考:CSDN博主叶广明_微信ye_guangming的《VOIP简介》,网址:https://blog.csdn.net/china_video_expert/article/details/70164428
  2. 直接方法涉及应用程序和NAT本身通过一个或多个特殊协议(还不是IETF的标准)来进行直接会话。

5.3 NAT的会话穿越工具:STUN

一个UNSAF和NAT穿越的主要功能,就是NAT会话穿越工具(SessionTraversal Utilities for NAT, STUN) 。 STUN源自于UDP简单隧道穿越NAT(Simple Tumeling of UDP through NAT),现在被称为“经典的STUN” 。STUN服务器的主要工作是回显发送给它的STUN请求,以确定客户端的寻址信息。它需要在NAT一侧存在一台有效的“其他”合作服务器,以及几台被配置了全局IP地址的可在互联网上被访间到的公共STUN服务器。

STUN被设想为一种“临时”的解决方案,直到制定和实施更复杂的直接协议,或由于IPv6的广泛采用而使得NAT成为过时的。 作为一个相对比较简单的客户机/服务器协议,它能够以在多种环境中确定在NAT中使用的外部IP地址和端口号,也可以通过保持激活的信息来维持当前的NAT绑定。

5.3.1 STUN报头结构

在这里插入图片描述
在这里插入图片描述

5.4 利用NAT中继的穿越(最后一手保证措施)

利用NAT中继的穿越(Traversal Using Relays around NAT,TURN)为多个系统提供了一种通信方式,即使它们均位于并未协作的NAT后。作为支持在这种情况下通信的最后手段,它需要一个中继服务器在无法通信的系统之间传递数据。使用STUN和一些TURN特定报文的扩展,即使大多数其他方法都失败了它也能照样支持通信,只要每个客户端均能连接到不在NAT后的公共服务器。
在这里插入图片描述
通常位于NAT后的TURN客户机会访问位于公共互联网上的TURN服务器,并暗示了它希望连接的其他系统(称为对等(peer))。通过使用一种特殊的DNSNAPTR记录,或通过手动配置,便可以找到用于通信的服务器的地址和相应的协议。

客户端从服务器端获待的地址和端口信息,称为中继传输地址(relayed transport address),就是TURN服务器用于和其他对等客户机通信的地址和端日号。客户端也获得了它自已的服务器反向传输地址。对等客户机也得到了代表它们外部地址的服务器反向传输地址。这些地址是客户端和服务器用来连接客户机及其对等所必需的。交换寻址信息的方洼并没有在TURN中定义。相反,为了能够更加有效地使用TURN服务器,这些信息必须使用其他一些机制来完成交换。

5.4.1 TURN请求利用了STUN报文的形式

TURN请求采用了STUN报文的形式,其中报文类型是一个分配请求。

TURN通过6种方法、 9个属性以及6个错误响应代码增强STUN。这些大致可以分为支持建立和维护分配、认证以及操作隧道。6种方法和它们的方法号如下:分配(Allocate) ( 3 ),刷新(Refresh) (4),发送(Send) (6),数据(Data) (7),创建权限(CreatePermission) (8),隧道绑定(CharmelBind)( 9 )。

前两种方法用于建立并保持分配存活。 Send和Data使用STUN报文封装从客户端发送到服务器的数据,反之亦然o GreatePermission用于创建或刷新一个权限, CharmelBind通过一个16位的隧道号与一个特定的对等客户端相关联。错误报文表明与TURN功能相关的间题,如认证失败或资源耗尽。
在这里插入图片描述

5.5 交互连接建立(Interactive Cormectivity Establishment, ICE)

鉴于NAT的广泛部署及各种为穿越它们所必须采用的机制,一种称为交互式连接建立( Interactive Cormectivity Establishment, ICE) 的通用功能被发展出来,用于帮助位于NAT后的UDP应用程序主机建立连接。ICE是一套启发式,利用它应用程序能够以一个相对可预见的方式来执行UNSAF。在它的操作中, ICE使用了其他协议,如TURN和STUN。

6. 参考资料

  1. CSDN博主逃离地球的小小呆的《NAT(地址转换技术)详解》,网址:https://blog.csdn.net/gui951753/article/details/79593307?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
  2. CSDN博主擒贼先擒王的《NAT 详解》,网址:https://blog.csdn.net/freeking101/article/details/77962312?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
  3. CSDN博主chao199512的《IPV4与IPV6的区别(史上最详细)》,网址:https://blog.csdn.net/chao199512/article/details/86139714
  4. CSDN博主三支烟的《华为路由器NAT经典配置》(转载),网址:https://blog.csdn.net/qq_36357820/article/details/78918630?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-5&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-5
  5. CSDN博主曹世宏的博客的《NAT穿越(NAT-T)原理》,网址:https://blog.csdn.net/qq_38265137/article/details/89423809
  6. CSDN博主叶广明_微信ye_guangming的《VOIP简介》,网址:https://blog.csdn.net/china_video_expert/article/details/70164428
  7. CSDN咨询《最后一个 IPV4 地址分配完毕,正式向IPV6过渡!》邮件截图,网址:https://blog.csdn.net/j3T9Z7H/article/details/103306122
  8. 腾讯新闻《全球最后5个IPv4地址被分配 亚太IP将先耗尽》,网址:https://tech.qq.com/a/20110204/000053.htm
  9. TCP/IP协议详解(原书第二版)卷一,协议:P23,P209—P247
  10. 如何在电脑上查找ip地址》,网址:http://xinzhi.wenda.so.com/a/1520415964612980
  11. 百度百科《 NAT穿越》,网址:https://baike.baidu.com/item/NAT%E7%A9%BF%E8%B6%8A/2366420?fr=aladdin

在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章