STUN协议介绍
STUN:简介
Simple Traversal of User Datagram Protocol (UDP) Through Network
Address Translators (NATs) (STUN)。
STUN,是为了实现透明的穿透NAT,而定义的一套协议。他使本地的内网的机器,具有取得,能够得知他的NAT网关的IP,NAT类型的能力。
为什么需要STUN:
因为NAT虽然解决了IP地址稀少的问题,但是也带来了很多的问题。比如所有P2P应用,像文件SHARE,多媒体,和在线游戏等等.
为了解决这个问题,有人将 Application Layer Gateways (ALGs) 放到了NAT中,
. ALGs 也有严重的问题,比如跟不上速度太块的CLIENT,每一个应用都需要单独的实现。
跟不上应用的发展。
为了克服ALGS的问题,又提出了the Middlebox Communications (MIDCOM) protocol
中间合协议。可是MIDBOX协议使,一些CLIENT可以控制NAT/防火墙的行为,通过这个
把应用协议和NAT部分分开,把ALGS从基本NAT里面处理开。不过因为要处理MIDBOX,那么
所有的NAT或者防火墙都要升级,
因为上面种种原因:
The protocol described here, Simple Traversal of UDP Through NAT
(STUN), allows entities behind a NAT to first discover the presence
of a NAT and the type of NAT, and then to learn the addresses
bindings allocated by the NAT. STUN requires no changes to NATs, and
works with an arbitrary(任意) number of NATs in tandem between the
application entity and the public Internet.
要想穿透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(Symmetric
如果发送的包的目的IP AND PORT,那么MAPPING IP AND PORT,将相同。
内部网同一台机器,同一个端口如果目的地址不同,那么MAPPING的端口也不同,
所以只有他主动连的服务器才可能知道他的MAPPING后端口,别的服务器如果想
连他只能靠猜测端口
总结:
前面3重NAT,MAPING PORT 和 IP,是根据发送包的的内部网的IP和端口决定的。
如果数据的内网IP和端口相同,那么MAPPING后的端口和地址是固定。
这个功能为我们的穿越提供了很好条件。
第4种NAT,打洞后的MAPPING 地址和端口将变地不可靠。很难穿越。
注意SERVERA,和SERVERB是两个公网地址,而不是两台机器,
STUN 的简单操作过程:
发送请求。请求分为两种
1. Binding Requests, sent over UDP,
用来发现是否NAT,用来发现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