stun简介

转载 http://blog.csdn.net/mazidao2008/article/details/4934257

STUN(Simple Traversal of UDP over NATs,NAT 的UDP简单穿越)是一种网络协议,它允许位于NAT(或多重NAT)后的客户端找出自己的公网地址,查出自己位于哪种类型的NAT之后以及NAT为某一个本地端口所绑定的Internet端端口。这些信息被用来在两个同时处于NAT 路由器之后的主机之间建立UDP通信。该协议由RFC 3489定义。

一旦客户端得知了Internet端的UDP端口,通信就可以开始了。如果NAT是完全圆锥型的,那么双方中的任何一方都可以发起通信。如果NAT是受限圆锥型或端口受限圆锥型,双方必须一起开始传输。

需要注意的是,要使用STUN RFC中描述的技术并不一定需要使用STUN协议——还可以另外设计一个协议并把相同的功能集成到运行该协议的服务器上。

SIP之类的协议是使用UDP分组在Internet上传输音频和/或视频数据的。STUN是一个客户机-服务器协议。一个VoIP电话或软件包可能会包括一个STUN客户端。这个客户端会向STUN服务器发送请求,之后,服务器就会向STUN客户端报告NAT路由器的公网IP地址以及NAT为允许传入流量传回内网而开通的端口。

以上的响应同时还使得STUN客户端能够确定正在使用的NAT类型——因为不同的NAT类型处理传入的UDP分组的方式是不同的。四种主要类型中有三种是可以使用的:完全圆锥型NAT、受限圆锥型NAT和端口受限圆锥型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) +端口(IN PORTX)发送的数据MAPING为相同的IP(OUT IP X)和端口(OUT PORT X)发送带外网.并且从另一个服务器(Y),如果直连到MAPING的IP(OUT IP X)和端口(OUT PORT X )上,数据将会被转发到内部主机上. (IN IPX), (IN PORTX).

也就是说进内部网的数据包的SPORT,SPORT不受限制

2.受限NAT(Restricted Cone),

从相同内部主机(IN IPX) +端口(IN PORTX)发送的数据MAPING为相同的IP(X)和端口发送带外网.和完全NAT不同的是,只有当为X时,外部机器的的请求就被转发到主机(IN IPX) +端口(IN PORTX)。也就是说进内部网的数据包的,SPORT不受限制,SIP受限制,只能为NAT MAP数据的IP

3,端口受限NAT(Port Restricted Cone)

和受限NAT不同的是,只有当外部主动请求的的源IP和端口,等于内部网发送的请求的目的IP和端口。

4.对称NAT

如果发送的包的目的IP AND PORT,那么MAPPING IP AND PORT,将相同。内部网同一台机器,同一个端口如果目的地址不同,那么MAPPING的端口也不同,所以只有他主动连的服务器才可能知道他的 MAPPING后端口,别的服务器如果想连他只能靠猜测端口。

总结:前面3重NAT,MAPING PORT 和 IP,是根据发送包的的内部网的IP和端口决定的。如果数据的内网IP和端口相同,那么MAPPING后的端口和地址是固定。这个功能为我们的穿越提供了很好条件。

第4种NAT,打洞后的MAPPING 地址和端口将变地不可靠。很难穿越。注意SERVERA,和SERVERB是两个公网地址,而不是两台机器.

STUN协议(浅析例子分析)

主要功能是检测是否位于NAT后面,如果位于NAT后面,经过NAT转换后的地址和端口是什么,另外可以检测NAT的类型。

基本思想

在私网内部安装一个STUN client,在公网上安装一个STUN Server,STUN 协议定义了一些消息格式,大体上分成Request/Response,client向server发送 request,server发送response给client。如何检测STUN client是否在NAT后面呢?原理很简单,Server在收到client的UDP包以后,Server将接收到该包的地址和端口利用udp传回来给 client,client把这些地址和端口与本机的ip地址和端口进行比较,如果不同,说明在NAT后面,否则就位于NAT前面。为了检测不同类型的 NAT,STUN协议定义了一些消息属性,要求Server有不同的动作,比如发送响应的时候使用不同的IP地址和端口,或者改变端口等等。STUN协议 对NAT可能有效,但是对防火墙就无能为力了,因为防火墙可能不会打开UDP端口。

NAT分类

STUN协议将NAT粗略分为4种类型,即Full Cone、Restricted Cone、Port Restricted Cone和Symmetric。举个实际例子来说明这四种NAT的区别:

A机器在私网(192.168.0.4)

