UDP NAT穿透俗称p2p打洞。
讲到NAT, 追溯一下NAT产生原因:使用ipv4的时候,地址数量有限,NAT设备可以让接上它的其他设备在其上共享ip,缓解地址不够用。当然ipv6的概念早就来临了,国内推广的程度和推广慢原因这里就先忽略,下面介绍一下NAT穿透以及实现。
NAT的类型(NAPT)
-
完全锥型(Full Cone)
内部地址[internal_ip:internal_port]通过NAT映射外部地址[external_ip:external_port], NAT分配端口后,所有外部设备可以通过这个[external_ip:external_port]和[internal_ip:internal_port]通信
-
受限锥型(Restricted Cone), 或者说是IP受限锥型
内部必须主动链接外部, 被访问的目标设备[tag_exrenal_ip:*]可以与之任意端口通信, 而其他外部IP则不能
-
端口受限锥型(Port Restricted Cone), 或者说是IP + PORT受限锥型
在受限锥型的基础之上,对端口进一步约束;目标设备[tag_exrenal_ip:tag_port1]可以与之通信,而[tag_exrenal_ip:tag_port2]不行
-
对称型(Symmetric)
每次对外访问, NAT映射外部地址[external_ip:external_port]的端口均不一样。如: 当主机A访问主机B, A的IP被映射为[ip:port1]后; 当主机A访问主机C, A的IP被映射为[ip:port2]后。
穿透NAT的协议
Google穿透协议[RFC3489][RFC5766]系列介绍了[STUN][TURN]协议(协议版本变化),属于
client-server的协议,通过client与server之间发送数据包,通信以获取一些信息。
STUN
STUN-client位于NAT后面,它通过与STUN-server交互,发送\接收[协议的]数据报,可以通过抓包
简略查看(比如tcpdump)交互过程,最终将NAT类型和内外二元组返回给STUN-client。当然详细的
通信过程,查看goole定义RFCxxxx的协议,最好结合开源的client实现结合。
TURN
TURN-client同样和server交互,其作用是穿透失败,使用中继,确保通信成功的低优先级策略。
就是实际数据中转的传输中心,当然如果TURN存在NAT,需要支持hairpin。协议简要概括:client
Allocate请求、创建Permission、建立Channel等等,通过在TURN-server上分配一个Port,作为
己方的一个候选通信 [ip:port]。
ICE
穿越协议[RFC5245],可以理解为对STUN和TURN的扩展,利用STUN\TURN client收集、检查、优
先级本地候选地址,用于其他peer使用并用于连接。
NAT穿透实现
试验几个组件
1.STUN服务器使用google开放stun.l.google.com:19302
2.TURN使用开源coturn,主机阿里云即可,支持hairpin
3.客户端实现,使用开源ice4j(实现了STUN\TURN的client,协议版本可能有异)
架构
流程
step1:通过ice4j获取候选[ip:port]
step2:通过login-server权限校验以及SDP交换
step3:检测彼方SDP,进而通信,ice完成
结语
UDP穿透成功,两端位于对称NAT后,这里没有使用生日攻击等端口预测,通过realy可以通信
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。