关于STUN和NAT

2013/08/26 17:53
阅读数 5.3K

下面大多数都是转载的,只做了少量的更改和优化。。

  1. 什么是STUN服务器?

    STUN(用户数据报协议[UDP]简单穿越网络地址转换器[NAT])服务器允许所有的NAT客户终端(如防火墙后边的计算机)与位于局区域网以外的voip服务商实现电话通话。

    通过STUN服务器,客户终端可以了解他们的公共地址、挡在他们前面的NAT类型和通过NAT与特定局部端口相连的因特网方端口。这些信息将被用于建立客户终端与VOIP服务商之间的UDP通信,以便实现通话。STUN协议在RFC 3489中予以定义。

    虽然是在UDP 端口3478连接STUN服务器,但会暗示客户终端在另外一个IP和端口号上实施测试(STUN服务器有两个IP地址)。RFC 规定这个端口和IP是随意的。在二月二企业网络电话实施客户案例中,电话营销公司的包月电话使用二月二服务,解决了这个STUN的常见问题,获得企业的稳定使用VOIP通讯。

  2. 公开的免费STUN服务器

    当SIP终端在使用私有IP地址时,可能需要配置stun服务器。
    公开的免费STUN服务器有:
    //from origin post
    stunserver.org 
    stun.xten.com 
    stun.fwdnet.net 
    stun.fwdnet.net:3478
    
    stun.wirlab.net
    stun01.sipphone.com
    
    stun.iptel.org
    stun.ekiga.net
    stun.fwdnet.net 
    stun01.sipphone.com (no DNS SRV record) 
    stun.softjoys.com (no DNS SRV record) 
    stun.voipbuster.com (no DNS SRV record) 
    stun.voxgratia.org (no DNS SRV record)
    stun.xten.com
    stunserver.org
    stun.sipgate.net:10000
    stun.softjoys.com:3478
    
    //from https://gist.github.com/zziuni/3741933
    # source : http://code.google.com/p/natvpn/source/browse/trunk/stun_server_list
    # A list of available STUN server.
     
    stun.l.google.com:19302
    stun1.l.google.com:19302
    stun2.l.google.com:19302
    stun3.l.google.com:19302
    stun4.l.google.com:19302
    stun01.sipphone.com
    stun.ekiga.net
    stun.fwdnet.net
    stun.ideasip.com
    stun.iptel.org
    stun.rixtelecom.se
    stun.schlund.de
    stunserver.org
    stun.softjoys.com
    stun.voiparound.com
    stun.voipbuster.com
    stun.voipstunt.com
    stun.voxgratia.org
    stun.xten.com


  3. 如何使用STUN协议了解所在网络的NAT类型


    在P2P应用盛行的今天,很多人对处在不同局域网中的主机间的通信方式都不陌生.而UDP穿透作为这样一个主流技术也受到了很多人的关注,在UDP穿透中 有一个基本点就是要知道主机自身所在的网络类型以及经映射后的公网IP地址.二月二在VOIP方面进行全面的稳定布置,而STUN的解决问题在
    网络电话包月中获得最好的体验,因为许多企业无法提供稳定的语音通讯时候,选择了我们二月二的包月电话,不仅省钱,便宜,并且还是稳定,因为在STUN方面的应用二月二有着独特的布置,能解决众多的质量通讯问题。

    STUN(Simple Traversal of UDP over NATs,NAT的UDP简单穿越)是一种网络协议,它允许位于NAT(或多重NAT)后的客户端找出自己的公网地址,查出自己位于哪种类型的NAT之后 以及NAT为某一个本地端口所绑定的Internet端端口.这些信息被用来在两个同时处于NAT 路由器之后的主机之间建立UDP通信.该协议由RFC 3489定义.是一个客户机/服务器协议,在公网上存在着大量的STUN服务器,用户可以通过在自己主机上运行STUN客户端远程连接STUN服务器来确认自身的网络状况.



  4. 客户端主机所在网络可以分为以下类型:


  • Opened: 即主机拥有公网IP,并且没有,可自由与外部通信.
  • Full Cone NAT: 主机前有NAT设备,NAT规则如下:
    从主机UDP端口A发出的数据包都会对应到NAT设备出口IP的端口B,并且从任意外部地址发送到该NAT设备UDP端口B的包都会被转到主机端口A.
  • Restricted cone NAT: 主机前有NAT设备,NAT规则如下:
    从主机UDP端口A发出的数据包都会对应到NAT设备出口IP的端口B,但只有从之前该主机发出包的目的IP发出到该NAT设备UDP端口B的包才会被转 到主机端口A.
  • Port Restricted cone NAT: 主机前有NAT设备,NAT规则如下:
    从主机UDP端口A发出的数据包都会对应到NAT设备出口IP的端口B,但只有从之前该主机发出包的目的IP/PORT发出到该NAT设备UDP端口B的 包才会被转到主机端口A.
  • Symmetric UDP Firewall: 主机出口处没有NAT设备,但有防火墙,且防火墙规则如下:
    从主机UDP端口A发出的数据包保持源地址,但只有从之前该主机发出包的目的IP/PORT发出到该主机端口A的包才能通过防火墙.
  • Symmetric NAT: 主机前有NAT设备,NAT规则如下:即使数据包都从主机UDP端口A发出,但只要目的地址不同,NAT设备就会为之分配不同的出端口B.
  • Blocked: 防火墙限制UDP通信.


    再来说STUN服务器,STUN服务器运行在UDP协议之上,它具有两个固定公网地址,能完成以下几个功能:
    1, 告诉STUN客户端经NAT设备映射后的公网地址.
    2, 根据STUN客户端的要求,从服务器的其他不同IP或端口向客户端回送包.
