作者简介:
张立霞,美国UCLA计算机系教授,互联网体系结构委员会(IAB)委员,IETF IRTF Routing Research 工作组副主席(co-chair), ACM 会员(Fellow),曾担任ACM SIGCOMM 副主席(1999-2003), IEEE Communication Society Internet 技术委员会副主席(1995-2000), ACM Computer Communication Review主编(1991-1999),IEEE/ACM Transactions on Networking (1992-1998)编辑委员会委员。
张立霞教授是互联网领域知名的学者,主要研究方向包括互联网体系结构、路由和域名系统、网络安全等。其他相关信息可以访问张教授的主页:http://www.cs.ucla.edu/~lixia/
对地址转换(NAT)的回顾与反思
张立霞(Lixia Zhang)
【注:本文不是IETF在NAT领域全面的总结,只反应作者本人的观点。】
今天互联网上的网络地址转换设备(NAT)随处可见。NAT的广泛采用不是由于设计、也不是规划,而是由于互联网持续增长的需求。这种增长不仅是对地址空间的需求,还在于NAT能够提供其他的功能。本文给出了作者观察到的NAT发展历史、我们从中应该吸取的教训,对于已经走到今天的互联网,有助于我们看清以后发展的最佳方向。
引言
NAT一般是指连接本地网络和公众互联网的一个盒子,局域网在盒子后面,使用RFC1918中指定的私有IPv4地址。在最早的互联网体系结构设计中,每个IP地址是全球唯一而且是从全球都可以访问的。私有IPv4地址只在NAT后面的局域网内部有意义,因此,私有地址块可以在不同地方重复使用,只要这些局域网之间不直接相连。他们可以通过NAT进行通信,就象与互联网其他部分进行通信一样。
就像很多意想不到的成功一样,15年前(RFC1287和RFC1335刚出来),谁也没料到NAT会这么普遍。如果那时有人预料到了,NAT的部署可能是另一个样子:会有更好的规划和标准化。同样,如果当初有先见之明,那么15年来Internet的协议族的研究与发展也许是另一个样子,没有我们今天看到的那么复杂。
尽管时光不能倒流,但我想,重新审视NAT的历史,从中吸取有用的经验还是值得的;而且,这种审视对于我们评估或者重新评估NAT的优缺点,认清我们今天所处的位置,找到最佳的前进方向,都是非常有意义的。
我要强调的是以下只是我个人的观点,我对历史的回顾可能不全,可能出错,而且就像我们对于互联网的理解不断变化一样,我的观点也不是一成不变的。
地址转换(NAT)是怎样工作的
我先前提到,IP地址设计为全球唯一和全球可达的,这是支持Internet端到端体系结构的基石。直到最近,几乎所有Internet协议,特别是应用层以下协议,都是基于上述IP地址模型的。但是90年代初以来,Internet的爆炸性增长不仅预示了IP地址空间耗尽的危险,而且实际已经也对地址产生了迫切的需求:突然,为了连接大量的用户网络和家用电脑,对IP地址的需求时间紧迫,数量巨大。这种需求无法通过常规地址分配来满足,于是NAT应运而生了。
因为NAT广泛部署以前并没有标准化,所今天存在许多不同的NAT产品,无论从功能还是技术细节都有所不同。本文讨论的是NAT发展的历史——不是研究具体的NAT盒子——我只是以一种主流的NAT实现为例子,感兴趣的读者可以通过wikipedia了解不同的NAT产品。
我们把NAT看作一个盒子N,它有一个公网地址的接口连到Internet,一个私有地址的接口连到内网,内网的所有联网计算机都把N作为去往公网所有目的的默认网关。当内网一台主机H发送数据包P给Internet上的主机D时,数据包将被路由到NAT盒子N。N把数据包P头部的源地址(私有地址)转换为公网地址,并且在NAT内部的映射表中增加一个条目,记录这内部主机和出去的数据包地址的映射关系。一个条目就代表了一部份状态,保证所有后续的数据包可以在主机H和D之间进行交换。比如,如果D对数据包P发出了一个响应包P’,P’会三到达N; N根据前面映射表中相应的条目,把P’包头中的目的地址(N自己的公有地址)转换为实际的目的地址H,于是数据包P’就到达了目的主机H。如果D和H之间长时间没有通信,NAT内部映射表中对应的条目会超时,这个超时的时间一般由厂商指定。在处理IP数据包进行地址转换时,NAT设备必须重新计算IP头的校验和——以及传输层的校验和——如果它们受IP地址影响的话,比如TCP 和UDP的校验和。
从上面的描述中很容易看出NAT最大的好处:用单个公网地址就可以把大量主机接入到Internet;而且,随着时间的推移,其他的好处也逐渐显露出来,本文后面将详细讨论。
但同时,NAT的几个缺点也很明显;首先,也是最重要的,NAT从根本上改变了Internet体系结构中端到端的通信模型。主机之间不能直接通信,而必须要经过NAT;而且通信必须由内部主机发起才能建立NAT内部映射表的条目。另外,NAT容易成为单点故障,因为所有出入的数据交换都要依赖于NAT内部的地址映射表,一旦崩溃,所有现存的状态都将丢失,内外部的通信都将必须重新开始。这样就违背了IP层最初的目标:只要源和目的之间存在物理连接,就可以发送数据包。此外,由于NAT修改了IP地址,所有依赖IP地址的协议都受影响。在某些场合,比如TCP校验和,NAT可以转发时重新计算以隐藏这种修改。但一些直接使用IP地址的协议,如IPSEC,在存在NAT的环境中就无法再像最早设计的端到端模式来使用;而一些在应用层数据里嵌入了IP地址的应用层协议,就要求应用层网关处理这种地址的变化。NAT还有一些缺点只是在最近才浮出水面,本文下面还会讲到。
NAT历史回顾
在1981年9月RFC791(IP协议)发布时,我正在麻省理工学院(MIT)读研究生,从事网络研究工作,因此我有幸见证了被称为Internet的这一新系统那令人陶醉的诞生过程。在接下来的10年里,Internet飞速发展。1991年发布了RFC1287“面向未来互联网的体系结构”,它可能是第一个关注在可预见的将来IP地址耗尽问题的RFC。
RFC1287 也提出了3个可能的方向来扩展IP地址空间。第一种类似今天的NAT:“把32位地址替换为等长但不同意义的地址,这个地址不再是全球唯一,只在小范围内唯一。”
RFC1335于1992年5月发布,它更深入探讨了用内部地址(即私有地址)来解决IP地址耗尽问题。而第一篇正式提出NAT的文章“通过地址重用扩展IP互联网(Extending the IP Internet Through Address Reuse),”发表在1993年1月的Computer Communication Review上,并在1年后作为RFC1663发布。尽管这些RFC可以看作NAT的先驱,但由于种种原因(我们稍后解释),IETF没有开始NAT标准化的工作。
Web的出现进一步加速了Internet在90年代初的发展,爆炸性的增长迫使人们解决路由可扩展性和地址不足的问题。为此,IETF采取了一系列措施,最终发起了IPng的开发工作。我想当时是期望几年内就搞出一个新的IP协议并快速部署。然而,以后10年中实际的部署却走了另一条出乎意外的道路。
原计划的解决方案
正如RFC1287指出的,Internet的持续发展暴露了原理设计上的一些缺陷,其中最重要的两个,一是路由可扩展性,二是地址空间的耗尽。由于根本上来解决需要长期发展和部署,在开发长期解决方案的同时,也应该发展短期的解决方案。
CIDR(无类域间路由)是一种短期的解决方案。它去掉了IP地址分类的结构,提高了地址分配效率,延长了IP地址空间的寿命。CIDR也有利于路由表的聚类,减缓了路由表的增长。然而,正如RFC1481(IAB对扩展性问题的中间策略的建议)指出:“CIDR的前提是假设在互联网技术领域开发一个适当长远的解决方案”。的确,在1992年后期,IETF为这个问题成立了几个工作组致力于开发新的IP协议,IESG在1993年也建立了一个新的Ipng领域来协调这方面的努力。
CIDR很快被推广开,有效的减缓了Internet路由表的增长。但也由于很快部署,它没有解决日益严重的路由可扩展性问题,特别是站点多宿(site multihoming)问题。一个多宿站点(multihomed site)接入到多个运营商网络,可以从多个网络被访问到。在已有的路由体系结构下,这一需求转换为全局路由表中列出的站点前缀(prefix),而CIDR技术使得前缀聚类实效。(感兴趣的读者请参考发表在2006年9月IETFjounal的文章“An Overview of Multihoming and Open Issues in GSE”,可以对多宿站点以及给路由带来的影响有更多了解)。
另一方面,新IP协议的开发比人们开始着手研究时所想象的要慢得多。我写这篇文章的时候,IETF终于结束了IPv6工作组的工作,此时距离它的成立已经13年了。IPv6的部署也很慢,今天仅有少量IPv6 试验性的部署。运营商方面已经有IPv6的网络,但还没有听说以IPv6作为主要协议联网的商业站点。
如果有一天有人写IP协议发展的历史,回顾并理解IPv6发展如此缓慢的原因将是十分有趣的。即使不做任何研究,我们也有理由相信NAT在解决因互联网所需的IP地址方面起了很大作用,至少是推迟了对新IP协议的需求。
没有计划到的现实
尽管大大地出乎意料,NAT的确在Internet互联网接入的爆炸性增长方面发挥了重大的作用;事实上,Internet的增长很大程度上是NAT的增长。今天,一家有多台计算机、甚至多个LAN接入Internet已经司空见惯了,然而,每个家庭要从运营商获得多个IP地址,简直是无法想象的。有了NAT,家庭网络常见的配置是通过NAT把一个或多个家庭网络和本地的运营商网络连起来。同样,大部分企业网也部署了NAT。众所周知,像中国和印度这样的人口大国里,大部分主机都通过NAT接入互联网,那些刚刚接入互联网的货架也是如此。如果不是NAT,IPv4的地址也许早就要耗尽了。
而因为后面谈到的原因,IETF对NAT的实现和运营没有标准化。尽管如此,很多厂家生产了大量NAT设备,而NAT的部署也如燎原之火,下面将描述NAT诱人之处。
NAT为何能够成功
在我们期望新的IP协议作为长远解决方案的时候, NAT只是作为短期方案出现的。RFC1918首先描述了NAT公认的优势:
“如果采取NAT方案,许多大企业只需要很小一块公网地址。互联网会从中受益,因为节省了全局唯一地址空间,有效延长了地址空间的寿命;企业也会受益,因为很大的私有地址空间意味着灵活性。”
今天NAT带来的好处远不止当时提到的这些,特别是,NAT这种映射关系造成了内网和外网连接时多了一个中间层。“在计算机领域,任何问题都可以通过多加一个中间层来解决。”这个中间层使NAT有如下特点:
–NAT可以单方面部署,无须和任何人协商;
–无须批准,人们可以使用很大一片私有地址(1600万),而与外面连接时只要一个公网地址就够了。事实上,大多数用户很难得到一个比他们近期需要大得多的IP地址块。
–中间层意味着改变网络服务商时,只要改NAT而无须对内部网络重新分配IP地址。
–同样地,NAT使多宿(multihoming)变得容易。一个NAT设备可以连到多个网络服务商,使用不同服务商提供的公网IP地址。这样,NAT不仅对内部主机网屏蔽了连接多个ISP的细节,而且对网络服务商来说,也不许要任何一个运营商在他们的路由公告中“打一个洞”(使得ISP路由表中的地址块变得很碎)。
–NAT这个中间层也意味着多了一层保护,因为外部主机不能直接发起连接,它们也很难猜到内网的拓扑结构。
最后一点但并非最不重要的一点是,NAT被快速采纳的一个重要原因是在第一天就可以意识到他的好处,但是它潜在的缺点却在日后才慢慢显现出来。
NAT的另一面
NAT不允许外部直接访问内网中的主机,因此内网主机不能作为服务器。开始,人们认为没必要在内网部署服务器,NAT这一体系结构上的限制反而被看作安全的特征,并且对用户和网络使用没什么影响。例如,RFC1335就罗列了使用私有地址的四大原因:
1. 在大部分网络,流量都仅限于内部访问,这是网络应用的性质和网络之间链路带宽的限制所决定的。
2. Internet上服务器的数目是很有限的,即那些运行着服务程序,等待其他网络中的请求的计算机,在所有主机中只有很少一部分。
3. 越来越多的个人主机接入Internet,而这些机器主要访问本地,它们也可以作为ftp 和telnet的客户端访问别的机器。
4. 由于安全上的考虑,一些大的机构,如银行、政府部门、军事机构和大公司,只允许它们的少量机器访问Internet,大部分机器都只在内部使用。
然而,随着时间的推移,上述理由基本上被证明是错的。
今天,带宽不再是主要瓶颈。在过去几年里,VOIP(voice over IP)成了一个很流行的应用。它改变了应用的模式,从客户-服务器模式变为P2P模式,而在P2P情况下,每个主机都有可能呼叫其他的主机。考虑到超过一半的主机使用NAT,为了支持VOIP的应用我们不得不开发穿越NAT的解决方案。近来出现的一些P2P应用,如BT,也不得不开发自己的的NAT穿越方案。
不仅是改变了应用模式的问题,使用私有地址也给NAT带来其他问题。例如,公司之间的合并要求原来使用NAT的两个网络互连,不幸的是,这两个网络使用相同的私有地址块,导致地址冲突。另一个是最近出现的问题。我们通常把一大块私有地址段10.0.0.0/8称作“10网段”,一些服务商或大企业的10网络也因为业务的发展导致或即将导致这个私有地址空间耗尽。我们要问,接下来怎么办?有的转移到IPv6去,另外一些干脆自己决定使用另一个未分配的IP地址块。
另一种常见的误解是认为NAT是一个有效的防火墙,部分原因是在部署NAT的地方,通常在NAT上实现了防火墙功能。单纯的NAT是不能成为有效的防火墙的。无数使用NAT的家用电脑被入侵,成为垃圾邮件或DDOS的工具。防火墙通过对出入的数据包设置控制规则,把被入侵的风险降到最低;只有好的控制策略(policy)才能使防火墙有效对付恶意流量,单纯把它配置成NAT不能达到以上的效果。
为什么IETF错过了把NAT标准化的机会
在NAT开始部署的10年里,IETF内部对是否应该部署NAT有很大争议。NAT使用私有地址,这样就偏离了IP协议的基本模型:为任何主机之间提供端到端的可达性,违背了互联网最初的体系结构。这场争论持续多年,最近在2000年4月,IETF的mailinglist上有则消息称,NAT从结构上就是不合理的,IETF和IESG决不应该提倡使用部署NAT。有这种想法的人不在少数。
今天大多数人认同IETF最初没有标准化NAT是错误的。为什么错过了机会?简单来说是由于当时一切都不明朗。我相信稍微深入一点就能理解不明朗的原因。我认为下面的因素起了很大作用:
首先,我想大家对设计部署一个新的IP协议的可行性做出了错误的判断,在所需的时间和努力方面都过于乐观。那些反对标准化NAT的人希望尽快搞出新的IP协议来满足Internet的需求。但是,他们对困难的估计少了一个数量级,新协议的开发需要时间,而互联网的发展却不能等待。NAT只是一个不可避免的结果,可惜IETF圈里的人当时没看清楚。
另外一个相关因素是对工程上的妥协(trade-off)缺乏足够的理解。体系结构的原则应作为解决问题的指导,它指导我们找到一种全面的解决方案。然而,把端到端可达性模型当成绝对真理,在当时完全排除了NAT作为解决地址问题的一种可行的手段。此外,对体系结构模型的这种绝对观念,使得人们只看到NAT不好的一面,看不到它前面所述优势的一面,更不用说提出一种基于NAT又减轻其对端到端影响的方案。
对NAT的误判让我们付出了很大的代价。NAT在争论中开始部署,由于缺乏标准,不同NAT产品有不同的行为。许多Internet协议也是这时开发或完成的,如IPSEC,SAP,SIP,它们都基于IP体系结构最初的模型设计,即IP地址全球唯一且可达的。当真正部署时,他们却面临一个与设计不匹配的环境。它们不仅要解决穿越NAT的问题,还要解决不同NAT产品的行为不一致问题。
尽管NAT得到事实上的承认,关于部署上的一些疑惑并没有解决。比如最近关于使用E类地址用法的争论。E类地址是240.0.0.0/4的一块,至今保留未用,很多路由器和主机都禁止使用E类地址。先不说要不要求它们使用,争论的焦点在于E类地址应该归入公网地址还是私有地址。如果归入私有地址,那些面临10网段耗尽的网络又将得到一大片地址;但是,这同时也是反对的主要原因,反对者希望这些网络过渡到IPv6上去。这种要求似乎合理,过去反对NAT标准化时就是这样说的。如果过去预示着将来,我们应该认识到是经济上的可行性,而不是压力决定着一个协议的部署。我不是说过渡到IPv6经济上不可行,相反我相信可行;我要说的是,我们还需要更多的努力,不仅在协议的开发方面(为了使新的IP协议成为现实),还要有更多的资料和证据(为了说明转移到IPv6短期和长远的利益)。
现在可以/应该做什么
很早就预言IPv4地址耗尽,今天终于来到我们面前,然而IPv6的部署才只是微露曙光。IETF能够/应该做些什么,保证互联网走上一条正确的未来之路?我希望对NAT历史的回顾能够给我们一些启示。
首先,我们要承认NAT不仅大规模部署了,而且在有些地方还会永远存在。对NAT的优点和不足应该有更全面的认识,前面对IPv4网络中NAT的讨论只是一个起点。我们不要把所有地址转换方法都看作坏东西,不惜代价的去避免。几年前,一项名为NAT-PT的IPv4到IPv6过渡方案(RFC2766 )被提出来,但不久就被归入历史状态(historical status,是指被认为过时而从Internet协议集清除的协议),基于以下原因:(1)它的工作原理和IPv4NAT类似;(2)它不能应付所有过渡的情况。不过,通过对NAT的回顾,我们似乎应该重新审视这一决定。IPv4和NAT在可预见的将来仍然存在,这样NAT-PT在桥接只支持IPv4的主机和IPv6主机之间有不可替代的作用。甚至有人讨论IPv6下的地址转换,这值得我们注意。在IPv4和IPv6互通和IPv4向IPv6 过渡的过程中,互联网应该有一些好的工程标准和操作指南,以便使得两类网络的互操作性最大化,而不是重蹈IPv4的错误。
接受NAT存在于今天的网络体系结构之中,并不是说我们就简单的接受现存的NAT穿越方案。相反,我们要好好设计一个方案,使之尽量和互联网的体系结构一致。这方面一个新进展是NATTT(NAT Traversal through Tunneling)项目(网址http://www.cs.arizaona.edu/~bzhang/nat)。不同于大部分已知的基于服务器、依赖特定协议的穿越方案,NATTT致力于提供一种普遍的、可增量部署、支持所有应用和传输协议的穿越方案。
最后(但并非最不重要),我认为必须意识到成功的网络体系结构能够并且应该是随时间变化的。一个新的系统总是从小开始,一旦成功,就会变得很大,面临当初设计时完全没有预见到的新环境,以及全新的需求。为了很好的调整一个已经成功的体系结构,我们必须对其关键组成部分以及调整带来的潜在影响有一个全面认识。我认为IP地址就是这样一个关键部分,它直接或间接地影响到互联网体系结构的其他部分。IPv4的NAT改变了IP地址的语义,NAT带来的影响就足以说明这一点。IPv6开发过程中,也有很多的奴隶涉及IP地址语义的修改,比如引入link-local和site-local地址这样的概念。site-local地址后来被一种叫ULA(Unique Local IPv6 Unicast Address)的地址取代。关于ULA确切含义的争论仍在继续,IP地址最初设计时定义为全球唯一的、全球可达的,而且是互联网接入点的标识。可路由和作为互联网接入点的标识。随着互联网体系结构的演进,不断有人提出改变IP地址最初定义的建议。究竟怎样定义IP地址呢?我相信在今天互联网发展的关键阶段,全面考察IP地址在变化着的体系结构中的角色,是非常值得关注的。
致谢
我衷心的感谢Mirjam Kuhne 的在本文成文过程中的鼓励和耐心,另外感谢Wendy Rickard 为使本文更加可读而付出的辛勤劳动。