目录
一、NAT由来
二、NAT的几个关键特点
三、NAT优点
四、NAT限制和解决方案
1.IP端到端服务模型
2.NAT弊端
五、后IPv4时代的NAT
六、NAT穿透技术
1.NAT分类
2.不同NAT的穿透性
3.UDP打洞简单过程
参考地址
为了解决全球公有IP的稀缺,提出了NAT技术。NAT是 Network Address Translation 网络地址转换的缩写。
NAT将私有IP地址通过NAT网关转换成公网IP地址,在网关的NAT地址转换表记录下这个转换映射记录,当外部数据返回时,网关使用NAT技术查询NAT转换表,再将目标地址替换成内网用户IP地址。当一个公司内部配置了这些私有地址后,内部的计算机在和外网通信时,公司的网关会通过NAT或者PAT技术,将内部的私有地址转换成公网IP,外部看到的源地址是公司网关转换过的公网IP地址,这在某种意义上也增加了内部网络的安全性,如下图。
1. 网络被分为私网和公网两个部分,NAT网关设置在私网到公网的路由出口位置,双向流量必须都要经过NAT网关;
2. 网络访问只能先由私网侧发起,公网无法主动访问私网主机;
3. NAT网关在两个访问方向上完成两次地址的转换或翻译,出方向做源信息替换,入方向做目的信息替换;
4. NAT网关的存在对通信双方是保持透明的;
5. NAT网关为了实现双向翻译的功能,需要维护一张关联表,把会话的信息保存下来。
随着后面对NAT的深入描述,读者会发现,这些特点是鲜明的,但又不是绝对的。其中第二个特点打破了IP协议架构中所有节点在通讯中的对等地位,这是NAT最大的弊端,为对等通讯带来了诸多问题,当然相应的克服手段也应运而生。事实上,第四点是NAT致力于达到的目标,但在很多情况下,NAT并没有做到,因为除了IP首部,上层通信协议经常在内部携带IP地址信息。
1.使多台计算机共享Internet连接,这一功能很好地解决了公共 IP地址紧缺的问题。通过这种方法,可以只申请一个合法IP地址,就把整个局域网中的计算机接入Internet中。
2.处于NAT网关内,隐藏了公网地址,NAT对来自外部的数据查看其NAT映射记录,对没有相应记录的数据包进行拒绝,提高了网络的安全性。
3.网络发生变化时,避免重新编址(这个问题具有亲身体会,原本所在的实习单位搬迁,我们搬到了新的住处,网络环境发生了一些变化,但是由于nat技术的特点,我们局域网的地址并没有发生改变,我们依然使用着最初的编址方案)。
NAT对我们来说最大的贡献就是帮助我们节省了大量的ip资源。
IP协议的一个重要贡献是把世界变得平等。在理论上,具有IP地址的每个站点在协议层面有相当的获取服务和提供服务的能力,不同的IP地址之间没有差异。人们熟知的服务器和客户机实际是在应用协议层上的角色区分,而在网络层和传输层没有差异。一个具有IP地址的主机既可以是客户机,也可以是服务器,大部分情况下,既是客户机,也是服务器。端到端对等看起来是很平常的事情,而意义并不寻常。但在以往的技术中,很多协议体系下的网络限定了终端的能力。正是IP的这个开放性,使得TCP/IP协议族可以提供丰富的功能,为应用实现提供了广阔平台。因为所有的IP主机都可以服务器的形式出现,所以通讯设计可以更加灵活。使用UNIX/LINUX的系统充分利用了这个特性,使得任何一个主机都可以建立自己的HTTP、SMTP、POP3、DNS、DHCP等服务。与此同时,很多应用也是把客户端和服务器的角色组合起来完成功能。例如在VoIP应用中,用户端向注册服务器登录自己的IP地址和端口信息过程中,主机是客户端;而在呼叫到达时,呼叫处理服务器向用户端发送呼叫请求时,用户端实际工作在服务器模式下。在语音媒体流信道建立过程后,通讯双向发送语音数据,发送端是客户模式,接收端是服务器模式。而在P2P的应用中,一个用户的主机既为下载的客户,同时也向其他客户提供数据,是一种C/S混合的模型。上层应用之所以能这样设计,是因为IP协议栈定义了这样的能力。试想一下,如果IP提供的能力不对等,那么每个通信会话都只能是单方向发起的,这会极大限制通信的能力。细心的读者会发现,前面介绍NAT的一个特性正是这样一种限制。没错,NAT最大的弊端正在于此——破坏了IP端到端通信的能力。
NAT在解决IPv4地址短缺问题上,并非没有副作用,其实存在很多问题。
(1)NAT使IP会话的保持时效变短。因为一个会话建立后会在NAT设备上建立一个关联表,在会话静默的这段时间,NAT网关会进行老化操作。这是任何一个NAT网关必须做的事情,因为IP和端口资源有限,通信的需求无限,所以必须在会话结束后回收资源。通常TCP会话通过协商的方式主动关闭连接,NAT网关可以跟踪这些报文,但总是存在例外的情况,要依赖自己的定时器去回收资源。而基于UDP的通信协议很难确定何时通信结束,所以NAT网关主要依赖超时机制回收外部端口。通过定时器老化回收会带来一个问题,如果应用需要维持连接的时间大于NAT网关的设置,通信就会意外中断。因为网关回收相关转换表资源以后,新的数据到达时就找不到相关的转换信息,必须建立新的连接。当这个新数据是由公网侧向私网侧发送时,就会发生无法触发新连接建立,也不能通知到私网侧的主机去重建连接的情况。这时候通信就会中断,不能自动恢复。即使新数据是从私网侧发向公网侧,因为重建的会话表往往使用不同于之前的公网IP和端口地址,公网侧主机也无法对应到之前的通信上,导致用户可感知的连接中断。NAT网关要把回收空闲连接的时间设置到不发生持续的资源流失,又维持大部分连接不被意外中断,是一件比较有难度的事情。在NAT已经普及化的时代,很多应用协议的设计者已经考虑到了这种情况,所以一般会设置一个连接保活的机制,即在一段时间没有数据需要发送时,主动发送一个NAT能感知到而又没有实际数据的保活消息,这么做的主要目的就是重置NAT的会话定时器。
(2)NAT在实现上将多个内部主机发出的连接复用到一个IP上,这就使依赖IP进行主机跟踪的机制都失效了。如网络管理中需要的基于网络流量分析的应用无法跟踪到终端用户与流量的具体行为的关系。基于用户行为的日志分析也变得困难,因为一个IP被很多用户共享,如果存在恶意的用户行为,很难定位到发起连接的那个主机。即便有一些机制提供了在NAT网关上进行连接跟踪的方法,但是把这种变换关系接续起来也困难重重。基于IP的用户授权不再可靠,因为拥有一个IP的不等于一个用户或主机。一个服务器也不能简单把同一IP的访问视作同一主机发起的,不能进行关联。有些服务器设置有连接限制,同一时刻只接纳来自一个IP的有限访问(有时是仅一个访问),这会造成不同用户之间的服务抢占和排队。有时服务器端这样做是出于DOS攻击防护的考虑,因为一个用户正常情况下不应该建立大量的连接请求,过度使用服务资源被理解为攻击行为。但是这在NAT存在时不能简单按照连接数判断。总之,因为NAT隐蔽了通信的一端,把简单的事情复杂化了。
(3)NAT工作机制依赖于修改IP包头的信息,这会妨碍一些安全协议的工作。因为NAT篡改了IP地址、传输层端口号和校验和,这会导致认证协议彻底不能工作,因为认证目的就是要保证这些信息在传输过程中没有变化。对于一些隧道协议,NAT的存在也导致了额外的问题,因为隧道协议通常用外层地址标识隧道实体,穿过NAT的隧道会有IP复用关系,在另一端需要小心处理。ICMP是一种网络控制协议,它的工作原理也是在两个主机之间传递差错和控制消息,因为IP的对应关系被重新映射,ICMP也要进行复用和解复用处理,很多情况下因为ICMP报文载荷无法提供足够的信息,解复用会失败。IP分片机制是在信息源端或网络路径上,需要发送的IP报文尺寸大于路径实际能承载最大尺寸时,IP协议层会将一个报文分成多个片断发送,然后在接收端重组这些片断恢复原始报文。IP这样的分片机制会导致传输层的信息只包括在第一个分片中,NAT难以识别后续分片与关联表的对应关系,因此需要特殊处理。
(4)有一些应用程序虽然是用A端口发送数据的,但却要用B端口进行接收,不过NAT设备翻译时却不知道这一点,它仍然建立一条针对A端口的映射,结果对方响应的数据要传给B端口时,NAT设备却找不到相关映射条目而会丢弃数据包。
(5)如果NAT本身又位于另一个NAT之后,则也会出现一些问题,为了节约IP资源,现在很多的ISP在它们内部架设NAT,然后再把服务提供给用户,比如长城、聚友等ISP通常都是以城域网的方式为用户提供宽带上网服务的。从关联表管理角度来说,无法有效的控制在哪个NAT网关上建立关联表以及维护。
(6)NAT下,网络访问只能先由私网侧发起,公网侧无法主动访问私网主机。所有的主机都“隐藏”在NAT网关下,不利于全局性的管理。它隐藏了发送报文的主机的有关信息,使得外部网络难于对它们进行管理,例如,若内部网络中某台主机在Internet上违反安全规则,Internet就无法查处“元凶”。
(7)一些P2P应用在NAT后无法进行。对于那些没有中间服务器的纯P2P应用来说,如果大家都位于NAT设备之后,双方是无法建立连接的。因为没有中间服务器的中转,NAT设备后的P2P程序在NAT设备上是不会有映射条目的,也就是说对方是不能向你发起一个连接的。
(8)如果网络规模增大,访问Internet的主机增多,地址对应表的规模必然会越来越大,这将导致效率的降低。也会增加错误寻址的可能性。
我们来深入理解NAT一下对IP端到端模型的破坏力:NAT通过修改IP首部的信息变换通信的地址。但是在这个转换过程中只能基于一个会话单位。当一个应用需要保持多个双向连接时,麻烦就很大。NAT不能理解多个会话之间的关联性,无法保证转换符合应用需要的规则。当NAT网关拥有多个公有IP地址时,一组关联会话可能被分配到不同的公网地址,这通常是服务器端无法接受的。更为严重的是,当公网侧的主机要主动向私网侧发送数据时,NAT网关没有转换这个连接需要的关联表,这个数据包无法到达私网侧的主机。这些反方向发送数据的连接总有应用协议的约定或在初始建立的会话中进行过协商。但是因为NAT工作在网络层和传输层,无法理解应用层协议的行为,对这些信息是无知的。NAT希望自己对通信双方是透明的,但是在这些情况下这是一种奢望。
NAT是为延缓IPv4地址耗尽而推出的技术。毫无疑问,它已经出色完成了自己的历史使命,IPv4比预期走得更远。作为继任者的IPv6吸取了IPv4的教训,被赋予充足地址空间的同时在各个方面做了优化——安全、高效、简洁。但是IPv6无法平滑地取代IPv4,导致IP升级步伐缓慢。尽管网络协议的分层设计很清晰,大量应用层协议和互联网软件中仍内嵌了IPv4地址的处理,要Internet全网升级到IPv6,必须先完成应用的改造。因为NAT和它的穿越技术结合能够满足大部分用户的需求,所以IPv6时代被不断推迟。
随着IPv4地址的濒临耗尽,再经济的模式也无以为继,IPv4必须退出历史舞台。人们自然会认为,NAT作为IPv4的超级补丁技术使命已经完结。实际情况是,IPv4向IPv6过渡的阶段,NAT仍然是一项必不可少的技术手段。因为Internet无法在一日之内完成全网升级,必然是局部升级,逐渐替换。在两套协议并存的时期,用户和服务资源分布在不同网络之间,跨网访问的需求必须得到满足。这正是NAT所擅长的领域,地址替换,因此NAT-PT应运而生。由于IPv4和IPv6之间的差异,NAT要做的事比以往更复杂,有更多的限制和细节。
此外,IETF也在制定纯IPv6网络使用的NAT规范。虽然人们还看不到这种应用的强烈需求,但是NAT仍有其独特的作用,比如隐藏内部网络的地址,实现重叠地址网络的合并等。
NAT阻碍主机进行P2P通信的主要原因是NAT不允许外网主机主动访问内网主机,因为NAT设备上没有相关转发表项,要在NAT网络环境中进行有效的P2P通信,就必须寻找相应的解决方案。
解决上述问题的权宜之计
要解决上面的部份问题,可以应用NAT穿越技术(NAT Traversal),NAT穿越技术拥有这样的功能,它能够让网络应用程序(如MSN Messenger)主动发现自己位于NAT设备之后,并且会主动获得NAT设备的公网IP,并为自己建立端口映射条目,注意这些都是NAT设备后的应用程序自动完成的,也就是说,在NAT穿越技术中,NAT设备后的应用程序处于主动地位,它已经明确地知道NAT设备要修改它外发的数据包,于是它主动配合NAT设备的操作,主动地建立好映射,这样就不像以前由NAT设备来建立映射了。这样就会解决很多以前由NAT引起的网络连接问题。
(1) 解决了嵌入式IP地址或端口的问题,因为现在应用程序已经知道了自己映射的公网条目,那么它在IP数据包的应用数据部分嵌入IP地址和端口时就会嵌入映射后的公网条目,这样对方通信时就不会出现问题了。
(2) 对于从公网访问内部网络服务,再也用不着手动去配置静态映射了,因为这一切已经由应用程序自动配置好了。
(3) 对于上面NAT弊端部分所讲的第四种情况,由于是应用程序自己建立映射条目,那么它也会自动建立针对B端口的映射,而再也不会建立针对A端口的映射了。
(4) 对于那种没有中间服务器支持的P2P应用来说,它们之前通信也不会再有问题了,因为映射条目已经建立好了。
不过对于那种NAT设备位于另一个NAT设备之后的情况,NAT穿越技术也无能为力,所以选择ISP的时候需要关注这一点。
下面围绕上图进行介绍。
从基本方式来说,NAT分为三类:动态NAT、静态NAT和NAPT(网络端口地址转换)。
(1)静态NAT是指一个内部主机唯一对应一个公网IP地址(一对一),显然这种方式对于节约IP资源来说没有多大意义;
(2)动态NAT是指在路由器上配置一个外网IP地址池(M对N),当内部有计算机需要和外部通信时,就从地址池里动态的取出一个外网IP,并将他们的对应关系绑定到NAT表中,通信结束后,这个外网IP才被释放,可供其他内部IP地址转换使用。N个公网IP对应M个内部Ip,不固定的一对一IP转换关系。同一时间,有M-N个主机无法联网;
(3)NAPT是指将端口引入此技术中,即多台主机共用一个公网地址(多对一),利用这一个公网IP的不同端口与外部进行通信。
NAPT从端口角度来说,分为两大类:锥型NAT和对称NAT。其中锥型NAT又分为完全锥型、受限制锥型、端口受限制锥型三种。
(1)完全锥型(Full Cone):将从同一内部IP地址和端口来的所有请求,都映射到相同的外部IP地址和端口。而且,任何外部主机通过向映射的外部地址发送报文,可以实现和内部主机进行通信。这是一种比较宽松的策略,只要建立了内部网络的IP地址和端口与公网IP地址和端口的映射关系,则所有Internet上的主机都可以访问该NAT之后的主机,在图7-1中,完全锥型NAT会将内网地址{X:y} (x代表内网主机的IP地址,Y代表端口)映射成公网地址{A:b}(A代表映射的公网IP地址,b代表映射的端口)并绑定。任何数据分组都可以通过公网地址{A:b}送到此内网主机。
(2)受限制锥型(Restricted Cone):将从相同的内部IP地址和端口来的所有请求,映射到相同的公网IP地址和端口。但是与完全圆锥型NAT不同,当且仅当内网主机之前己经向公网主机(假设IP地址为P)发送过分组,此公网主机才能够向内网主机发送分组。在图7-2中,受限制锥型NAT会将内网地址{X:y}映射成公网地址{A:b〕并绑定,只有源地址为P的分组才能和此内网主机通信。
(3)端口受限制锥型(Port Restricted Cone):类似于受限圆锥型NAT,但更严格。端口受限圆锥型NAT增加了端口号的限制,当且仅当内网主机之前已经向公网主机发送了分组,公网主机才能和此内网主机通信。在图7-3中,端口受限制圆锥型NAT会将内网地址{X:y}映射成公网地址{A:b}并绑定,由于内网主机之前己经分别与地址为M,端口为n的主机以及地址为P,端口为q的主机通信,所以只有来自这两个公网地址和端口的分组才能到达内网主机。
(4)对称(Sysmmetric):把从同一内网地址和端口到相同目的地址和端口的所有请求,都映射到同一个公网地址和端口。如果同一个内网主机,用相同的内网地址和端口向另一个目的地址发送分组,则会使用不同的映射,而且公网主机只有在接收到分组后,才能向与发送分组的内网主机进行通信。可见,对称NAT是所有NAT类型中限制最为严格的。 在图7-4中,对称型NAT会将内网地址{X:y}转换成公网地址{A:b}并绑定为{X=Y}|{A:b}<一>{P:q}。这就意味着NAT只允许地址{A:b}接收来自{P:q}的分组,将它转给{X:y} 。当客户机请求一个不同的公网地址{M:n}时,NAT会新分配一个外部端口{C:d}。
由上可见:安全性系数有, 对称型 > 端口受限锥型 > 受限锥型 > 全锥型。
事实上,这些术语的引入是很多混淆的起源。现实中的很多NAT设备是将这些转换方式混合在一起工作的,而不单单使用一种,所以这些术语只适合描述一种工作方式,而不是一个设备。比如,很多NAT设备对内部发出的连接使用对称型NAT方式,而同时支持静态的端口映射,后者可以被看作是全锥型NAT方式。而有些情况下,NAT设备的一个公网地址和端口可以同时映射到内部几个服务器上以实现负载分担,比如一个对外提供WEB服务器的站点可能是有成百上千个服务器在提供HTTP服务,但是对外却表现为一个或少数几个IP地址。
client A位于NAT A后,私网地址为192.168.10.11
client B位于NAT B后,私网地址为192.168.20.22
(即两台客户机均置于两个不同的NAT网关后)
Server S运行在公网中,公网地址为300.30.30.30
两个客户端A和B的通信,大致过程如下:
1. Client A请求Server S,Server S记录Client A的公网IP:Port(即100.10.10.10:Port1)
2. Client B请求Server S,Server S记录Client B的公网IP:Port(即200.20.20.20:Port2)
若A需要和B通信
3.步骤一:A把连接B的请求发给S
4.步骤二:S把A的连接申请通知B,并把A的公网IP:Port也告知B
5.步骤三:B对A的公网IP:Port进行打洞,且通知S
6.步骤四:S把B打洞消息通知A,且把B的公网IP:Port也告知A(即经过S,让A信任B)
7.步骤五:A开始和B直接通信
上述过程如下图:
上述所有,是在前人总结的基础上写来的,各位博友写的都很详细,所以拿来直接用,以备自己之后阅览,在此附上内容原博客地址。
1.https://www.cnblogs.com/imstudy/p/5458133.html
2.https://www.fdawn.com/Default/17.html
3.https://blog.csdn.net/eydwyz/article/details/87364157
4.https://blog.csdn.net/xiaofei0859/article/details/6630451
5.https://www.cnblogs.com/lzj1981/archive/2013/05/01/3053192.html