STUN协议简介

时间:2021-10-21 09:50:02

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

通过这些方法和过程