网络地址转换NAT
要知道到每个IP使能的设备都需要一个IP地址。以一个家庭为例,假设当地的ISP已为该家庭分配过一块地址,但是后期家庭中的智能设备增加(智能手机、电脑等),这些都需要IP地址才可上网,此时应该怎么办?
此时就需要一种管理IP地址的方法, 网路地址转换(Network Address Translation)就是一种简单的方法。 NAT本质上是一种允许在互联网的不同地方重复使用相同的IP地址集的机制。
看图介绍
这是NAT使能的路由器的运行图。在NAT后(图中右边)的主机使如家庭、公司的专用网络或者具有专用地址的地域(realm)中的地址,通过NAT路由器与外界交互(NAT的工作原理就是重写通过路由器的数据报的识别信息)。
具有专用地址的地域:指其地址仅对该网络中的设备有意义的网络。在图中右侧有四个接口具有相同的网络地址10.0.0.0/24。假设有数十万个家庭网络都使用这样的地址空间,并与外界进行交互(接入全球因特网),显然,这个地址空间中的任何地址都不可以作为报文的源地址或者目的地址。也就是说,10.0.0.0/24地址空间在给定的网络中才有效,与外界交互需要进行地址转换。
从图中可以看出,所有流出NAT路由器的报文都拥有相同的源的地址138.76.29.7,流入路由器的报文都拥有相同的目的地址138.76.29.7。从此可以看出,NAT路由器对外界隐藏了该网络中的细节。所有从广域网到达NAT路由器的数据报都拥有相同的IP地址,现在问题是,路由器怎样将到达的数据报转发给内部主机?那便通过上图所示的NAT转换表(NAT Translation table),在表中包含端口号及IP地址。
初始地址来源:该路由器和该网络中的所有主机都是通过DHCP(可见上一篇文章)获得地址的。NAT路由器从ISP的DHCP服务器得到它的地址,并且运行一个DHCP服务器,为位于它控制的计算机提供地址。举个例子
介绍NAT路由器的工作流程。
如上图所示。假设以为家庭用户使用主机10.0.0.1请求IP地址为128.119.40.186的某Web服务器(端口为80)上面的一个Web页面。主机10.0.0.1使用了端口号3345(系统指派)并将数据报发送至LAN端。数据报的源地址为主机地址,目的地址为所访问的Web服务器地址。
路由器接收到该数据报,为该数据报生成一个新的端口号5001(未在NAT转换表中的端口号)。将源IP替代为广域网一侧接口的IP地址138.76.29.7,且将数据报中源端口替换为5001。路由器在NAT转换表中增加一项。
服务器收到该请求后进行响应返回响应报文,目的地址为NAT理由器地址,目的端口号为5001。
NAT路由器收到响应报文后,依据报文中的目的IP和目的端口号在转换表中检索合适的目的IP地址(10.0.0.1)和目的端口号(3345)。并修改数据报中的目的地址个目的端口,向家庭网络中转发该数据报。
关于NAT的一些问题
虽然NAT在近几年得到了广泛地应用,却也存在了一些问题,①“违规”使用端口号,一般端口号是用于进程编址②路由器应为三层交换机不能但是NAT路由器却处理了运输层的内容③违反了“端到端”的原则等。但是,存在即合理,现在NAT已成为因特网的一个重要组件了。
NAT还有一个重要的问题便是它妨碍了P2P应用程序,包括P2P文件共享应用和P2PIP语音。
在P2P应用程序中,任何参与对等方A应当能够对任何其他参与的对等方B发起一条TCP连接。所以该问题实质在于,如果对等方B在一个NAT后面,那么它将不能充当服务器并接受TCP连接。(A单独无法得知B的地址)现在假设对等方A不在NAT后面,对等方B在NAT后面,对等方C不在NAT后面。C与B已经创建了一条TCP连接,如果A想与B创建连接,则需要通过C请求对等方B,发起直接返回对等方A的一条TCP连接。一旦二者建立一条直接的P2P TCP连接,两个对等方就可以交换报文或文件了。
这种雇佣关系被称为连接反转(connection reversal),已被许多P2P应用程序用于NAT穿越(NAT traversal)。若A,B二者都在NAT后面则可使用应用程序进行中继处理。
UPnP
NAT穿越正越来越多地由通用即插即用(UPnP)提供,UPnP是一种允许主机发现并配置邻近NAT的协议。UPnP要求主机和路由器都是UPnP兼容的。
使用UPnP,在主机上运行的应用程序可以为某些请求 向NAT路由器请求一个公共端口号 生成一个一个NAT映射。 如果NAT接收该请求并生成映射,则外部的结点可发起((公共IP地址,公共端口号))的TCP连接。这事先UPnP需要让应用程序知道(公共IP地址,公共端口号),然后该应用程序便可向外部通告它。 总之,UPnP允许外部主机使用TCP或者UDP向NAT化的主机发起通信会话。
上面算是对NAT有了一个基本的理解。下面再对NAT进行一些补充。
传统的NAT:基本NAT和NAPT
根据NAT思想行为的不同实现,出现了不同类型的NAT。
传统NAT(traditional NAT)包括基本的NAT(basic NAT)和网络地址端口转换(Network Address Port Translation,NAPT)。除非进行区别,我们所说的NAT通常包括以上二者。
基本的NAT:只执行IP地址的重写。本质上就是将私有地址(专用网络中的地址)改写为一个取自于ISP提供的地址池或公有地址范围的公共地址。这是一种IP地址一对一的转换,并没有减少IP地址的使用。改了了IP地址,但是保留端口号不变。
NAPT使用传输层标识符(TCP/UDP端口,ICMP查询标识)来确定一个特定的数据报到底和NAT内部的哪台主机关联。这样,要使用的公有地址就会很少,通常只需要一个。
虽然在NAT后的私有主机使用的IP地址不受什么限制,也可以采用全局地址空间。但是当这样的全局地址空间也被互联网上的另外一个实体所使用时,在私有地址范围内的本地系统极有可能访问不到使用相同地址的公共系统,因为采用相同地址的本地系统会屏蔽掉使用相同地址的远端系统。
为避免此种不良情况,保留了3个IPv4地址范围作为私有地址范围使用[RFC 1918]:10.0.0.0/8,172.16.0.0/12,192.168.0.0/16。 下面NAT所支持的几种主要传输协议。NAT和TCP
从建立TCP连接(“三次握手”)开始介绍。设私有主机10.0.0.126(端口号为9200)向服务器212.110.167.157发起TCP连接。
NAT路由器接收到该数据报后,会注意到这是一个新的连接,如果策略允许,那么数据报中的源地址会被修改为NAT路由器的外部接口IP地址63.204.134.177,源端口号不会改变(端口保留)。NAT转发数据报时,寻址就变为(63.204.134.177:9200;212.110.167.157:80)。
此时,NAT还将在内部状态记住当前正在处理一个新连接(NAT会话),也就是NAT映射(NAT mapping)。
服务器将响应报文发送至(63.204.134.177:9200)
NAT路由器依据数据报中的目的端口号在映射表中查找合适的内部主机,然后将数据报的目的地址改为(10.0.0.126:9200)对其进行转发。
然后客户端收到对请求的响应,这样在多数情况下表示已经连接到服务器。
上述例子说明在正常情况下是如何建立一个基本NAT会话,但是并未说明会话是如何被清除的。
正常情况下,会话会在交换FIN数据报之后被删除,但是若不是正常关闭连接,那么会导致NAT映射仍然被保留在内存中。因此,当流量很少时,NAT必须清除这些被认为已经“死亡”的映射条目。TCP连接的简化版本
大多数的NAT都包括一个TCP连接的简化版本,并可以区分连接成功还是失败。
特别地,NAT在检测到一个传出的SYN数据报后会激活连接计时器(connection timer),如果回复的ACK报文在计时器到期之前还未到达,则该会话状态会清除。 如果ACK报文到达,计时器将会被清除,并创建一个超长时间的会话计时器(session timer)(用小时替代分钟)。 这时,NAT可能会向内部的端点发送一个额外的数据报,用于确认该会话是否已经终止(称为探测(probing))。如果收到ACK,NAT认识到该连接仍然是活跃的,则会重置计时器,不会删除会话。 如果没有接收到响应(在关闭计时器(close timer)超时之后)或者收到一个RST数据报,表明该连接已经终止,状态将被清除。NAT和UDP
NAT处理UDP数据报时出现的问题与处理TCP时的大多数一样,但是UDP有些不同,UDP没有连接建立和清除的过程。详细点说,UDP没有标识位,如SYN,FIN和RST这些位来表示一个会话的创建或销毁。此外,一个关联中的参与者也未必完全清楚。UDP采用基于两个端点的地址/端口号的组合标识一条连接。
NAT在处理UDP数据报时,如果一个绑定在“近期”没有被使用,UDP NAT会采用一个映射计时器(mapping timer)来清除NAT的状态。“近期”[RFC 4787]要求计时器至少为2分钟,推荐5分钟。计时器何时被刷新?
当数据报从内部传输到外部时NAT就刷新(NAT对外刷新行为),反之亦然(数据报从外到内,刷新对内部的计时器)。对内刷新行为是可选的。当出现IP分片时,除了第一个分片包含端口号信息,其余分片都没有,这就会影响NAT的正常操作。因此,NAT/NAPT不能正确处理分片。
NAT和ICMP
ICMP提供了关于IP数据报的状态信息,也可以用于测量和收集网络状态信息。
ICMP有两种类型的报文:信息类和出错类。 出错类报文通常包含一个引起错误条件的IP数据报(全部或者部分)的副本。它们从错误被检测到的端点,发送到数据报的原始发送方。ICMP差错报文经过NAT时,需要改写“错误数据报”的IP地址,以便被内部主机识别(称为ICMP修复行动(ICMP fix-up))。 对信息类报文处理情况和出错类的差不多,信息类大多数是查询/响应或客户/服务器性质的,还包括一个类似于TCP/UDP端口号的查询ID(Query ID)字段。因此,处理这些类型的NAT要能够识别这些向外传输的信息请求,并设置计时器等待响应。地址和端口转换行为
NAT的操作方式差别很大,大部分细节设计具体的地址和端口的映射。
以《TCP/IP详解(卷1)》中的图为例介绍。
假设内部主机,先连接到Y1:y1,然后连接到Y2:y2,则NAT服务器先创建映射X1':x1',然后创建X2':x2'。在大多数情况下,X1'=X2',因为大多数服务器只使用一个全局路由的IP地址。如果x1'=x2',则映射被认为是重复使用的。如果x1'=x2'=x,那么就是前面所说的端口保留。在一些情况下,端口保留不能存在,因为会存在冲突问题。
NAT的全局行为将由其转换和过滤行为定义。
这些都可能是独立于主机地址、以来于地址、或依赖于地址和端口号行为名称 | 转换行为 | 过滤行为 |
---|---|---|
独立于端点的 | 对于所有的Y2:y2,X1':x1'=X2':x2'(必需的) | 只要X1':x1'存在,就允许X1':x1'的任何数据报 |
依赖于地址的 | X1':x1'=X2':x2'当且仅当Y1=Y2 | 只要X1'之前联系过Y1,就允许从Y1:y1到X1':x1'事务数据报 |
依赖于地址和端口的 | X1':x1'=X2':x2'当且仅当Y1:y1=Y2:y2 | 只要X1'之前联系过Y1:y1,就允许从Y1:y1到X1':x1'事务数据报 |