NAT与穿透
NAT映射与内网穿透
1. 基本概念
1.1 相关基础
首先需要了解如下相关基础概念:
1.2 NAT基本概念
网络地址转换 NAT(Network Address Translation) 本身就是路由器的一个功能,是为了解决 IPv4地址不够用 而提出的,除了路由器之外,三层交换机也带 NAT 功能,但二层交换机不带(因为没有 IP地址 的概念 )
简单NAT 如下图所示:

上述实际带了 端口Port 因此称为 NPAT(Network Address Port Translation) 因为 NAT 本身太拉了(一对一转换,用途不广 ),但大家叫 NPAT 又觉着麻烦,因此管 NPAT 也称 NAT 了

参考资料:
1.3 断开 NAT 连接后
若通信完成后, NAT 的连接断开,此时:

服务器B 在 断开NAT连接 之后是不能 主动 和 设备A 建立连接的,即 设备A 只能往外面发送数据,但不能接收数据。
当 服务器B 往 30.0.0.1:1883 地址发送数据包时,1883 端口 被路由器认为什么都没有,然后丢弃包不处理
1.4 端口映射
即声明 路由器 持续监听 1883 端口(不再随机分配一个端口了 ) 而是固定将 1883端口 绑定到 设备A,只要路由器发现 1883端口 有数据,就会将消息转发到 设备A 上,所以在做完端口映射之后,服务器B 就可以在广域网上主动访问 设备A 了
1.5 内网穿透
上述还是较为友好的场景,只有一端做了 NAT,现实生活中是,双方都做了 NAT,均在一个 NAT 的环境中,因此两边均无法相互访问

但若想让两台服务器之间可以主动发起请求的话,又该怎么办呢,于是有了第三台作为中继的云服务器来帮助两台内网的设备进行一个 “ 穿透 ”

中继: 内网穿透的中间商,但中继的带宽会严重影响内网穿透的速度

注意
通常情况下,国内网络环境复杂,一般是是用不到端口映射的,存在着很多问题,因此才会有内网穿透

比如: 你将自己家里的路由器端口映射开放出去接入小区的机房,但小区的机房可能就是一个 NAT 环境 ,然后小区又把网线接到了移动的机房里面去(移动大内网很著名),相当于又接入到了一个 NAT 环境里面去,而且你没办法协调上层路由器来改规则。
2. 内网穿透是怎么实现的
2.1 中继转发
若A 想与 B 通信,此时设备A、服务器B 都需要先和云服务器建立连接,然后每次 A 想与 B 通信,都要先发送给 C,由 C 转发给 B ,这样每次都由 云服务器C 进行流量转发 效率很低 ,且带宽瓶颈就是 C 带宽的上限

因此有没有一种可能,A 通过 C 进行了某种协商之后,就可以直接与 B 进行通信呢?
2.2 NAT类型
NAT 通常分为两大类, 锥型 和 对称型 ,其中 锥型 又可以分为 完全锥型 和 限制型锥型(分类而非实际存在) ,限制型锥型 又可分为 IP 限制型锥型 和 端口 限制型锥型 , 如下图:

因此去除分类的话,子集就是通常说的 4 +1 种NAT类型:
NAT0(Open Internet 开放型/无NAT ): 设备 直接拥有公网IP地址 ,没有NAT网关。任何外网主机只要知道该设备的 公网IP地址 和 端口号,都可以直接向其发送数据包,无需经过NAT转换。
- 特点: 开放性高,但安全性低;无NAT转换,通信效率高;适合需要外网直接访问的场景
- 场景: 测试环境(开发调试)、早期的P2P文件共享应用、云服务器、VPS等直接暴露在公网的服务、需要外网直接访问的服务器应用
NAT1(Full Cone NAT 完全锥型 NAT): 同一个内网(IP,端口)对的所有出站请求,都会被映射到同一个外网(IP,端口)。一旦映射建立,任何外网主机都可以通过该映射的外网(IP,端口)访问内网设备,即使内网设备未先向该外网主机发送过数据包。

- 特点: 外网设备可以主动连接内网设备; 映射关系不受目标地址限制;**安全性低; **行为类似静态NAT,但映射是动态建立的 一对一映射
- 一个内网(IP,端口)对 → 一个外网(IP,端口)映射
- 场景: P2P 应用(如 BitTorrent、某些游戏联机)简单穿透(打洞成功率较高)需要外网主动访问内网服务的场景
- 特点: 外网设备可以主动连接内网设备; 映射关系不受目标地址限制;**安全性低; **行为类似静态NAT,但映射是动态建立的 一对一映射
NAT2(Restricted Cone NAT IP地址限制锥型 NAT): 当内网设备向某个外网IP地址发送数据包后,会建立 NAT 映射。只有该 特定外网IP地址的主机 可以通过该映射访问内网设备(端口可以不同)。其他 外网IP 地址的主机 即使知道该 映射的外网(IP,端口),也无法建立连接。

