2024年5月12日发(作者:)
STUN原理及过程
STUN是RFC3489规定的一种NAT穿透方式,它采用辅助的方法探测NAT的IP和
端口。毫无疑问的,它对穿越早期的NAT起了巨大的作用,并且还将继续在ANT穿透中
占有一席之地。
STUN的探测过程需要有一个公网IP的STUN server,在NAT后面的UAC必须
和此server配合,互相之间发送若干个UDP数据包。UDP包中包含有UAC需要了解的
信息,比如NAT外网IP,PORT等等。UAC通过是否得到这个UDP包和包中的数据判断
自己的NAT类型。
假设有如下UAC(B),NAT(A),SERVER(C),UAC的IP为IPB,NAT的IP
为 IPA ,SERVER的 IP为IPC1 、IPC2。请注意,服务器C有两个IP,后面你会理解为
什么需要两个IP。
(1)NAT的探测过程:
STEP1:B向C的IP1的pot1端口发送一个UDP包。C收到这个包后,会把它收
到包的源IP和port写到UDP包中,然后把此包通过IP1和port1发还给B。这个IP和
port也就是NAT的外网IP和port(如果你不理解,那么请你去看我的BLOG里面的NAT
的原理和分类),也就是说你在STEP1中就得到了NAT的外网IP。
熟悉NAT工作原理的朋友可以知道,C返回给B的这个UDP包B一定收到(如
果你不知道,去读下我的其它文章)。如果在你的应用中,向一个STUN服务器发送数据
包后,你没有收到STUN的任何回应包,那只有两种可能:1、STUN服务器不存在,或
者你弄错了port。2、你的NAT拒绝一切UDP包从外部向内部通过(我们公司的NAT就
是)。
当B收到此UDP后,把此UDP中的IP和自己的IP做比较,如果是一样的,就说
明自己是在公网,下步NAT将去探测防火墙类型,我不想多说。如果不一样,说明有NAT
的存在,系统进行STEP2的操作。
STEP2:B向C的IP1发送一个UDP包,请求C通过另外一个IP2和PORT(不
同与SETP1的IP1)向B返回一个UDP数据包(现在知道为什么C要有两个IP了吧,虽
然还不理解为什么,呵呵)。
我们来分析一下,如果B收到了这个数据包,那说明什么?说明NAT来着不拒,
不对数据包进行任何过滤,这也就是STUN标准中的full cone NAT。遗憾的是,full cone
nat太少了,这也意味着你能收到这个数据包的可能性不大。如果没收到,那么系统进行
STEP3的操作。
STEP3:B向C的IP2的port2发送一个数据包,C收到数据包后,把它收到包的
源IP和port写到UDP包中,然后通过自己的IP2和port2把此包发还给B。
和step1一样,B肯定能收到这个回应UDP包。此包中的port是我们最关心的数
据,下面我们来分析:
如果这个port和step1中的port一样,那么可以肯定这个NAT是个CONE NAT,
否则是对称NAT。道理很简单:根据对称NAT的规则,当目的地址的IP和port有任何
一个改变,那么NAT都会重新分配一个port使用,而在step3中,和step1对应,我们
发布评论