STUN是一种帮助 Internet 端点处理 NAT(网络地址转换)的协议,这是属于专用网络并需要从另一个网络(如公共 Internet)访问的主机的典型条件。
为什么要使用 STUN?
实时通信服务以各种方式使用 STUN,从帮助发现与 NAT 后面的端点关联的公共 IP 地址和端口(基本的“STUN 服务”),帮助建立 ICE 的连接检查(RFC 8445),到作为基础工作用于使用 TURN ( RFC 8656 ) 进行中继或作为 SIP OUTBOUND ( RFC 5626 ) 的保活技术。
我们将提到传输地址,它只是 IP 地址和端口的组合。STUN 可以作为 NAT 穿越解决方案的基础,并提供三个主要功能:
- 可扩展的数据包格式
- 覆盖多种传输协议
- 两种认证机制
为了使用 STUN,NAT 穿越解决方案必须实现所谓的“使用”,它需要定义何时交换 STUN 消息、使用什么可选属性、使用什么类型的服务器以及认证机制或机制。ICE ( RFC 8445 )、SIP OUTBOUND ( RFC 5626 ) 和 NAT 行为发现 ( RFC 5780 ) 都是 STUN 用法的示例。
此外,STUN 可以通过其他方法、响应和属性进行扩展,就像 TURN ( RFC 8656 ) 一样。
STUN 是如何工作的?
STUN 是一个简单的客户端/服务器协议,定义了两种类型的事务:请求/响应和指示(如果您熟悉TURN,示例是分配请求/响应和发送/数据指示;指示不可靠,无法进行身份验证。
客户端发送请求,服务器发送响应。客户端和服务器都可以发送指示。所有交易都带有一个 96 位的交易 ID。
所有 STUN 消息都有一个固定的标头:方法(例如绑定)、类(请求、成功响应、错误响应等)和事务 ID,后跟零个或多个属性,其中一些可能是可选的或强制的,具体取决于上下文. 可选地,添加指纹。
标头是二进制的,按网络顺序,大端,固定部分有 20 个字节:2 个字节用于消息类型,2 个字节用于消息长度,4 个字节用于 Magic Cookie(0x2112A442 – 用于区分 STUN 与其他类型,还可以对传输地址进行异或运算)和 12 个字节的事务 ID。
绑定请求最简单的方法是绑定请求。客户端向服务器发送绑定请求,服务器以包含客户端服务器自反传输地址的绑定响应进行回复,该地址是服务器视为请求源的 IP 地址和端口。服务器自反传输地址在 XOR-MAPPED-ADDRESS 属性内返回,异或。
由于 STUN 服务器通常位于公共互联网中,因此这是客户端在最外面的 NAT 上发现其 IP 地址和端口的最简单方法。
认证机制定义了两种身份验证机制:短期和长期凭证。
前者用于 ICE 等环境,端点交换短期凭证以在连接检查期间建立其身份,而后者用于 TURN 等服务,其中客户端必须在被允许创建中继分配之前进行身份验证。
对于短期凭证,身份验证需要 USERNAME 和 MESSAGE-INTEGRITY 属性,而对于长期凭证,客户端首先会受到具有 401 错误响应的 Realm 和 Nonce 属性的质询(类似于 SIP 中的摘要式身份验证) ,然后客户端将它们与凭据一起使用来计算导致身份验证成功的 MESSAGE-INTEGRITY 值。
MESSAGE-INTEGRITY 字段是消息的 HMAC-SHA1,其密钥仅使用短期凭据的密码计算,或者使用密码、领域和随机数计算长期凭据(再次,类似于 SIP)。
有趣的是,STUN 消息可以与其他协议多路复用,就像在 WebRTC 会话期间使用 RTP 一样。与其他服务一样,可以使用 DNS SRV 查找来定位 STUN 服务器,其中服务类型是 stun 用于未加密的 UDP 或 TCP(默认端口:3478)或 stuns 用于加密连接(TLS,默认端口 5349)。
STUN 还有一种重定向机制(类似于用于 SIP 的机制,以及实际用于 TURN 的机制),它基于 300 错误响应和 ALTERNATE-SERVER 属性,其中包含客户端所在的备用服务器的传输地址预计会重定向其请求。正如我们所看到的,STUN 属性可以选择存在,并且它们具有 Type-Length-Value 结构:2 Bytes 表示类型,2 Bytes 表示长度,然后是值(填充为 4 Bytes 的倍数)。
标准属性是 USERNAME、ERROR-CODE、REALM、NONCE、SOFTWARE、ALTERNATE-SERVER。
如何剖析 STUN 消息?
Wireshark 能够检测 STUN 消息并为您剖析它们,因此您可以使用 ‘stun’ 过滤器或更复杂的过滤器,例如 ‘stun.type.method==0x0001’ 来查看所有绑定请求和响应,或 ‘stun .type.method==0x0001 和 stun.type.class==0x0010’ 查看所有绑定响应。这是 Wireshark 剖析 STUN 绑定请求的示例:
版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。