1 stun服务器介绍
STUN服务器,是一种网络通信协议的实现。STUN(Session Traversal Utilities for NAT)是一个网络协议,被设计用来帮助在网络地址转换(NAT)后的设备上的客户端发现其公共IP地址和互联网上的端口号。
STUN服务器是实现NAT穿越的关键技术,对于在复杂网络环境下的通信应用至关重要。它通过提供一种相对简单的方法来发现公共IP地址和端口,大大简化了在NAT后的设备上的通信问题。尽管存在一些局限性,STUN仍然是许多实时通信应用的重要组成部分。随着网络环境的不断演变,STUN及相关技术将继续发展,以满足新的挑战和需求。
1.1 STUN协议简介
-
背景: 在现代互联网架构中,许多设备(如家庭路由器或公司防火墙)使用NAT技术,这使得设备上的客户端在互联网上不可直接访问。
-
目的: STUN协议旨在解决这个问题,它允许位于NAT后的设备发现它们的公共IP地址和端口号。
-
工作原理: 一个STUN客户端(通常是一个VoIP电话或视频会议软件)将请求发送到STUN服务器,服务器响应该请求,提供客户端的公共IP地址和端口号。
1.2 STUN服务器的核心功能
-
NAT类型发现: 确定NAT的类型(全锥型、地址限制型、端口限制型或对称型),这对后续的通信策略至关重要。
-
公共IP和端口映射: 提供设备的公共IP地址和端口信息,使得NAT后的设备可以参与到互联网通信中。
-
会话保持: 在某些NAT配置中,STUN服务器帮助保持会话,即使在没有持续流量的情况下。
-
兼容性: STUN协议设计有助于跨不同类型和厂商的NAT设备工作。
1.3 STUN服务器的应用场景
-
VoIP(Voice over Internet Protocol): 在VoIP通信中,STUN服务器用于实现NAT穿越,使得VoIP设备可以在NAT后正常通信。
-
视频会议: 视频会议软件使用STUN服务器来建立和维护视频通话。
-
在线游戏: 在线游戏中,STUN服务器可以用来实现玩家之间的直接连接。
-
P2P(Peer-to-Peer)网络: STUN服务器在P2P网络中帮助节点发现彼此的公共IP地址和端口。
1.4 STUN服务器的局限性
-
对称型NAT问题: 在对称型NAT环境下,STUN服务器可能无法有效工作,因为每个外向连接都会映射到一个不同的端口。
-
安全性考虑: STUN协议本身不提供加密或身份验证,可能需要额外的安全措施。
-
依赖公共服务: 使用STUN协议通常依赖于公共STUN服务器,这可能引入了依赖和可用性的问题。
1.5 STUN服务器的配置和部署
-
服务器选择: 可以使用公共STUN服务器,也可以自行部署私有STUN服务器。
-
配置: 配置STUN客户端(如VoIP电话或视频软件),以指向特定的STUN服务器。
-
网络环境适配: 根据具体的网络环境和NAT类型调整STUN的使用策略。
1.6 相关技术和发展
-
TURN(Traversal Using Relays around NAT): TURN是与STUN相似的协议,设计用来在STUN不足以解决的NAT场景中提供中继服务。
-
ICE(Interactive Connectivity Establishment): ICE是一个框架,结合了STUN和TURN,用于在更复杂的网络环境中实现NAT穿越。
-
技术发展: 随着网络技术的发展,STUN协议也在不断更新,以适应新的网络环境和应用需求。
2 stun服务器安装
2.1 下载stunman
地址:http://www.stunprotocol.org/
wget http://www.stunprotocol.org/stunserver-1.2.13.tgz
2.2 安装编译工具
sudo apt-get install g++
sudo apt-get install make
sudo apt-get install libboost-dev # For Boost
sudo apt-get install libssl-dev # For OpenSSL
2.3 编译stunman
cd stunserver
sudo make
2.4 生成编译结果
stunclient, stunserver, stuntestcode
2.5 检测编译结果
./stuntestcode
Result of CTestDataStream: PASS
Result of CTestReader: PASS
Result of CTestBuilder: PASS
Result of CTestIntegrity: PASS
Result of CTestMessageHandler: PASS
Result of CTestCmdLineParser: PASS
Testing detection for DirectMapping
Testing detection for EndpointIndependent mapping
Testing detection for AddressDependentMapping
Testing detection for AddressAndPortDependentMapping
Testing detection for EndpointIndependentFiltering
Testing detection for AddressDependentFiltering
Testing detection for AddressAndPortDependentFiltering
Result of CTestClientLogic: PASS
Result of CTestRecvFromEx(IPV4): PASS
Result of CTestRecvFromEx(IPV6): PASS
Result of CTestFastHash: PASS
Result of CTestPolling: PASS
Result of CTestAtomicHelpers: PASS
2.6 启动stunman
./stunserver --help # 使用说明。
nohup ./stunserver --mode basic --primaryinterface p1p1 &
nohup ./stunserver --mode full --primaryinterface eth0 --altinterface eth1 &
NOTE: stuntman只具有stun功能,没有转发功能。支持UDP,TCP。兼容RFC3489。