- 特点: 只允许 特定外网IP地址通信(端口可不同) ;安全性比 NAT1(Full Cone) 高,比 NAT3(Port Restricted) 低;限制了可连接的外网IP范围,但特定IP 仍可能被恶意利用
- 场景: 家庭网络(多数家用路由器)、小型办公网络、需要一定安全性的 P2P应用
NAT3(Port Restricted Cone NAT 端口限制锥型 NAT): 当内网设备向某个外网(IP,端口)发送数据包后,会建立NAT映射。只有该特定外网(IP,端口)的主机可以通过该映射访问内网设备。对外部连接的限制更严格:即使是 相同IP地址 但 不同端口号 的外网设备,也无法主动建立新连接 。

- 特点: IP 限制 同时 端口 限制 只允许 特定(IP,端口)通信 ;在 锥型NAT 中安全性最高;通常允许已建立的连接响应,但 主动发起新连接必须精确匹配(IP,端口)对
- 场景: 公共网络环境(咖啡馆、机场、酒店等提供的WiFi),企业网络(需要高安全性的场景),保护用户设备安全的网络环境
NAT4(Symmetric NAT 对称型 NAT): 比 NAT3 更严格的网络地址转换类型,同样对 IP 和 端口 均限制,且每次 内网设备 向不同的 外网(IP,端口)建立连接时,NAT网关 都会分配一个 新的外网(IP,端口)映射 。同一个内网(IP,端口)对,向不同的目标(IP,端口)建立连接,会得到不同的外网映射,只有与特定(内网IP,内网端口,目标IP,目标端口)四元组对应的映射才能通信。换句话说,(SIP,Sport,DIP,Dport)只要有一个发生变化,都会使用不同的映射条目,即此 NAT映射 与 报文四元组绑定。

- 特点: 安全性极高,几乎可杜绝外部的恶意攻击;对网络应用的兼容性极差,很多常见的网络应用可能无法正常工作;配置和管理复杂,需要专业的网络技术人员进行操作;P2P打洞成功率低
- 场景: 高度敏感的政府机构、军事单位;金融核心系统等对网络安全有极致要求的特殊环境;企业内网的核心安全区域。
对称型与全锥型的显著区别

总结(NAT映射规则)
- 全锥型、地址受限锥型、端口受限锥型NAT中,相同 内网IP 和 端口 的请求会被映射到同一个 外网IP 和 端口(即SPORT固定)。
- 对称型NAT 则根据四元组 动态生成映射表,同一 内网IP 访问 不同外网地址时,会分配 不同的 SPORT。
2.3 NAT 打洞
内网穿透的目标是将两台处于NAT后的主机建立直连。前面介绍了四种NAT类型,两两组合共有10种情况。不同组合的穿透方法不同,穿透成功率也不同。
不同NAT的穿透性
NAT 一共有如下 10种 组合
| 左侧NAT类型 | 右侧NAT类型 | 穿透性 |
|---|---|---|
| 全锥型 | 全锥型 | ✓ |
| 全锥型 | 受限锥型 | ✓ |
| 全锥型 | 端口受限锥型 | ✓ |
| 全锥型 | 对称型 | ✓ |
| 受限锥型 | 受限锥型 | ✓ |
| 受限锥型 | 端口受限锥型 | ✓ |
| 受限锥型 | 对称型 | ✓ |
| 端口受限锥型 | 端口受限锥型 | ✓ |
| 端口受限锥型 | 对称型 | ✗ 无法打通 |
| 对称型 | 对称型 | ✗ 无法打通 |
无法穿透的组合:
端口受限锥型 + 对称型
对称型 + 对称型
当无法穿透时,全程用服务器进行转发理论上是100%可以的 ,但这里不考虑这种方法。当有还有一些实验性方式也可以实现这两种的内网穿透,只不过目前还不成熟(成功率较低)。事实上不只是目前,未来也许也不会成熟, 因为这两种组合无法穿透是 NAT在设计上就存在的逻辑限制,而非实现问题,或者说设计之初就没考虑这两种的穿透问题。
