NAT概览

nat network

1. 背景

IPv4地址使用4个字节进行存储,最多能够提供2^32IPv4地址。随着互联网尤其是物联网的发展,全球IPv4地址早已不够用,因此人们发明了NAT(网络地址转换)来缓解这个问题。

简单来说,国际互联网组织划分了三个网络地址段作为内部网络本地通信使用,分别是10.0.0.0/8,172.16.0.0/12,192.168.0.0/16。大部分内部机器都使用这些网段中的私有IP地址,如果它们需要访问公网服务,那么则需要经过NAT

  • 出向流量:需要经过一台NAT设备,它会对流量进行SNAT(源地址替换),将私网地址和端口转换成NAT设备的公网地址和端口,然后再将包发出去;
  • 回程流量:到达NAT设备后进行相反的转换DNAT(目的地址替换),然后再转发给客户端。

2. 三四层NAT

NAT(Network address translation)即网络地址转换,工作在OSI模型的三层或四层(PNAT),用于修改IP数据包中的IP地址和端口。当内网的一些主机本来已经分配到了local ip地址,但又想和Internet的主机通信时,可使用NAT技术。

为了更好地表述各种NAT映射方式的区别,我们首先统一下相关术语。

  • 内网主机IP:InternalIp
  • 内网主机端口:InternalPort
  • NAT后的外网主机IPTransitIp
  • NAT后的外网主机端口:TransitPort
  • 外网主机IPExternalIp
  • 外网主机端口:ExternalPort

image.png

在最常见的家庭网络中,我们大部分的的设备(手机、电脑、具备联网功能智能家居)都处于internal network环境中,具有一个192.168.x.x的地址,而这个地址是一个私网地址,是不能被公网设备识别和路由的。日常访问的百度、淘宝等都可以认为是工作在external network环境中,具备一个或一组代表身份和位置信息的公网IP地址。为了实现内网设备访问公网服务,就必须在设备接入公网前经历一次NAT,将一个公网的IP用作transitIP。在运营商给你分配了公网ip的情况下,你家的路由器就是firewall,承担了NAT的功能。这种情况下的路由器一般有两个地址,一个是192.168.x.1的ip地址用作内网设备的默认网关,另一个则是用作NAT的公网IP地址,此时路由器就像一座桥一样,连接了两个本不能互通的网络环境。

2.1. 按NAT使用场景

NAT的使用场景来看,NAT可以分为SNATDNATFULLNAT

  • SNAT,替换源地址,SNAT一般可以分为两种
    1. 地址池方式,适用于有大量内网主机需要访问外网主机的场景,使用地址池中的随机IP替换源地址
    2. 出接口方式,内网主机直接使用外网接口的IP地址访问外网,适用于外网接口IP是动态获取的场景。
  • DNAT,替换目的地址。
  • FULLNAT,源地址和目的地址同时替换,使用FULLNAT可以简化内部主机的设置,避免配置网关或路由。

2.2. 按映射方式划分

NAT的映射方式来看,NAT可以分为Basic NATPNAT

  • Basic NAT,只转化IPIP不复用,不映射端口,内外部IP地址一比一映射,工作在OSI模型的第三层。
  • PNAT,除了转化IP,还复用IP,做端口映射,可以用于多个内部地址映射到少量(甚至一个)外部地址,工作在OSI模型的第四层。

2.3. 按生命周期划分

NAT的生命周期来看,可以分为静态NAT和动态NAT

  • 静态NAT,将内部网络中的每个主机都永久映射成外部网络中的某个地址。
  • 动态NAT,在外部网络中定义了一个或多个合法地址池,采用动态分配会话的方法将内部网络地址映射为外部网络地址。同时,分配的会话存在过期时间,过期后自动回收。

2.4. 按形态划分

