应用场合
我们现在可清楚地认识到每个 IP 使能的设备都需要一个 IP 地址。
随着所谓小型办公室、家庭办公室 ( Small Office, Home Office, SOHO ) 子网的大量出现, 这看起来意味着每当一个 SOHO 想安装一个LAN以互联多台机器时,需要 ISP 分配一组地址以供该 SOHO 的所有机器使用。
如果该子网变大了 ( 例如家里的孩子们不仅有自己的计算机,而且还有智能手机、联网游戏机 ),则需要分配
一块较大的地址。
但如果 ISP 已经为 SOHO 网络当前地址范围分配过一块连续地址,且随着子网规模变大,IP 地址不够用该怎么办呢?
有一种简单的方法越来越广泛地在这些情况场合:
网络地址转换( Network Address Translation, NAT) [ RFC 2663; RFC 3022]
图中显示了一台NAT使能路由器的运行情况。
位于家中的 NAT 使能的路由器有一个接口,该接口是图中右侧所示家庭网络的一部分。
在家庭网络内的编址就像我们在上面看到的完全一样, 其中的所有 4 个接口都具有相同的网络地址10. 0.0/24。
地址空间 10.0.0.0/8 是在 [RFC 1918] 中保留的 3 部分IP地址空间之一, 这些地址用于如图中的家庭网络等专用网络或具有专用地址的地域(realm)。
具有专用地址的地城是指其地址仅对该网络中的设备有意义的网络。
考虑有数十万家庭网络这,许多使用了相同的地址空间10.0.0.0/24。
在一个给定家庭网络中的设备能够使用10.0.0.0/24编址彼此发送分组。
然而,转发到家庭网络之外进入更大的全球因特网的分组显然不能使用这些地址( 或作为源地址,或作为目的地址),因为有数十万的网络使用着这块地址。
这就是说,10.0.0.0/24 地址仅在给定的网络中才有意义。
但是如果专用地址仅在给定的网络中才有意义的话,当向或从全球因特网发送或接收分组,地址在何处才必须是唯一的呢?答案在于理解NAT。
NAT 使能路由器对于外部世界来说甚至不像一台路由器。NAT 路由器对外界的行为反过来就如同一个具有单一 IP地址的单一设备。
更大因特网的报文都拥有一个源 IP 地址 138. 76.29.7,且所有进人家庭的报文都拥有同一个目的 IP 地址138.76.29.7。
NAT 地址转换表
如果从广域网到达 NAT 路由器的所有数据报都有相同的目的 IP 地址 ( 特别是对NAT路由器广域网一侧的接口 ),那么该路由器怎样知道它应将某个分组转发给哪个内部主机呢?
技巧就是使用在NAT路由器上的一张NAT转换表 ( NAT translation table ),并且在表项中包含了端口号及其IP地址。
考虑图中的例子。假设一个用户坐在家庭网络主机 10.0.0.1 旁,请求IP地址为 128. 119. 40. 186 的某台Web服务器(端口80)上的一个Web页面。
主机10.0.0.1为其指派了(任意)源端口号3345并将该数据报发送到LAN中。
NAT路由器收到该数据报,为该数据报生成一个新的源端口号 5001,将源IP替代为其广域网一侧接口的 IP 地址138. 76. 29. 7,且将源端口3345更换为新端口 5001。
当生成一个新的源端口号时,NAT路由器可选择任意一个当前未在NAT转换表中的源端口号。
路由器中的 NAT 也在它的 NAT 转换表中增加一表项。
Web 服务器并不知道刚到达的包含 HTTP 请求的数据报已被 NAT 路由器进行了改装,它会发回一个响应报文,其目的地址是 NAT 路由器的 IP 地址,其目的端口是 5001。
当该报文到达 NAT 路由器时,路由器使用目的 IP 地址与目的端口号从 NAT 转换表中检索出家庭网络测览器使用的适当IP地址 (10.0.0.1) 和目的端口号 (3345)。
于是,路由器改写该数据报的目的IP地址与目的端口号,并向家庭网络转发该数据报。
存在问题
NAT 在近几年已得到了广泛的应用。但是,我们应当提及的是,许多IETF团体中的纯化论者大声疾呼反对NAT。
第一,他们认为端口号是用于进程编址的,而不是用于主机编址的。
第二,他们认为路由器通常仅应当处理高达第三层的分组。
第三,他们认为NAT协议违反了所谓端到端原则,即主机彼此应相互直接对话,结点不应介人修改IP地址与端口号。
第四,他们认为应使用 IPv6 来解决IP地址短缺问题,而不是不计后果地用一种如 NAT 之类的权宜之计来修补存在的问题。
但不管喜欢与否,NAT 已成为因特网的一个重要组件。