【前言】
本文章“最适合”的人群为,有基本的网络基础知识,至少了解OSI7层模型,IPV4协议,NAT,DHCP。本文比起具体技术细节更多体现的是一些设计思想,但也可能涉及一部分的技术细节。当然需要了解细节或技术基础的小伙伴们请参考专门的资料。
【简单介绍】
NAT network address translation 中文名为网络地址转换。正如其名,NAT能转换的是不同的网络协议的地址,而不仅仅是同一个协议之内的地址转换(例如,最广泛应用的IPV4 公私网之间的地址转换)(本文后面的NAT所指的是这一种技术),一个不同网络层协议的转换的实例是NAT-PT(IPV4-IPV6的转换)。
值得补充的是,NAT-PT在IPV6的过渡技术中是不值得推荐的一种技术,但还是应该了解NAT的本质意义。下面我们还是简单的给出在IPV4中NAT应用的定义:
======================================以下摘自网络======================================
网络地址转换(NAT,NetworkAddress Translation)属接入广域网(WAN)技术,是一种将私有(保留)地址转化为合法IP地址的转换技术,它被广泛应用于各种类型Internet 接入方式和各种类型的网络中。原因很简单,NAT不仅完美地解决了lP地址不足的问题,而且还能够有效地避免来自网络外部的攻击,隐藏并保护网络内部的计算机。
NAT的实现方式有三种,即静态转换Static Nat、动态转换Dynamic Nat和端口多路复用OverLoad。
静态转换是指将内部网络的私有IP地址转换为公有IP地址,IP地址对是一对一的,是一成不变的,某个私有IP地址只转换为某个公有IP地址。借助于静态转换,可以实现外部网络对内部网络中某些特定设备(如服务器)的访问。
动态转换是指将内部网络的私有IP地址转换为公用IP地址时,IP地址是不确定的,是随机的,所有被 授权访问上Internet的私有IP地址可随机转换为任何指定的合法IP地址。也就是说,只要指定哪些内部地址可以进行转换,以及用哪些合法地址作为外部地址时,就可以进行动态转换。动态转换可以使用多个合法外部地址集。当ISP提供的合法IP地址略少于网络内部的计算机数量时。可以采用动态转换的方 式。
端口多路复用(Port address Translation,PAT)是指改变外出数据包的源端口并进行端口转换,即端口地址转换(PAT,Port AddressTranslation).采用端口多路复用方式。内部网络的所有主机均可共享一个合法外部IP地址实现对Internet的访问,从而可以最大限度地节约IP地址资源。同时,又可隐藏网络内部的所有主机,有效避免来自internet的攻击。因此,目前网络中应用最多的就是端口多路复用方式。
一个最简单的只转换源地址的NAT过程如图所示:
=========================================================================================
【NAT需求】
现在是一些总结:首先我们可以理解到私网地址设计的原因,就是为了节省IP地址,让IP地址可以在局域网内复用。而私网地址不可以在公网上出现,那是因为所有的ISP路由器必须有过滤私网地址的功能。那么为了让私网地址起到更强大的作用,它需要和NAT技术配合起来。
由此我们可以理解,★NAT出现的需求主要是为了解决IPV4地址缺乏的问题,当然还有人把其应用在服务器的负载均衡上,还有人认为NAT使得网络更“安全”。让我们回到主要需求上:静态NAT与一对一的动态NAT实际上根本不能使得地址“变多”,因为这些技术都是使得公网地址与私网地址有一对一的映射关系。真正能缓解IPV4地址危机的技术是PAT端口多路复用(Portaddress Translation),通常这种技术还要和DHCP配合取得更好的效果。实际上,仅仅单一的DHCP技术也能起到节省IP地址的功能。如果仅仅是静态分配,没有联网的主机将浪费了IP地址,假设没有使用DHCP技术能同时支持的主机数为X,则使用了DHCP让全网同时在线的人数达到X。
回到PAT,由于端口号有65535那么多,减去1024个知名端口理论上还有60000多个那么多,但是实际上联网主机的连接数一定不只有一个,所以一个IP地址大概能提供几千台主机同时上网(理论上如此,实际上并不会有那么重的负载)。
最后的结论是:私网地址+DHCP+NAT(PAT)三种技术的结合,大大缓解了IP地址短缺的问题,导致我们现在的IPV4还在苦苦支撑,也因此IPV6如今还不是那么“必须”。
【NAT的缺陷】
★ 我们已经看到了NAT技术强大的作用,那么NAT的缺点呢?对NAT缺点的讨论回应了本文的主题:网络设计问题。NAT技术实际上破坏了很多的设计原则。
·1 NAT打破了Internet端到端的连接模型。即任何一个主机可在任何时间给任何一台主机发送数据包。设想一下采用了NAT技术的主机,当NAT盒子(实现NAT的设备可以使路由器,防火墙等)崩溃的时候,是无法正常与因特网通信的。另外一个理解是,主要采用了NAT的一方(A方)先发送数据给另一方(B方),另一方才能与采用了NAT的一方通信。因为只有一个最先到来的数据包告诉B方,B方才能获知A方与NAT的映射(即转换后的地址)B方根本无法主动发送消息给A方。最后的问题是,如果外部的主机想使用内网的服务器,必须进行特殊的配置或者采用NAT穿越(NATtraversal)技术
·2 NAT将Internet从一个无连接网络改变成一个面向连接的网络特有的形式。问题在于NAT盒子必须为每一个经过的连接维护必要的信息(映射关系)让网络维护连接状态时面向连接网络的特性而不是无连接网络的特性。面向连接的网络的特点是非常脆弱。设想通信双方在传输层采用TCP的情况:在无NAT情况下,路由器崩溃仅会导致未被确认的数据包重传。但如果NAT盒子崩溃,那么所有的TCP连接都被摧毁。
·3 NAT违反了IP的一个基本的理念与结构模型:IP的结构模型声明IP地址唯一标识了世界上的一台机器。但有了NAT之后,成千上万的机器可能会使用同一个IP地址。不过,这有时候也是一种优势,比如用在服务器的负载均衡上。
·4 最重要的一点,NAT违反了最基本的协议分层规则:第K层不应该对第K+1层在本层的有效载荷字段放什么做任何假设。回想一下分层模型的基本作用:区分协议,服务,与接口。底层的协议对高层的协议提供的是服务,而根本不管底层协议如何实现与改变,无论底层如何演进与更新都不应该对高层有任何影响。NAT工作在网络层,但却要求传输层一定要使用有“端口号”的协议,如TCP,UDP。并且,如果TCP升级了,使用了32位的端口号(而不是现在的16位),NAT将无法正常工作。NAT的特性显然破坏了层次之间的独立性。
·5 还有一些NAT相关的疑难问题:例如,某些应用层协议(如FTP)使用多于一个的连接。在FTP应用层正文内会包含一个IP地址,用于告诉主机下一个连接的IP是什么,但NAT不会意识到这一点,它无法识别应用层数据,因此也无法对此进行转换。目前的解决方法是给NAT“打补丁”,但每次都有问题就打补丁显然不是一个好主意。
·事实上,NAT虽然存在如此多的问题但仍然被广泛应用,如今经常与防火墙结合在一起提供隐私性。下面我抛砖引玉(挖坑=.=)再提出一些NAT在实际应用中的问题:
1)NAT技术经常和防火墙技术结合,同样牵扯上关系的还有VPN技术。通常都要采用NAT穿越来解决此类问题
2)NAT与路由相结合:NAT生效的时机究竟应该是在查找路由表之前还是之后?对于这个问题的最简单答案是:转换源IP的时候,通常先查找路由表再做NAT。而转换目标IP时则相反,必须先做NAT再查找路由表(通常发生在公网数据包返回私网的情况)
3)关于NAT与防火墙/ACL过滤也有与(2)同样的问题,即NAT与过滤生效的先后顺序。本人做了如下总结:
■数据包出(私网到公网):
A 防火墙对目标地址做限制:不管是否先进行NAT,目标地址不会变,无影响
B 防火墙对源地址做限制:如果先进行NAT,则新的源地址是随机产生的,映射关系为动态,不可行
结论:数据包出是先经过防火墙再进行NAT。
■数据包入(公网到私网):
A 防火墙对目标地址做限制:此时的NAT映射是静态映射,即使采用的是PAT,一个端口二元组也固定对应一个新IP端口二元组(一种服务)因此先进行NAT或先在防火墙过滤性能上是等价的
B 防火墙对源地址做限制,但NAT并不改变源地址,无影响
结论:数据包入,先进行NAT或防火墙过滤都可。
4)更深入的NAT研究-多种NAT模式
★★★非常看些看完这篇文章的大神们,如有任何疑问或错误请不吝赐教。
主要参考文献:
《计算机网络》Andrew S.T