NAT的形态上来看,可以分为完全锥型NAT、地址受限锥型NAT、端口受限锥型NAT和对称型NAT

  • 完全锥型NAT,完全锥形NAT只与InternalIpInternalPort有关,只要InternalIpInternalPort不变,都会分配同一个TransitIpTransitPort。我们把InternalIp:InternalPortTransitIp:TransitPort的这个映射关系称之为(二)NAT会话|会话。一旦这个会话建立起来,任意外网的主机都可以通过访问映射后的TransitIpTransitPort,实现主动访问位于内网的主机设备功能。
  • 地址受限锥型NAT,地址受限锥型NAT与完全锥型NAT的区别在于,会话除了维护IP和端口的映射关系外,还维护了内网主机主动访问的外网主机IP列表,不在列表中的主机无法通过访问内映射后的TransitIpTransitPort主动访问内网主机。因此,要想外部主机能够主动向该内部主机发起通信,必须先由该内部主机向这个外部发起一次通信,但是不必担心ExternalPort是否与内网主机请求的端口号是否一致。比如内网使用TransitIp1:TransitPort1访问外网ExternalIp1:ExternalPort1,完全锥型可以实现外网其他主机ExternalIp2:ExternalPort2访问TransitIp1:TransitPort1,但是地址受限型只能使用源地址为ExternalIp1,端口任意的方式来访问TransitIp1:TransitPort1
  • 端口受限锥型NAT,端口受限锥型NAT与地址受限锥型NAT的区别在于,会话额外保存了外网主机的端口信息。因此外网主机主动访问内网主机,除了有ExternalIp的限制外,还有ExternalPort的限制。比如内网使用TransitIp1:TransitPort1访问外网ExternalIp1:ExternalPort1,地址受限型可以使用ExternalIp1:ExternalPort2访问TransitIp1:TransitPort1,但是端口受限型只能使用ExternalIp1:ExternalPort1访问TransitIp1:TransitPort1
  • 对称NAT,从同一个内网InternalIpInternalPort发送到同一个ExternalIpExternalPort的请求都会被映射到同一个TransitIpTransitPort。但四元组(InternalIp,InternalPort,ExternalIp,ExternalPort)只要有一个发生变化都会使用不同的映射。对称型NAT下,只能由内网主机访问外网主机,外网主机是不允许主动访问内网主机的。
NAT类型 说明
完全锥型NAT 一旦会话生成后,任何公网主机都可与之通讯。双方都可以主动发起连接。
地址受限锥型NAT 只有内网主动连接的公网主机可与之通讯。在内网主机发起连接后,被访问的公网主机可通过任意端口主动与内网主机通讯。
端口受限锥型NAT 只有内网主动连接的公网主机可与之通讯。在内网主机发起连接后,被访问的公网只能通过固定的端口与之进行通讯。
对称型NAT 根据四元组创建NAT映射,四元组中的任何一项发生变化均导致NAT映射的更换。此时双方一对一映射,因此称之为对称NAT。对称型NAT下,只能由内网主机访问外网主机,外网主机是不允许主动访问内网主机的。

锥型NAT的通信双方是对等的,外网主机不管是换IP还是端口,感知到的都是对端的同一个IP和端口在提供某个特定服务,双方都可以主动发起通信;而对称型NAT违反了协议双方对等的原则,外网主机是无法主动访问内网主机的,换个外网地址或端口,NAT后的地址和端口就会变化。

3. 七层NAT

普通NAT实现了对UDPTCP报文头中的的IP地址及端口转换的功能,但对七层应用层数据载荷中的字段无能为力。在许多应用层协议中,有很多协议都包含多通道的信息,比如多媒体协议(H.323、SIP等)、FTP、SQLNET等,这种多通道的应用需要首先在控制通道中对后续数据通道的IP和端口进行协商,然后根据协商结果创建多个数据通道连接。控制信道的报文中,TCP/UDP除了传输层头中携带IP地址信息外,报文的有效载荷中也带有地址或者端口信息,这些内容不能被NAT进行有效的转换,就可能导致未知问题。

NAT ALG(Application Level Gateway,应用层网关)技术能对多通道协议进行应用层报文信息的解析和地址转换,将载荷中需要进行地址转换的IP地址和端口或者需特殊处理的字段进行相应的转换和处理,从而保证应用层通信的正确性。ALG需要识别并适配每一种应用层协议,不同应用协议的载荷中IP地址和端口的位置不同,因此具有很大的局限性,幸运的是ALG支持了我们常用的大多数协议,包括:FTP、H.323(包括RAS、H.225、H.245)、SIP、DNS、ILS、MSN/QQ、NBT、RTSP、SQLNET、TFTP等。

4. NAT应用场景

  • 多个内网主机共享公网IP,节省IP资源
  • 作为内网流量统一出口,共享公网带宽
  • 隐藏内网主机真实地址,避免直接暴露,可以抵挡端口扫描之类的攻击
  • 工作在NAT模式下的lvs四层负载均衡

5. NAT局限性

  • NAT下的网络被分为外网和内网两部分,NAT设备一般以网关的形式作为私网到公网的路由出口,双向流量都要经过NAT设备,容易成为性能瓶颈
  • 由于NAT将内部网络信息进行了隐藏和转换,NAT下的设备无法进行对等网络传输(需要NAT穿透)
  • NAT不能实现对通信双方的全透明,因为上层协议可能在传输的数据包中携带IP和端口信息(需要NAT ALG
  • 应用层需保持UDP会话连接,而由于NAT资源有限,所以UDP的会话会很快被回收(以便端口重用)。由于UDP是无连接的,UDP层应用需要在无数据传输、但需要保持连接时通过heartbeat的方式保持会话不过期。