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 | 路由器->电脑 |
题外篇
- pwnat
- A New Method for Symmetric NAT Traversal in UDP and TCP,一种实现:https://github.com/jflyup/nat_traversal
- 端口预测--生日攻击算法