网络安全之NAT(地址转换)技术详解
一、NAT 概述
NAT 是将 IP 数据报报头中的 IP 地址转换为另一个 IP 地址的过程,主要用于实现内部网络(私有 IP 地址)访问外部网络(公有 IP 地址)的功能。
Basic NAT 是实现一对一的 IP 地址转换,而 NAPT 可以实现多个私有地址映射到同一个公有地址上。
Basic NAT
Basic NAT 方式属于一对一的地址转换,在这种方式下只转换 IP 地址,而对 TCP/UDP 协议的端口号不处理,一个公网 IP 地址不能同时被多个用户使用。
Basic NAT 示意图
图描述了 Basic NAT 的基本原理,处理过程如下:
1. Router 收到内网侧 Host 发送的访问公网侧 Server 的报文,其源 IP 地址为 10.1.1.100。
2. Router 从地址池中选取一个空闲的公网 IP 地址,建立与内网侧报文源 IP 地址间的 NAT 转换表项(正反向),并依据查找正向 NAT 表项的结果将报文转换后向公网侧发送,其源 IP 地址是 162.105.178.65,目的 IP 地址是 211.100.7.34。
3.Router 收到公网侧的回应报文后,根据其目的 IP 地址查找反向 NAT 表项,并依据查表结果将报文转换后向私网侧发送,其源 IP 地址是 162.105.178.65,目的 IP 地址是 10.1.1.100。
说明:
由于 Basic NAT 这种一对一的转换方式并未实现公网地址的复用,不能有效解决 IP 地址短缺的问题,因此在实际应用中并不常用。
NAT 服务器拥有的公有 IP 地址数目要远少于内部网络的主机数目,这是因为所有内部主机并不会同时访问外部网络。公有 IP 地址数目的确定,应根据网络高峰期可能访问外部网络的内部主机数目的统计值来确定。
NAPT
除一对一的 NAT 转换方式外,网络地址端口转换 NAPT(Network Address Port Translation)可以实现并发的地址转换。它允许多个内部地址映射到同一个公有地址上,因此也可以称为“多对一地址转换”或地址复用。
NAPT 方式属于多对一的地址转换,它通过使用“IP 地址+端口号”的形式进行转换,使多个私网用户可共用一个公网 IP 地址访问外网。
如图所示, NAPT 方式的处理过程如下:
1. Router 收到内网侧 Host 发送的访问公网侧 Server 的报文。比如收到 Host A 报文的源地址是 10.1.1.100,端口号 1025。
2. Router 从地址池中选取一对空闲的“公网 IP 地址+端口号”,建立与内网侧报文“源 IP 地址+源端口号”间的 NAPT 转换表项(正反向),并依据查找正向 NAPT 表项的结果将报文转换后向公网侧发送。比如Host A 的报文经 Router 转换后的报文源地址为 162.105.178.65,端口号 16384。
3.Router 收到公网侧的回应报文后,根据其“目的 IP 地址+目的端口号”查找反向 NAPT 表项,并依据查表结果将报文转换后向私网侧发送。比如Server回应Host A的报文经Router转换后,目的地址为10.1.1.100,端口号 1025。
二、NAT 实现
Basic NAT 和 NAPT 是私网 IP 地址通过 NAT 设备转换成公网 IP 地址的过程,分别实现一对一和多对一的地址转换功能。
在现网环境下, NAT 功能的实现还得依据 Basic NAT 和 NAPT 的原理, NAT 实现主要包括:Easy IP、地址池 NAT、 NAT Server 和静态 NAT/NAPT。
Easy IP
Easy IP 方式可以利用访问控制列表来控制哪些内部地址可以进行地址转换。
Easy IP 方式特别适合小型局域网访问 Internet 的情况。
这里的小型局域网主要指中小型网吧、小型办公室等环境,一般具有以下特点:内部主机较少、出接口通过拨号方式获得临时公网 IP 地址以供内部主机访问 Internet。
对于这种情况,可以使用 Easy IP 方式使局域网用户都通过这个 IP 地址接入 Internet。
Easy IP 示意图
如图所示, Easy IP 方式的处理过程如下:
1. Router 收到内网侧主机发送的访问公网侧服务器的报文。比如收到 Host A 报文的源地址是 10.1.1.100,端口号 1540。
2. Router 利用公网侧接口的“公网 IP 地址+端口号”,建立与内网侧报文“源 IP 地址+源端口号”间的 Easy IP 转换表项(正反向),并依据查找正向 Easy IP 表项的结果将报文转换后向公网侧发送。比如 Host A 的报文经 Router 转换后的报文源地址为 162.10.2.8,端口号 5480。
3. Router 收到公网侧的回应报文后,根据其“目的 IP 地址+目的端口号”查找反向 Easy IP 表项,并依据查表结果将报文转换后向内网侧发送。比如Server回应Host A的报文经Router转换后,目的地址为10.1.1.100,端口号 1540。
NAT Server
NAT 具有“屏蔽”内部主机的作用,但有时内网需要向外网提供服务,如提供 WWW 服务或 FTP 服务。这种情况下需要内网的服务器不被“屏蔽”,外网用户可以随时访问内网服务器。
NAT Server 可以很好地解决这个问题,当外网用户访问内网服务器时,它通过事先配置好的“公网 IP 地址+端口号”与“私网 IP 地址+端口号”间的映射关系,将服务器的“公网 IP 地址+端口号”根据映射关系替换成对应的“私网 IP 地址+端口号”。
如图所示, NAT Server 的地址转换过程如下:
1. 在 Router 上配置 NAT Server 的转换表项。
2. Router 收到公网用户发起的访问请求,设备根据该请求的“目的 IP+端口号”查找 NAT Server 转换表项,找出对应的“私网 IP+端口号”,然后用查找结果替换报文的“目的 IP+端口号”。外网主机发送的报文,其目的地址是 209.102.1.68,端口号 80,经 Router 转换后目的地址转换为 192.168.1.68,端口号 80。
3. Router 收到内网服务器的回应报文后,根据该回应报文的“源 IP 地址+源端口号”查找 NAT Server 转换表项,找出对应的“公网 IP+端口号”,然后用查找结果替换报文的“源 IP 地址+源端口号”。内网服务器回应外网主机的报文,其源地址是 192.168.1.68,端口号 80,经 Router 转换后源地址转换为 209.102.1.68,端口号 80。
静态 NAT/NAPT
静态 NAT 是指在进行 NAT 时,内部网络主机的 IP 同公网 IP 是一对一静态绑定的,静态 NAT 中的公网 IP 只会给唯一且固定的内网主机转换使用。
静态 NAPT 是指“内部网络主机的 IP+协议号+端口号”同“公网 IP+协议号+端口号”是一对一静态绑定的,静态 NAPT 中的公网 IP 可以为多个私网 IP 使用。
静态 NAT/NAPT 还支持将指定范围内的内部主机 IP 转换为指定的公网网段 IP,转换过程中只对网段地址进行转换,保持主机地址不变。当内部主机访问外部网络时,如果主机地址在指定的内部主机地址范围内,会被转换为对应的公网地址;同样,当通过公网网段地址对内部主机进行访问时,可以直接访问到内部主机(该公网地址在转换后在指定的内部主机地址范围内)。
三、NAT ALG
NAT 和 NAPT 只能对 IP 报文的头部地址和 TCP/UDP 头部的端口信息进行转换。对于一些特殊协议,例如 ICMP、FTP 等,它们报文的数据部分可能包含 IP 地址或端口信息,这些内容不能被 NAT 有效的转换。
例如,一个使用内部 IP 地址的 FTP 服务器可能在和外部网络主机建立会话的过程中需要将自己的 IP 地址发送给对方。而这个地址信息是放到 IP 报文的数据部分, NAT 无法对它进行转换。当外部网络主机接收了这个私有地址并使用它,这时 FTP 服务器将表现为不可达。
目前支持 ALG 功能的协议包括:DNS、 FTP、 ICMP、 SIP 和 RTSP。
ALG 处理机制
解决这些特殊协议的 NAT 转换问题的方法就是在 NAT 实现中使用应用层网关 ALG(Application Level Gateway)功能。
ALG 是对特定的应用层协议进行转换,在对这些特定的应用层协议进行 NAT 转换过程中,通过 NAT 的状态信息来改变封装在 IP 报文数据部分中的特定数据,最终使应用层协议可以跨越不同范围运行。
以 ICMP 协议为例介绍 ALG 处理的过程。比如一个“目的站点不可达”的 ICMP 报文,该报文数据部分包含了造成错误的数据报文 A 的首部(注意, NAT 发送数据报文 A 之前进行了地址转换,所以源地址不是内部主机的真实地址)。如果开启了 ICMP ALG 功能,在 NAT 转发 ICMP 报文之前,它将与 NAT 交互,打开 ICMP 报文 并转换其数据部分的报文 A 首部的地址,使这些地址表现为内部主机的确切地址形式,最后由 NAT 将这个 ICMP报文转发出去。
四、DNS Mapping
在某些应用中,私网用户希望通过域名访问位于同一私网的内部服务器,而 DNS 服务器却位于公网。由于通常DNS 响应报文中携带的是内部服务器的公网 IP 地址,因此若 NAT 设备未将 DNS Server 解析的公网 IP 替换成内部服务器对应的私网 IP,私网用户将无法通过域名访问到内部服务器。
这个问题可以使用 DNS Mapping 方式来解决,通过配置“域名—公网 IP 地址—公网端口—协议类型”映射表,建立内部服务器的域名与其公网信息间的对应关系。
DNS Mapping 示意图
如图所示,私网用户 Host 希望通过域名方式访问 Web Server, Router 作为 NAT 服务器。当 Router 设备收到DNS 响应报文后,先根据其中携带的域名查找 DNS Mapping 映射表,再根据“公网 IP 地址—公网端口—协议类型”查找 Web Server,然后将 DNS 响应报文中的公网 IP 地址替换成 Web Server 的私网 IP 地址。这样, Host 收到的 DNS 响应报文中就携带了 Web Server 的私网 IP 地址,从而可以通过域名来访问 Web Server。
五、NAT 关联 VPN
路由器的 NAT 不仅可以使内部网络的用户访问外部网络,还允许内部网络中分属于不同 VPN(Virtual Private Network)的用户通过同一个出口访问外部网络,解决内部网络中 IP 地址重叠的 VPN 同时访问外网主机的问题;
路由器的 NAT 模块还支持 VPN 关联的 NAT Server,允许外部网络中的主机访问内网中分属不同 VPN 的服务器,同时支持内网多个 VPN 地址重叠的场景。
VPN 关联的源 NAT
VPN 关联的源 NAT 是指内部网络中分属于不同 VPN 的用户通过 NAT 技术访问外部网络,组网如图所示:
实现方式如下:
1. VPN 1 内的主机 A 和 VPN 2 内的主机 B 地址重叠,都为私网地址 10.1.1.1,都要同时访问外部网络的一个服务器。
2. Router在做源NAT时,将内部VPN作为一个NAT的匹配条件,将主机A发出报文的源IP转换为202.1.1.1,将主机 B 发出报文的源 IP 转换为 202.1.2.1,同时在建立的 NAT 转换表中,记录用户的 VPN 信息。
3. 当外部网络服务器回应内部网络主机 A 和 B 的报文经过 Router 时,根据已建立的 NAT 会话表, NAT 模块将发往主机 A 报文的目的 IP 从 202.1.1.1 转换为 10.1.1.1,然后再发往 VPN 1 的目的主机;将发往主机B 报文的目的 IP 从 202.1.2.1 转换为 10.1.1.1,然后再发往 VPN 2 的目的主机。
VPN 关联的 NAT Server
VPN 关联的 NAT Server 是指外网主机通过 NAT 技术访问内网中分属不同 VPN 的服务器,组网如图所示:
上图中, VPN 1 内 Server A 和 VPN 2 内的 Server B 的地址都是 10.1.1.1;使用 202.1.10.1 做为 VPN 1 内的 Server A的外部地址,使用 202.1.20.1 做为 VPN 2 内的 Server B 的外部地址。这样,外部网络的用户使用 202.1.10.1 就可以访问到 VPN 1 提供的服务,使用 202.1.20.1 就可以访问 VPN 2 提供的服务。
实现方式如下:
1. 外部网络的主机访问 VPN 1 内的 Server A,报文目的 IP 是 202.1.10.1;
访问 VPN 2 内的 Server B,报文目的 IP 是 202.1.20.1。
2. Router 在做 NAT server 时,根据报文的目的 IP 及 VPN 信息进行判断,将目的 IP 是 202.1.10.1 的报文的目的 IP 转换为 10.1.1.1,然后发往 VPN 1 的目的 Server A;将目的 IP 是 202.1.20.1 的报文的目的 IP 转换为10.1.1.1,然后发往 VPN 2 的目的 Server B;同时在新建的 NAT 会话表中,记录下关联的 VPN 信息。
3. 当内部 Server A 和 B 回应外部网络主机的报文经过 Router 时,根据已建立的 NAT 会话表, NAT 模块将从Server A 发出的报文的源 IP 从 10.1.1.1 转换为 202.1.10.1,再发往外部网络;将从 Server B 发出的报文的源 IP 从 10.1.1.1 转换为 202.1.20.1,再发往外部网络。
六、两次 NAT
两次 NAT 即 Twice NAT,指源 IP 和目的 IP 同时转换,该技术应用于内部网络主机地址与外部网络上主机地址重叠的情况。
两次 NAT 示意图
如图所示,两次 NAT 转换的过程如下:
1. 内网 Host A 要访问地址重叠的外部网络 Host B, Host A 向位于外部网络的 DNS 服务器发送访问外网 Host B 的 DNS 请求, DNS 服务器应答 Host B 的 IP 地址为 1.1.1.1, DNS 应答报文在经过 Router 时,进行 DNS ALG, Router 将 DNS 应答报文中的重叠地址 1.1.1.1 转换为唯一的临时地址 3.3.3.1,然后再转发给 Host A。
2. Host A 访问 Host B,目的 IP 为临时地址 3.3.3.1,报文在经过 Router 时, Router 检查到目的 IP 是临时地址,进行目的地址转换,将报文的目的 IP 转换为 Host B 的真实地址 1.1.1.1,同时进行正常的 NAT Outbound转换,将报文的源 IP 转换为源 NAT 地址池地址;Router 将报文转发到 Host B。
3. Host B 回应 Host A,目的 IP 为 Host A 的 NAT Outbound 地址池地址,源 IP 为 Host B 的地址 1.1.1.1,报文在经过 Router 时, Router 检查到源 IP 是重叠地址,进行源地址转换,将报文的源 IP 转换为对应的临时地址 3.3.3.1,同时进行正常的目的地址转换,将报文的目的 IP 从源 NAT 地址池地址转换为 Host A 的内网地址 1.1.1.1;Router 将报文转发到 Host A。
内网多 VPN 情况下的两次 NAT 示意图
考虑到内网有多个 VPN 的场景,且内网多个 VPN 的地址一样的情况下,在路由器 DNS ALG 时,增加内网 VPN信息作为重叠地址池到临时地址的映射关系匹配条件之一,如图 2 所示。内网多 VPN 情况下的两次 NAT 转换过程和两次 NAT 转换的过程类似,只是 VPN A 中的 Host A 转换为临时地址 3.3.3.1,而 VPN B 中的 Host B 转换为临时地址 4.4.4.1。
七、NAT 过滤和映射方式
NAT 过滤功能可以让 NAT 设备对外网发到内网的流量进行过滤;NAT 映射功能可以让内部网络中的一组主机通过 NAT 映射表映射到一个外部 IP 地址,共享这一个 IP 地址,所有不同的信息流看起来好像来源于同一个 IP 地址。
NAT 过滤
NAT 过滤是指 NAT 设备对外网发到内网的流量进行过滤,包括三种类型:
与外部地址无关的 NAT 过滤行为
与外部地址相关的 NAT 过滤行为
与外部地址和端口都相关的 NAT 过滤行为
NAT 过滤应用
上图中,私网用户 PC– 1 通过 NAT 设备与外网用户 PC– 2、 PC– 3 进行通信。
数据报文 1 代表私网主机 PC-1访问公网 PC-2, PC-1 使用的端口号为 1111,访问 PC-2 的端口 2222;经过 NAT 设备时,源 IP 转换为 202.169.10.1。当私网主机向某公网主机发起访问后,公网主机发向私网主机的流量经过 NAT 设备时需要进行过滤。
数据报文2、数据报文 3 和数据报文 4 代表三种场景,分别对应上述三种 NAT 过滤类型:
数据报文 2 代表公网主机 PC-3(与报文 1 的目的地址不同)访问私网主机 PC-1,目的端口号为 1111,只有配置了外部地址无关的 NAT 过滤行为,才允许此报文通过,否则被 NAT 设备过滤掉。
数据报文 3 代表公网服务器 PC-2(与报文 1 的目的地址相同)访问私网主机 PC-1,目的端口号为 1111,源端口号为 3333(与报文 1 的目的端口不同),只有配置了外部地址相关的 NAT 过滤行为或者配置了外部地址无关的 NAT 过滤行为,才允许此报文通过,否则被 NAT 设备过滤掉。
数据报文 4 代表公网服务器 PC-2(与报文 1 的目的地址相同)访问私网主机 PC-1,目的端口号为 1111,源端口号为 2222(与报文 1 的目的端口相同),这属于外部地址和端口都相关的 NAT 过滤行为,是缺省的过滤行为,不配置或者配置任何类型的 NAT 过滤行为,都允许此报文通过,不会被过滤掉。
路由器支持如上三种类型的 NAT 过滤行为。
NAT 映射
在 Internet 中使用 NAT 映射功能,所有不同的信息流看起来好像来源于同一个 IP 地址。因为 NAT 映射使得一组主机可以共享唯一的外部地址,当位于内部网络中的主机通过 NAT 设备向外部主机发起会话请求时, NAT 设备就会查询 NAT 表,看是否有相关会话记录,如果有相关记录,就会将内部 IP 地址及端口同时进行转换,再转发出去;如果没有相关记录,进行 IP 地址和端口转换的同时,还会在 NAT 表增加一条该会话的记录。
NAT 映射是 NAT 设备对内网发到外网的流量进行映射。包括以下三种类型:
外部地址无关的映射:对相同的内部 IP 和端口重用相同的地址端口映射。
外部地址相关的映射:对相同的内部 IP 地址和端口访问相同的外部 IP 地址时重用相同的端口映射。
外部地址和端口相关的映射:对相同的内部 IP 地址和端口号访问相同的外部 IP 地址和端口号重用相同的端口映射(如果此映射条目还处在活动状态)。
路由器支持外部地址无关、外部地址和端口相关的映射。