NAT服务器(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可以使用任何端口与A通信。如:210.15.27.166:2001 -> 210.21.12.140:8000,NAT会送到A的5000端口上。

Port Restricted Cone:C无法与A通信,因为A从来没有和C通信过。而B也只能用它的210.15.27.166:2000与A的192.168.0.4:5000通信,因为A也从来没有和B的其他端口通信过。该类型NAT是端口受限的。

Symmetric NAT:上面3种类型,统称为Cone NAT,有一个共同点:只要是从同一个内部地址和端口出来的包,NAT都将它转换成同一个外部地址和端口。但是Symmetric有点不同,具体表现在: 只要是从同一个内部地址和端口出来,且到同一个外部目标地址和端口,则NAT也都将它转换成同一个外部地址和端口。但如果从同一个内部地址和端口出来,是 到另一个外部目标地址和端口,则NAT将使用不同的映射,转换成不同的端口(外部地址只有一个,故不变)。而且和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的其他端口则均不能和A的192.168.0.4:5000通信。

STUN 的简单操作过程:

发送请求。请求分为两种

1.Binding Requests, sent over UDP,

用来发现NAT的公网地址,和MAPPING后的端口

2.  Binding Response,

服务器产生Binding Response,并把得到的MAPPINGIP 和端口,返回到客户端, 客户端比较MAPPING地址是否和本机地址相同,如果是说明是本机也是公网,否则判断NAT的类型(判断方法:client uses additional STUN Binding Requests)

3.Binding Error,

4.Shared Secret Requests, sent over TLS [2] over TCP.

这个请求要求服务器返回一临时用户名和密码,用来下一步的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,还是端口限制NAT,(命令服务器从不同的源端口/IP,Response请求)

CHANGED-ADDRESS    可选    用在Binding Responses告诉Client改变的端口和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

穿透的方法和过程

stun简介

时间: 2024-08-19 12:42:13

stun简介的相关文章

STUN协议简析

http://blog.csdn.net/mazidao2008/article/details/4934257 ———————————————————————————————————————————————————— STUN简介 STUN(Simple Traversal of UDP over NATs,NAT 的UDP简单穿越)是一种网络协议,它允许位于NAT(或多重NAT)后的客户端找出自己的公网地址,查出自己位于哪种类型的NAT之后以及NAT为某一个本地端口所绑定的Internet端

基于SIP和RTP协议的开源VOIP之QuteCom简介

*************************************************************************************************************************** 作者:EasyWave                                                                              时间:2014.10.30 类别:Linux应用-基于oSIP协议的开源V

P2P技术简介

NAT( Network Address Translation)穿越(俗称打洞)技术 前言: p2p已经存在于我们生活的方方面面:我们通过下载在工具(比如迅雷,bitorent,各种网盘)下载,观看live视频(ppstream,pplive)都在使用p2p,有些im也是通过p2p来传递消息的:我们知道使用p2p技术的下载工具下载更快,使用p2p的live视频更流畅,而且同时使用的人越多效果越好,因为他是可能从我们“邻居”那里获取数据. 那么p2p到底是个什么样的东西呢.暂且我么可以这样理解为

stun/turn服务器部署

一.简介 本文通过在服务器上安装coturn这个软件,实现搭建STUN服务器和TURN服务器. coturn 简介:是一个免费的开源的 TURN/STUN 服务器.coturn 服务器完整的实现了 STUN/TURN/ICE 协议,支持 P2P 穿透防火墙. STUN 服务器用于检测NAT类型. TURN 服务器是在点对点失败后用于通信中继. coturn的Github源码: https://github.com/coturn/coturn coturn的wiki使用说明: https://gi

Turn and Stun server · J

本文简介了Turnserver(Turn + Stun)服务器的搭建.Turnserver主要提供了stun服务,支撑NAT.防火墙穿透,turn服务器,支撑打洞失败时的数据中转.使用场景上类似于前端使用的WEBRTC音视频数据服务,在不同网络环境下可通过stun服务器进行打洞以及turn服务器进行中转,最终实现web前端上的音视频通信. Turnserver 搭建 简介 webrtc的p2p穿透部分,一般都需要借助于turnserver,步骤大概是这样的 尝试直连 通过stun服务器进行NAT

Android网络通讯简介

网络通信应该包含三部分的内容:发送方.接收方.协议栈.发送方和接收方是参与通信的主体,协议栈是发送方和接收方进行通信的契约.按照服务类型,网络通信可分为面向连接和无连接的方式.面向连接是在通信前建立通信链路,而通信结束后释放该链路.无连接的方式则不需要在通信前建立通信连接,这种方式不保证传输的质量. Android提供了多种网络通信的方式,如Java中提供的网络编程,在Android中都提供了支持.Android中常用的网络编程方式如下: 针对TCP/IP协议的Socket和ServerSock

微信红包的架构设计简介

@来源于QCon某高可用架构群整理,整理朱玉华. 背景:有某个朋友在朋友圈咨询微信红包的架构,于是乎有了下面的文字(有误请提出,谢谢) 概况:2014年微信红包使用数据库硬抗整个流量,2015年使用cache抗流量. 微信的金额什么时候算? 答:微信金额是拆的时候实时算出来,不是预先分配的,采用的是纯内存计算,不需要预算空间存储.. 采取实时计算金额的考虑:预算需要占存储,实时效率很高,预算才效率低. 实时性:为什么明明抢到红包,点开后发现没有? 答:2014年的红包一点开就知道金额,分两次操作

JSON 简介

ylbtech-JSON: JSON 简介 JSON:JavaScript Object Notation(JavaScript 对象表示法) JSON是存储和交换文本信息的语法,类似 XML. JSON 比 XML 更小.更快.更易解析. JSON 实例 { "employee":[ {"firstName":"John","lastName":"Doe"}, {"firstName"

Docker简介

Docker简介 什么是Docker: 正所谓Docker的英文本意为"搬运工",所以在我们的世界里,可以理解为Docker搬运的是装满任意类型的APP的集装箱,开发者可以通过Docker将APP变成一种标准化的.可移动植的.自动管理的组件.它用一种新的方式实现了轻量级的虚拟机,专业术语成为应用容器(Application Container) Docker的优势: 1.利用率高 ·Docker对系统资源的利用率很高,一台主机可以同时运行数千个Docker容器 2.可以快速的交付应用程