UDP NAT 穿透

UDP NAT穿透俗称p2p打洞。
讲到NAT, 追溯一下NAT产生缘由:使用ipv4的时候,地址数量有限,NAT设备可让接上它的其余设备在其上共享ip,缓解地址不够用。固然ipv6的概念早就来临了,国内推广的程度和推广慢缘由这里就先忽略,下面介绍一下NAT穿透以及实现。服务器

NAT的类型(NAPT)架构

  • 彻底锥型(Full Cone)tcp

    内部地址[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受限锥型google

    在受限锥型的基础之上,对端口进一步约束;目标设备[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的协议spa

Google穿透协议[RFC3489][RFC5766]系列介绍了[STUN][TURN]协议(协议版本变化),属于
client-server的协议,经过client与server之间发送数据包,通讯以获取一些信息。

STUNcode

STUN-client位于NAT后面,它经过与STUN-server交互,发送\接收[协议的]数据报,能够经过抓包
简略查看(好比tcpdump)交互过程,最终将NAT类型和内外二元组返回给STUN-client。固然详细的
通讯过程,查看goole定义RFCxxxx的协议,最好结合开源的client实现结合。

TURNserver

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能够通讯

测试源码

相关文章
相关标签/搜索