NAT
Network Address Translation,网络地址转换
在计算机网络中是一种在IP数据包通过路由器或防火墙时重写来源IP地址或目的IP地址的技术。这种技术被普遍使用在有多台主机但只通过一个公有IP地址访问互联网的私有网络中。当然,NAT也让主机之间的通信变得复杂,导致了通信效率的降低。
核心作用:私网IP地址 -> 公网IP地址
目的:实现私网主机和公网主机的正常数据交换。私网IP在internet上是不可被寻址的,可被寻址的只有公网IP。因此,私网的主机A与公网上的另一主机B进行数据交换时,A发送的IP报文所携带的源地址不能直接使用A的私网IP,否则B返回数据时将A的私网IP作为目的IP,则无法寻址,也就无法完成数据交换
-
说明:
IP地址只有32位,共42.9亿个地址,去掉保留地址、组播地址,只有36亿左右,很早就被瓜分完毕,而有NAT这项技术苦苦支撑,我们这么多人才可以继续在互联网遨游
公司局域网、机构局域网、个人局域网可以使用私网IPv4地址(10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,A/B/C类地址),然后在各个局域网的边界WAN口使用一个或多个公网IPv4进行一对多的转换,即一个公网IPv4映射多个私网IPv4,那问题来了,NAT设备如何区分不同的私网IPv4 的host呢?NAT使用基于session 转换规则:- 对于TCP/UDP 使用
Host 's 私有IPv4 + Port <------> NAT 公网IPv4 + Port - 对于ICMP使用
Host 's 私有IPv4 + session ID <------> NAT 公网IPv4 + session ID
规则其实非常好理解,由于session ID 在NAT设备上是独一无二的,所以NAT可以很容易区别局域网内部的不同host。至于其它传输协议,NAT使用的也是类似session ID 的转换规则,即使用可以将不同host 轻易分辨出来的字段做键值(KEY),动态创建映射表项,做双向的地址+ KEY 的转换
- 对于TCP/UDP 使用
NAT设备:
NAT 设备通常是路由器或防火墙
NAT技术被普遍使用在有多台主机但只通过一个公有IP地址访问互联网的私有网络中。例如网络运营商给每个家庭分配一个公网IP,家庭通过家用路由器搭建家庭网络,这个家庭网络就会使用nat。现在,网络运营商甚至不会给每个家庭分配一个公网IP,而是分配一个由网络运营商划定的大型局域网IP,然后直接在运营商自己的路由器上运营 NAT,称为 CGN(Carrier-grade NAT,电信级 NAT)
基本网络地址转换(Basic NAT)
这一种也可称作NAT或“静态NAT”,在RFC 2663中提供了信息。它在技术上比较简单,仅支持地址转换,不支持端口映射。Basic NAT要求对每一个当前连接都要对应一个公网IP地址,因此要维护一个公网的地址池。宽带(broadband)路由器通常使用这种方式来允许一台指定的设备去管理所有的外部链接,甚至当路由器本身只有一个可用外部IP时也如此,这台路由器有时也被标记为DMZ主机。由于改变了IP源地址,在重新封装数据包时候必须重新计算校验和,网络层以上的只要涉及到IP地址的头部校验和都要重新计算。
Basic NAT要维护一个无端口号NAT表
内网IP | 外网IP |
---|---|
192.168.1.55 | 219.152.168.222 |
192.168.1.59 | 219.152.168.223 |
192.168.1.155 | 219.152.168.224 |
网络地址端口转换(NAPT)
这种方式支持端口的映射,并允许多台主机共享一个公网IP地址。
支持端口转换的NAT又可以分为两类:源地址转换和目的地址转换。前一种情形下发起连接的计算机的IP地址将会被重写,使得内网主机发出的数据包能够到达外网主机。后一种情况下被连接计算机的IP地址将被重写,使得外网主机发出的数据包能够到达内网主机。实际上,以上两种方式通常会一起被使用以支持双向通信。
NAPT维护一个带有IP以及端口号的NAT表
内网IP | 外网IP |
---|---|
192.168.1.55:5566 | 219.152.168.222:9200 |
192.168.1.59:80 | 219.152.168.222:9201 |
192.168.1.59:4465 | 219.152.168.222:9202 |
几种NAT类型
完全圆锥型NAT(Full cone NAT),即一对一(one-to-one)NAT
一旦内部地址(iAddr:iPort)映射到外部地址(eAddr:ePort),所有发自 iAddr:iPort 的数据包都经由 eAddr:ePort 向外发送。
任意外部主机都能经由发送数据包给 eAddr:ePort 到达 iAddr:iPort。受限圆锥型NAT((Address-)Restricted cone NAT)
一旦内部地址(iAddr:iPort)映射到外部地址(eAddr:ePort),所有发自 iAddr:iPort 的数据包都经由 eAddr:ePort 向外发送。
唯 iAddr:iPort 曾经发送数据包到外部主机(nAddr:any),外部主机才能经由发送数据包给 eAddr:ePort 到达 iAddr:iPort。(注:any 指外部主机源端口不受限制。)端口受限圆锥型NAT(Port-Restricted cone NAT)
类似受限制锥形NAT(Restricted cone NAT),但是还有端口限制。
一旦内部地址(iAddr:iPort)映射到外部地址(eAddr:ePort),所有发自 iAddr:iPort 的数据包都经由 eAddr:ePort 向外发送。
在受限圆锥型NAT基础上增加了外部主机源端口必须是固定的。对称NAT(Symmetric NAT)
每一个来自相同内部 IP 与端口,到一个特定目的地 IP 和端口的请求,都映射到一个独特的外部 IP 和端口。
同一内部 IP 与端口发到不同的目的地和端口的信息包,都使用不同的映射
只有曾经收到过内部主机数据的外部主机,才能够把数据包发回
UDP穿透
在 NAT 的网络环境下,p2p 网络通信需要穿透 NAT 才能够实现。在熟悉 NAT 原理过后,我们就可以很好的理解如何来进行 NAT 穿透了。NAT 穿透的思想在于:如何复用 NAT 中的映射关系?
在 锥型NAT 中,同一个内网地址端口访问不同的目标只会建立一条映射关系,所以可以复用,而 对称型NAT 不行。同时,由于 TCP 工作比较复杂,在 NAT 穿透中存在一些局限性,所以在实际场景中 UDP 穿透使用得更广泛一些,这里我们详细看看 UDP 穿透的原理和流程。
我们以
Restricted-Port NAT
类型作为例子,因为其使用得最为广泛,同时权限也是最为严格的,在理解Restricted-Port NAT
类型穿透后,Full-Cone NAT
和Restricted NAT
就触类旁通了; 在实际网络场景下往往都是非常复杂的,比如:防火墙、多层NAT、单侧NAT,这里我们选择了两端都处于一层 NAT 的场景来进行演示讲解,可以让我们更容易的进行理解。
在我们的演示环境下,有 PC1,Router1,PC2,Router2,Server
五台设备;公网服务器用于获取客户端实际的出口地址端口,UDP 穿透的流程如下:
1.PC1(192.168.1.1:7777)
发送 UDP 请求到 Server(9.9.9.9:1024)
,此时 Server 可以获取到 PC1 的出口地址端口(也就是 Router1 的出口地址端口) 1.2.3.4:10000
,同时 Router1 添加一条映射 192.168.1.1:7777 <=> 1.2.3.4:10000 <=> 9.9.9.9:1024
2.PC2(192.168.2.1:8888)
同样发送 UDP 请求到 Server,Router2 添加一条映射 192.168.2.1:8888 <=> 5.6.7.8:20000 <=> 9.9.9.9:1024
3.Server 将 PC2 的出口地址端口(5.6.7.8:20000
) 发送给 PC1
4.Server 将 PC1 的出口地址端口(1.2.3.4:10000
) 发送给 PC2
5.PC1 使用相同的内网地址端口(192.168.1.1:7777
)发送 UDP 请求到 PC2 的出口地址端口(Router2 5.6.7.8:20000
),此时 Router1 添加一条映射 192.168.1.1:7777 <=> 1.2.3.4:10000 <=> 5.6.7.8:20000
,与此同时 Router2 没有关于 1.2.3.4:10000
的映射,这个请求将被 Router2 丢弃
6.PC2 使用相同的内网地址端口(192.168.2.1:8888
)发送 UDP 请求到 PC1 的出口地址端口(Router1 1.2.3.4:10000
),此时 Router2 添加一条映射 192.168.2.1:8888 <=> 5.6.7.8:20000 <=> 1.2.3.4:10000
,与此同时 Router1 有一条关于 5.6.7.8:20000
的映射(上一步中添加的),Router1 将报文转发给 PC1(192.168.1.1:7777)
7.在 Router1 和 Router2 都有了对方的映射关系,此时 PC1 和 PC2 通过 UDP 穿透建立通信。
相关参考:
https://zh.wikipedia.org/wiki/%E7%BD%91%E7%BB%9C%E5%9C%B0%E5%9D%80%E8%BD%AC%E6%8D%A2
https://sspai.com/post/68037