C++音视频

代码改变世界

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

NAT有四种类型,在 RFC3489 第 5 章介绍。

1. Full Cone 完全锥型

所有从内网地址 IP_A:port_A 向外发出的包,都会在 NAT 上映射成一个地址 IP_B:port_B。所有 IP_A:port_A 向外发出的包,源地址都会被修改成 IP_B:port_B。 同时,任何外部的主机 IP_X:port_X 都可以向这个NAT映射的地址 IP_B:port_B 发送数据,从而到达地址 IP_A:port_A。所有 IP_A:port_A 到达的包,源地址也都会被修改成 IP_B:port_B。

2. Restricted Cone 受限锥型

所有从内网地址 IP_A:port_A 向外发的包,都会在NAT上映射一个地址 IP_B:port_B, 和全锥型不同的是,只有IP_A:port_A 先向外部发送过包的外部地址 IP_C:port_x (端口号不受限制),才能通过I_B:port_B 向 IP_A:port_A 发送包。
端口不限制,只对IP地址限制。

3. Port Restricted Cone 端口受限锥型

和受限锥型很像,增加了对端口号的限制。即是只有IP_A:port_A 先向外部发送过包的外部地址 IP_C:port_C ,才能通过 IP_B:port_B 向 IP_A:port_A 发送包。

4. Symmetric 对称型

所有从内网地址 IP_A:port_A 向外发出的到达特定地址 IP_C:port_C 的包,都会在 NAT 上映射地址 IP_B:port_Bc,向外到达不同地址的包,会映射成不同的IP_B:port_Bx,目的地址IP相同端口不同,也会有不同的映射。另外,只有IP_A:port_A 先向外部发送过包的外部地址 IP_C:port_C ,才能通过I_B:port_Bc 向 IP_A:port_A 发送包。

总结

由于NAT地址是固定的,可以只考虑NAT的映射端口,对于NAT1 NAT2,NAT3类型,内部主机固定ip:port向外发送包,NAT映射后的 IP_B:port_B 固定,映射后的 NAT 端口固定,对于打洞来说,可以将这个映射的 NAT 端口号告诉别人;而 NAT4 (对称型),NAT映射端口与外部的 ip:port 强关联,因此不能将 NAT映射端口告诉别人来使用。

穿透分析

由于NAT1,NAT2,NAT3 锥形 NAT 映射端口是固定,不会随着外部地址或者端口的改变而重新映射,所以打洞时,外部主机是知道NAT映射端口号的;而对称型NAT的端口随外部主机的地址或者端口号改变而重新映射,即不能通过server把映射端口告知client的方式来打洞,但是可以通过暴力猜解来尝试(一顿突突突,对端口分配进行预测,发送大量包来提高命中率),不过这总方式会带来别的问题。
peerA和peerB的NAT类型打洞成功情况

peerA \ peerB 全锥型 受限锥型 端口受限锥型 对称型
全锥型 yes yes yes yes
受限锥型 yes yes yes yes
端口受限锥型 yes yes yes no
对称型 yes yes no no

NAT类型简单统计

网络 NAT type 备注
杭州电信家用宽带 NAT3 光猫->电脑
杭州公司宽带(me) NAT1
杭州公司宽带(中芯微) NAT4
杭州电信手机热点 NAT4 手机热点->电脑
上海电信家用宽带 UDP不通 光猫->路由器->电脑
杭州阿里办公内网 NAT4 路由器->电脑

题外篇

  1. pwnat
  2. A New Method for Symmetric NAT Traversal in UDP and TCP,一种实现:https://github.com/jflyup/nat_traversal
  3. 端口预测--生日攻击算法
posted on 2022-03-08 11:13  shunxiang  阅读(37)  评论(0)    收藏  举报