如何根据STUN服务器提供的功能来确认网络类型呢?rfc3489给出了如下图过程:
这个过程可概括如下:
1, STUN客户端向STUN服务器发送请求,要求得到自身经NAT映射后的地址:
a,收不到服务器回复,则认为UDP被防火墙阻断,不能通信,网络类型:Blocked.
b,收到服务器回复,对比本地地址,如果相同,则认为无NAT设备,进入第2步,否则认为有NAT设备,进入3步.
2, (已确认无NAT设备)STUN客户端向STUN服务器发送请求,要求服务器从其他IP和PORT向客户端回复包:
a,收不到服务器从其他IP地址的回复,认为包被前置防火墙阻断,网络类型:Symmetric UDP Firewall.
b,收到则认为客户端处在一个开放的网络上,网络类型:Opened.
3, (已确认存在NAT设备)STUN客户端向STUN服务器发送请求,要求服务器从其他IP和PORT向客户端回复包:
a,收不到服务器从其他IP地址的回复,认为包被前置NAT设备阻断,进入第4步.
b,收到则认为NAT设备类型为Full Cone,即网络类型:Full Cone NAT.
4, STUN客户端向STUN服务器的另外一个IP地址发送请求,要求得到自身经NAT映射后的地址,并对比之:
a,地址不相同,则网络类型:Symmetric NAT.
b,相同则认为是Restricted NAT,进入第5步,进一步确认类型.
5, (已确认Restricted NAT设备)STUN客户端向STUN服务器发送请求,要求服务器从相同IP的其他PORT向客户端回复包:
a,收不到服务器从其他PORT地址的回复,认为包被前置NAT设备阻断,网络类型:Port Restricted cone NAT.
b,收到则认为网络类型: Restricted cone NAT.
说完了原理,再来说说,做这 个是因为有东西用到了P2P通信,但找不到合适的STUN的实 现,因而自己做了一个,用法很简单,本身就是一个实例,直接运行该,它会告诉你目前主机所处网络的类型及出口 IP/PORT.

展开阅读全文
打赏
1
9 收藏
分享
加载中
更多评论
打赏
0 评论
9 收藏
1
分享
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部