STUN简要
STUN (Simple Traversal of UDP over NATs, NAT 的UDP简单穿越 ) 是一种网络协议 。 它同意位于NAT(或多重NAT)后的client找出自己的公网地址。查出自己位于哪种类型的NAT之后以及NAT为某一个本地port所绑定的Internet端port 。这些信息被用来在两个同一时候处于NAT 路由器之后的主机之间建立UDP通信。该协议由RFC 3489定义。
一旦client得知了Internet端的UDPport。通信就能够開始了。假设NAT是全然圆锥型的,那么两方中的不论什么一方都能够发起通信。假设NAT是受限圆锥型或port受限圆锥型,两方必须一起開始传输。
须要注意的是。要使用STUN RFC中描写叙述的技术并不一定须要使用STUN协议——还能够另外设计一个协议并把同样的功能集成到执行该协议的server上。
SIP之类的协议是使用UDP分组在Internet上传输音频和/或视频数据的 。
不幸的是,因为通信的两个末端往往位于NAT之后,因此用传统的方法是无法建立连接的。这也就是STUN发挥作用的地方。
STUN是一个客户机-server协议 。一个VoIP电话或软件包可能会包含一个STUNclient。这个client会向STUNserver发送请求,之后。server就会向STUNclient报告NAT路由器的公网IP地址以及NAT为同意传入流量传回内网而开通的port。
以上的响应同一时候还使得STUNclient可以确定正在使用的NAT类型—— 由于不同的NAT类型处理传入的UDP分组的方式是不同的 。
四种主要类型中有三种是可以使用的 :全然圆锥型NAT、受限圆锥型NAT和port受限圆锥型NAT——但大型公司网络中常常採用的 对称型NAT(又称为双向NAT)则不能使用 。
Simple Traversal of User Datagram Protocol (UDP) Through Network
Address Translators (NATs) (STUN)
STUN,是为了实现透明的穿透NAT,而定义的一套协议 。 它使本地的内网的机器。具有取得,可以得知它的NAT网关的IP,NAT类型的能力 。
为什么须要STUN:
由于NAT尽管攻克了IP地址稀少的问题,可是也带来了非常多的问题。比方全部P2P应用,像文件SHARE。 多媒体 ,和在线游戏等等.
要想穿透NAT,首先知道NAT的一些特性:
NAT分为4种(加上防火墙的话,多几种情况):
1.全然透明NAT(Full Cone NAT):
从同样内部主机(IN IPX) +port(IN PORTX)发送的数据MAPING为同样的IP(OUT IP X)和port(OUT PORT X)发送带外网.而且从还有一个server(Y)。假设直连到MAPING的IP(OUT IP X)和port(OUT PORT X )上,数据将会被转发到内部主机上. (IN IPX), (IN PORTX).
也就是说进内部网的数据包的SPORT,SPORT不受限制
2.受限NAT(Restricted Cone),
从同样内部主机(IN IPX) +port(IN PORTX)发送的数据MAPING为同样的IP(X)和port发送带外网.和全然NAT不同的是。仅仅有当为X时,外部机器的的请求就被转发到主机(IN IPX) +port(IN PORTX)。
也就是说进内部网的数据包的,SPORT不受限制,SIP受限制,仅仅能为NAT MAP数据的IP
3,port受限NAT(Port Restricted Cone)
和受限NAT不同的是。仅仅有当外部主动请求的的源IP和port,等于内部网发送的请求的目的IP和port。
4.对称NAT
假设发送的包的目的IP AND PORT,那么MAPPING IP AND PORT,将同样。
内部网同一台机器,同一个port假设目的地址不同,那么MAPPING的port也不同。所以仅仅有他主动连的server才可能知道他的MAPPING后port。别的server假设想连他仅仅能靠推測port。
总结:前面3重NAT。MAPING PORT 和 IP,是依据发送包的的内部网的IP和port决定的。假设数据的内网IP和port同样,那么MAPPING后的port和地址是固定。这个功能为我们的穿越提供了非常好条件。
第4种NAT,打洞后的MAPPING 地址和port将变地不可靠。非常难穿越 。
注意SERVERA,和SERVERB是两个公网地址。而不是两台机器.
STUN协议 (浅析样例分析)
主要功能是检測是否位于NAT后面。假设位于NAT后面。经过NAT转换后的地址和port是什么,另外能够检測NAT的类型。
基本思想
在私网内部安装一个STUN client。在公网上安装一个STUN Server 。STUN协议定义了一些消息格式,大体上分成Request/Response,client向server发送 request,server发送response给client。
怎样检測STUN client是否在NAT后面呢?原理非常easy,Server在收到client的UDP包以后,Server将接收到该包的地址和port利用udp传回来给 client。client把这些地址和port与本机的ip地址和port进行比較。假设不同,说明在NAT后面。否则就位于NAT前面。
为了检測不同类型的 NAT,STUN协议定义了一些消息属性。要求Server有不同的动作,比方发送响应的时候使用不同的IP地址和port,或者改变port等等。 STUN协议 对NAT可能有效,可是对防火墙就无能为力了。由于防火墙可能不会打开UDPport 。
NAT分类
STUN协议将NAT粗略分为4种类型,即Full Cone、Restricted Cone、Port Restricted Cone和Symmetric。举个实际样例来说明这四种NAT的差别:
A机器在私网(192.168.0.4)
NATserver(210.21.12.140)
B机器在公网(210.15.27.166)
C机器在公网(210.15.27.140)
如今,A机器连接过B机器,如果是 A(192.168.0.4:5000)-> NAT(转换后210.21.12.140:8000)-> B(210.15.27.166:2000)。
同一时候A从来没有和C通信过。
则对于不同类型的NAT,有下列不同的结果:
Full Cone NAT:C发数据到210.21.12.140:8000。NAT会将数据包送到A(192.168.0.4:5000)。由于NAT上已经有了192.168.0.4:5000到210.21.12.140:8000的映射。
Restricted Cone:C无法和A通信。由于A从来没有和C通信过,NAT将拒绝C试图与A连接的动作。但B能够通过210.21.12.140:8000与A的 192.168.0.4:5000通信。且这里B能够使用不论什么port与A通信。如:210.15.27.166:2001 -> 210.21.12.140:8000,NAT会送到A的5000port上。
Port Restricted Cone:C无法与A通信,由于A从来没有和C通信过。而B也仅仅能用它的210.15.27.166:2000与A的192.168.0.4:5000通信。由于A也从来没有和B的其它port通信过。该类型NAT是port受限的。
Symmetric NAT: 上面3种类型,统称为Cone NAT。有一个共同点:仅仅要是从同一个内部地址和port出来的包,NAT都将它转换成同一个外部地址和port 。 可是Symmetric有点不同,详细表如今: 仅仅要是从同一个内部地址和port出来,且到同一个外部目标地址和port,则NAT也都将它转换成同一个外部地址和port。但假设从同一个内部地址和port出来。是 到还有一个外部目标地址和port,则NAT将使用不同的映射。转换成不同的port(外部地址仅仅有一个,故不变)。 并且和Port Restricted Cone一样,仅仅有以前收到过内部地址发来包的外部地址,才干通过NAT映射后的地址向该内部地址发包。
现针对Symmetric NAT举例说明:
A机器连接过B机器,假使是 A(192.168.0.4:5000)-> NAT(转换后210.21.12.140:8000)-> B(210.15.27.166:2000)
假设此时A机器(192.168.0.4:5000)还想连接C机器 (210.15.27.140:2000),则NAT上产生一个新的映射,相应的转换可能为A(192.168.0.4:5000)-> NAT(转换后210.21.12.140:8001)-> C(210.15.27.140:2000)。此时。B仅仅能用它的210.15.27.166:2000通过NAT的210.21.12.140: 8000与A的192.168.0.4:5000通信, C也仅仅能用它的210.15.27.140:2000通过NAT的210.21.12.140:8001与A的192.168.0.4:5000通信,而 B或者C的其它port则均不能和A的192.168.0.4:5000通信。
STUN 的简单操作过程:
发送请求。请求分为两种
1.Binding Requests, sent over UDP,
用来发现NAT的公网地址,和MAPPING后的port
2. Binding Response,
server产生Binding Response。并把得到的MAPPINGIP 和port。返回到client, client比較MAPPING地址是否和本机地址同样。假设是说明是本机也是公网,否则推断NAT的类型(推断方法:client uses additional STUN Binding Requests)
3.Binding Error。
4.Shared Secret Requests, sent over TLS [2] over TCP.
这个请求要求server返回一暂时username和password。用来下一步的Binding Requests/ Response,用来验证信息的完整性
5.Shared Secret Response,
6 Shared Secret Error Response。
STUN 信息结构
STUN 由以后数据结构构成:STUN头+STUN有效载荷
STUN头结构例如以下: 存储的值都是以网络顺序存放
字段 类型
STUN message type Short int 消息类型
Length Short int 有效载荷长度,不包括头长度
transaction ID octet[16] 连接的ID值,检查Request,和Response
STUN的有效载荷
SHUN的有效载荷是一些STUN的属性构成,属性的类型由信息的类型来决定。
STUN的属性是定义好了的,属性列表(attribute)例如以下:
MAPPED-ADDRESS 必选 用在Binding Response,(添入MAPING IP 和PORT)
RESPONSEADDRESS 可选 用在Binding Request,指定Response,发送到哪里
假设没有指定。Response发送到MAPING IP 和 PORT
CHANGE-REQUEST 可选 用在Binding Request。用来决定。CLIENT的NAT类型是
制NAT,还是port限制NAT,(命令server从不同的源port/IP,Response请求)
CHANGED-ADDRESS 可选 用在Binding Responses告诉Client改变的port和IP
SOURCE-ADDRESS 必选 仅仅用在Binding Responses。标记信息的源PORT HE IP
USERNAME 可选 Shared Secret Response/ Binding Requests
PASSWORD, 必选 SharedSecret Response
ESSAGEINTEGRITY 可选 用在Binding Responses, Binding Request记录信息的完整性
ERROR-CODE Binding Error Response and Shared Secret Error Response.
UNKNOWN-ATTRIBUTES
REFLECTED-FROM Binding Responses.可追溯性和预防DDOS
通过这些方法和过程