TR111的实现是基于STUN协议(Simple Traversal of UDP over NATs),由RFC3489制定,现已由RFC5389替代。STUN是通过client 和公网里的STUN server发送binding request/response来确定client的具体NAT类型。
STUN是一个简单的客户端 - 服务器协议。客户端发送一个请求到一台服务器,而服务器返回一个响应。
有两种类型的请求:
绑定请求(通过UDP发送)和共享密钥请求(发送TLS (通过TCP)) 。
共享秘密请求服务器返回一个临时的用户名和密码。此用户名和密码用于在随后的绑定请求和绑定响应,身份验证和消息完整性的目的。
准备工作:1台STUN client 在内网, 1台STUN server在公网,但它有两个IP地址sever_IP1和server_IP2。
Test I
1.客户端发送一个STUN绑定请求到服务器地址server_IP1,在STUN数据包属性CHANGE-REQUEST中在不设置任何标志,并且没有 RESPONSE-ADDRESS属性。这会导致服务器会从接收请求的的地址和端口发送响应返回给客户端。
2.如果这个测试没有response,那只有两种可能:1、STUN服务器不存在,或者你弄错了port。2、你的NAT设备拒绝一切UDP包从外部向内部通过(不支持cone NAT)。如果测试产生了一个response,client检查收到的UDP响应包的MAPPED-ADDRESS属性 。如果这个地址、端口和本地IP地址、端口是相同的,客户端知道它不是在NAT后面了。就继续进行Test II(请跳到Test II部分看)去侦测防火墙的类型,如果IP地址不同的话,就知道自己是在NAT的后面,继续进行第3步
3.client发送一个带有同时设置“change IP”和“change port” 的CHANGE-REQUEST属性的绑定请求到STUN server_IP1, 请求STUN server 用不同于第1步中的地址和端口来响应该请求(所以STUN server要准备两个不同的IP地址)。如果client 收到了STUN server用server_IP2地址和port2端口发送来的UDP数据包,那说明什么?说明NAT来着不拒,不对数据包进行任何过滤,这也就是STUN标准中的full cone NAT。遗憾的是,full cone nat太少了,这也意味着你能收到这个数据包的可能性不大。如果没收到,那么系统进行STEP4的操作。
4.client向STUN server的server_IP2地和port2端口发送一个数据包,server收到数据包后,把它收到包的源IP和port写到UDP包中,然后通过自己的server_IP2和port2把此包发还给client。和step1一样,client肯定能收到这个回应UDP包。此包中的port是我们最关心的数据,下面我们来分析:
如果这个port和step1中的port一样,那么可以肯定这个NAT是个CONE NAT,否则是对称NAT。道理很简单:根据对称NAT的规则,当目的地址的IP和port有任何一个改变,那么NAT都会重新分配一个port使用,而在step4中,和step1对应,我们改变了IP和port。因此,如果是对称NAT,那这两个port肯定是不同的。
如果在你的应用中,到此步的时候PORT是不同的,恭喜你,你的STUN已经死了。如果相同,那么只剩下了address restricted cone 和port restricted cone。进入step5。
STEP5:client向server的server_IP2地址的一个端口PD发送设置“change port” 的CHANGE-REQUEST属性的绑定请求,要求server用server_IP2地址和不同于PD的port返回一个数据包给client。
我们来分析结果:如果client收到了,那也就意味着只要IP相同,即使port不同,NAT也允许UDP包通过。显然这是address restricted cone NAT。如果没收到,没别的好说,port restricted NAT.
Test II
client发送一个带有同时设置“change IP”和“change port” 的CHANGE-REQUEST属性的绑定请求到STUN server_IP1, 请求STUN server 用不同于第1步中的地址和端口来响应该请求。如果client 收到了STUN server用server_IP2地址和port2端口发送来的UDP数据包,那说明什么?说明NAT来着不拒,不对数据包进行任何过滤,客户端知道它是开放互联网(或者,至少在一个有一个防火墙其行为像全锥型NAT ,但是没有转发)。如果client没有收到响应,就知道它是在对称的UDP防火墙后面(主机出口处没有NAT设备,但有防火墙,且防火墙规则如下:从主机UDP端口A发出的数据包保持源地址,但只有从之前该主机发出包的目的IP/PORT发出到该主机端口A的包才能通过防火墙)。