4.2 NAT 存在的问题
虽然前面所讨论的NAT应用都非常简单明了,但NAT的底层功能却并不如此简单,主要有如下两个原因。
• 需要全面处理IP和TCP头部;
• 某些特定协议和应用程序的特性。
更改IP地址或TCP端口号的内容可以更改某些其他字段的含义,尤其是校验和。许多协议和应用程序都是根据数据字段中的IP地址来携带IP地址或信息,因而修改头部中的IP地址可能会更改被封装数据的含义,从而可能会破坏该应用。本节将讨论与NAT操作有关的常见问题。
4.2.1 头部检验
由于IP包的校验和是对整个头部进行计算的,因而当源IP地址或目的IP地址(或两者)发生了变化后,需要重新计算校验和。TCP头部的校验和也一样如此,需要根据TCP头部和数据来计算校验和。同时,还要对包含了源IP地址和目的IP地址的伪头部计算校验和,因而当IP地址或端口号发生变化时,TCP的校验和也必然发生变化。Cisco的NAT机制可以完成这些校验和的重新计算功能。
4.2.2 分段
回顾4.1.7小节的内容,可以让NAT根据目的端口号目的地址转换为不同的本地地址。例如,可以将目的端口号为25的数据包转换为特定IL地址,而将携带其他目的端口号的数据包转换为其他IL地址。但是,如果目的端口号为25的数据包在到达NAT路由器之前就在网络中某处被分段了,又将如何呢?包含源和目的端口号的TCP或UDP头部仅位于第一个报文片段,如果仅仅转换和转发该片段,那么NAT路由器将无法知道是否需要转换后续片段。
由于IP不能保证数据包按有序方式到达目的地,因而极有可能在第一个片段还未到达NAT路由器之前,后续片段就已经到达NAT路由器了。为此,必须设计NAT来处理这样的可能事件。
Cisco的NAT机制可以保持片段的状态信息,如果转换了第一个片段,则将保持该信息,从而可以以相同的方式转换后续到达的片段。如果后续片段先于第一个片段到达NAT路由器,则NAT路由器仅存储该片段,直至第一个片段到达后才进行检测。
4.2.3 加密
Cisco的NAT机制可以更改许多应用程序在数据字段中携带的IP地址信息。但是,如果数据字段被加密了,NAT将无法读取这些数据。因而,为了保证NAT操作的正常进行,既不能加密IP地址,也不能加密某些衍自特定内容(如TCP校验和)的相关信息。
另一种需要关注的应用是使用IPSec的VPN。对特定模式的IPSec来说,如果更改了IPSec包中的IP地址,IPSec将变得亳无意义,从而破坏了VPN应用。如论釆用了何种形式的加密操作,都需要将NAT路由器放置在安全侧,而不能将其放置在被加密路径上。
4.2.4 安全
由于NAT可以隐藏内部网络的某些细节信息,因而被某些人视为一种安全解决方案。经地址转换后的主机每次出现在Internet上的地址都可能不一样,但这至多只能被视为一种非常弱的安全手段。虽然NAT可能会延缓攻击者对特定主机的攻击速度,强迫其尝试多种IP地址欺骗程序(shell game),但无论如何也不能阻止有毅力有知识的攻击者。更糟糕的是,NAT根本就不能阻止拒绝服务或会话劫持等常见攻击。
4.2.5 协议相关问题
对发送数据包穿越NAT的终端系统来说,NAT应该是透明的,但很多应用程序(包括各种商业应用程序以及使用了部分TCP/IP协议簇的应用程序)都使用IP地址。数据字段中的信息可能会基于IP地址,或者IP地址就被携带在数据字段中,如果NAT路由器在转换IP头部中的IP地址时,根本就不知晓对数据所造成的影响,就可能会破坏这些应用程序。
表4-1列出了Cisco NAT实现所支持的应用程序。对于被表中列为在应用程序数据字段中携带IP地址信息的应用程序来说,NAT能够感知这些应用程序,并能正确地校正这些数据。请注意,表中仅列出了本书写作之时Cisco NAT所支持的应用程序,用户在部署NAT之前,应通过Cisco Web网站或TAC来查看最新的应用程序支持情况。
表4-1 直接取材自www.cisco.com网站上的Cisco白皮书:“Cisco IOS网络地址转换(NAT)包更新”。
1. ICMP
某些ICMP消息中包含了产生该消息的数据包的IP头部,表4-2列出了这些消息类型,Cisco的NAT可以检测出这些消息类型。如果消息中的IP信息与头部中被转换后的IP地址相匹配,那么NAT也将转换该IP信息。此外,ICMP头部的校验和也将像TCP和UDP那样被正确校正。
2. DNS
TCP/IP互联网络的一个核心功能(特别是对Internet来说)就是DNS(Domain Name System,域名系统),如果系统无法通过NAT获得DNS请求和响应,DNS将无法正常工作。图4-11给出了在不能转换DNS包的NAT路由器周围部署DNS服务器的方式。
图4-11中的NAT服务器进行双向地址转换:对内部网络来说,外部主机看起来就像是在网络10.0.0.0中,对外部网络来说,内部主机看起来就像是在网络204.13.55.0中。在内部和外部网络中均部署了DNS服务器,每台DNS服务器中都包含了适用于本NAT侧、将域名映射为IP地址的资源记录。
图4-11 如果NAT不支持DNS,那么必须在NAT两侧都部署DNS服务器,分别为NAT两侧的网络提供域名与IP地址的映射关系
该应用方式的一个问题就是很难维护两台DNS服务器上不一致的资源记录。一个更严重的问题是NAT映射只能采取静态方式,以匹配DNS资源记录中的映射条目,此时,地址池方式的NAT将无法工作(因为其映射关系处于动态变化中)。一种更好的应用方式(也是Cisco所支持的NAT实现方式)是让NAT支持DNS查询的地址转换。
虽然详细解释DNS的操作已经超出了本书范围,但简要描述DNS的一些重要概念将有助于读者理解DNS与NAT何时可以共存、何时不能共存。读者对域名结构可能比较熟悉,如域名cisco.com描述的就是顶级域名(com)下的二级域名(cisco)。所有IP名字空间都是以树状方式组织起来的,主机名连接在递进的更高级域名上,直至所有域名都在根部汇合。
注意: Paul Al bitz和Cricket Liu编著的DNS and BIND(O’Reilly and Associates,1992)是一本有关DNS的优秀读物。
名字服务器存储了部分域(domain)的名字空间信息,特定名字服务器中的信息可能涵盖整个域,或域的一部分,甚至是多个域,每台名字服务器上所包含的部分名字空间信息就是名字服务器的区域(zone)。
DNS服务器既可以是主用服务器,也可以是备用服务器,主用DNS服务器从文件(以本地方式存储在DNS服务器所运行的主机上)中获取其区域信息,并作为其区域的权威(authoritative)服务器。备用DNS服务器从主用DNS服务器处获取其区域信息,其方式通过区域传输(zone transfer)的进程从主用DNS服务器上下载区域文件。
由于区域传输属于文件传输,因而NAT无法从文件中解析出地址信息。即便NAT能够解析出地址信息,但是由于区域文件一般都很大,因而会给NAT设备造成严重的性能负担。如此一来,由于区域文件中的信息在区域传输过程中不会进行地址转换,因而同一区域的主用和备用DNS服务器不能位于NAT设备的两侧。
区域文件中的信息由RR(Resource Records,资源记录)条目组成,资源记录的类型主要有:为域指定权威服务器的SOA(Start-of-Authority)记录、记录别名的CNAME(Canonical Name,规范名)记录、为域指定邮件服务器的MX(Mail Exchange,邮件交换)记录以及用于Windows NT名字服务器中的WINS(Windows Internet Name Server, Windows互联网名字服务器)记录等。对NAT来说,RR的两个重要作用是提供A(Address,地址)记录(将主机名映射为IP地址)和PTR(Pointer,指针)记录(将IP地址映射为名字)。当主机需要为特定名字找出IP地址时,其DNS解析器将查询DNS服务器的A记录;如果主机希望找出特定IP地址所代表的名字(反向查找)时,就需要查询DNS服务器的PTR记录。
图4-12给出了DNS消息的详细格式,该消息用于承载来自主机的查询消息和来自服务器的响应消息。与大多数数据包头部类似,DNS消息的头部也是一组携带了消息管理和处理信息的字段,对NAT有意义的头部信息包括一个标识消息类型(查询消息或响应消息)的比特,以及用于指示包含在DNS消息其余4部分内容中的RR数量的字段。
顾名思义,Question(问题)段是一组向服务器提问的字段,问题中可以包含一个名字(服务器必须从其A记录中为该名字匹配一个地址)或一个地址(服务器必须从其PTR记录中为该地址匹配一个名字)。请注意,每条DNS消息中都包含一个且仅包含一个问题。
当然,Answer(答案)段就是对问题的回答,答案可能会列出一条或多条RR,也可能根本就不列任何RR。Authority(权威)段和Additional(附加)段所包含的信息是对答案的补充,也有可能为空。
图4-12 DNS消息格式
当DNS包穿越Cisco NAT设备时,NAT设备将逐一检查包中的Question(问题)、Answer(答案)、Authority(权威)段和Additional(附加)段。如果该消息是一条将名字匹配到IP地址的查询消息,那么将不会包含IP地址,Answer(答案)和Additional(附加)段将为空,因而也不会进行地址转换。但是,对该查询消息的响应消息来说,其Answer(答案)段中将包含一条或多条A RR, Additional(附加)段也可能会包含相应的信息,因而NAT设备需要检索其地址转换表,以在其记录中找到相匹配的IP地址。找到匹配项后将转换响应消息中的IP地址,如果没有找到匹配项,则将丢弃该消息。
如果DNS消息是一条将已知IP地址匹配为名字的查询消息(反向查找),NAT设备将检索其地址转换表,以匹配Question(问题)段中的地址。如果找到该地址的匹配项,NAT设备将转换该消息中的IP地址;如果没有找到匹配项,将丢弃该消息。对该查询消息的响应消息来说,其Answer(答案)段中将包含一条或多条PTR RR, Additional(附加)段也可能会包含相应的信息。与此类似,既可能会转换这些记录中的IP地址,也有可能会丢弃该响应消息。
总而言之,在应用DNS和NAT时应记住以下两点。
• DNS A和PTR查询可以穿越Cisco NAT设备,因而NAT一侧中的主机可以向NAT另一侧的DNS服务器提出查询请求;
• DNS区域传输进程无法穿越Cisco NAT设备,因而同一区域的主用和备用DNS服务器不能放置在NAT两侧。
3. FTP
FTP(File Transfer Protocol,文件传输协议)是一种与众不同的应用协议,它使用了两条连接(如图4-13所示)。其中,控制连接由主机发起,被主机用来与服务器交换FTP命令;数据连接则由服务器发起,用于进行真正的文件传输。
图4-13 一条FTP会话包含两条独立的TCP连接,分别是由主机发起的控制连接和由服务器发起的数据连接
建立FTP会话、传输文件的事件顺序如下。
(1)FTP服务器在TCP端口号21(即控制端口)上执行被动打开操作(也就是说,开始侦听连接请求)。
(2)主机选择临时端口用于建立控制连接和数据连接,图4-13中显示的端口号分别为1026和1027。
(3)主机在数据端口上执行被动打开操作。
(4)主机为控制连接执行主动打开操作,以便在其控制端口(如图4-13中的1026)与服务器的端口21之间建立一条TCP连接。
(5)为了进行文件传输,主机需要通过控制连接发送一个PORT命令,让服务器在主机的数据端口(如图4-13中的1027)上打开一条数据连接。
(6)服务器为数据连接执行主动打开操作,在其端口20与主机的数据端口之间创建一条TCP连接。
对某些安全网络来说,上述事件顺序可能会出现一些问题,对于部署防火墙或访问列表等常规安全实践来说更为如此。这些安全实践一般都通过检查TCP头部中的ACK或RST bit(标识一条连接请求),以此来拒绝由外部网络向任意端口发起的连接请求。可以发现,当FTP服务器试图与主机的临时端口建立一条穿越防火墙的连接时,该连接会被防火墙所拒绝。
注意: 通过关键字established,可以让Cisco访问列表查找TCP头部中的ACK或RST bit。
为了克服这个问题,主机可以使用命令PASV(而不再是PORT)来打开数据连接,该命令让服务器被动地打开一个数据端口并向主机告知该端口号。之后,主机就主动打开去往该服务器端口的数据连接,由于该连接请求是通过防火墙向外建立的(而不是向内建立的),因而不会被防火墙所阻断。
该解决方案对NAT的意义在于,命令PORT和PASV不但携带了端口号,还携带了IP地址,因此,如果FTP消息要穿越NAT设备,就必须转换这些IP地址。更糟的是,IP地址以点分十进制格式的ASCII字符进行编码,也就是说,FTP消息中的IP地址不是定长的(即正常情况下的32bit二进制表示形式)。例如,地址10.1.5.4是8个ASCII字符(包括点号),而204.192.14.237是14个ASCII字符。因而进行地址转换后会更改消息的长度。
如果进行地址转换后的FTP消息的大小保持不变,那么Cisco的NAT设备仅重新计算校验和(除了对IP头部所做的各种操作之外);如果地址转换操作让消息变短了,NAT设备将以ASCII字符0来填充该消息,以保证与原始消息的大小一致。
如果地址转换后的消息长度比原始消息长了,那么事情将变得非常复杂。这是因为,TCP的SEQ号和ACK号都直接基于TCP报文段的长度,Cisco的NAT设备中保存了一张用于跟踪SEQ号和ACK号变化情况的表,当FTP消息被转换后,就会在该表中加入一条包含源和目的IP地址及端口号、初始序列号及序列号的增量、时间戳等信息的表项,通过该信息,就可以正确地调整FTP消息中的SEQ和ACK号,在FTP连接关闭后可以删除该信息。
4. SMTP
SMTP(Simple Mail Transfer Protoc,简单邮件传输协议)消息中通常都包括域名,但不包括IP地址,但是在请求邮件传输时可以使用IP地址(而不是域名),因而Cisco的NAT设备会检查SMTP消息中的相应字段,并在发现IP地址时进行地址转换。
与SMTP用于上传邮件并在服务器之间传输邮件不同,POP(Post Office Protocol,邮局协议)和IMAP(Internet Message Access Protocol,Internet消息访问协议)仅用于将邮件从邮件服务器下载到客户端。这两个协议的消息体中仅使用主机名,从来不使用IP地址,因而这些协议的消息在穿越NAT设备时无需进行特殊的检查。
5. SNMP
SNMP(Simple Network Management Protocol,简单网络管理协议)利用各种丰富多样的MIB(Management Information Bases,管理信息库)来管理各种各样的连网设备。除了大量基于Internet的MIB组之外,很多厂商还开发了许多针对自己设备的私有MIB。
从上述基本描述可以推断,MIB中可以包含一个或多个IP地址。由于SNMP拥有大量的消息、格式及变量,NAT设备无法检查SNMP消息内容中的IP地址,因而,NAT不支持对SNMP消息中的IP地址进行转换操作。
6.路由协议
IP路由协议与SNMP一样存在类似的问题。IP路由协议的种类非常多,每种协议都有自己的包格式和操作特性,因而NAT路由器无法转换IP路由协议包中的IP地址。NAT路由器在内部接口上运行路由协议的同时,还可以在外部接口上运行路由协议,但无论是通过单一路由协议,还是利用重分发机制,路由协议包都无法穿越宣告地址变化的NAT边界。由于NAT路由器位于路由域的边界,可以使用默认地址或少量汇总地址,因而这种限制也不会带来太多的问题。
7. Traceroute
各种路由跟踪工具多多少少总有些差别,像Cisco的trace命令使用的是ICMP包,而Microsoft Windows 95下的tracert则使用的是UDP包。不过这些路由跟踪工具的基本功能都相同:首先将携带增量TTL的数据包发送到目的地,再将发送ICMP超时差错消息的中间系统的地址记录下来。如前所述,Cisco NAT设备会转换ICMP的超时消息,因而可以跟踪穿越NAT设备的路由情况。
图4-14中的NAT路由器实施双向转换操作:路由器jerry.insidenet.com的IP地址为10.1.16.50,被转换为IG地址204.13.55.6;路由器berferd.outsidenet.com的IP地址为147.18.34.9,被转换为OL地址10.2.1.3,因而jerry通过OL地址来知晓berferd。
图4-14 NAT路由器实施双向转换
当jerry向berferd执行路由跟踪操作时,目的地是10.2.1.3。例4-3显示的第一跳是NAT路由器,之后由NAT路由器将目的地址转换为147.18.34.9,将源地址转换为204.13.55.6,并将该数据包转发到外部接口。当berferd接收到该跟踪包(该包被发送到伪造端口)之后,响应一个ICMP端口不可达差错包,该包的目的地址是204.13.55.6、源地址是147.18.34.9,由NAT路由器将这些地址转换为目的地址是10.1.16.50、源地址是10.2.1.3,这也是jerry最终接收到的数据包。因而,整个路由跟踪过程一切正常,但内部设备只能看见外部本地地址。
例4-3:图4-14中从jerry.insidenet.com到berferd.outsidenet.com的路由跟踪过程显示一切操作均正常,但对内部设备来说,NAT路由器“隐藏”了外部全局地址。