STUN协议总结
该属性必须为stun消息的最后一个属性,因为输入HMAC的文本为完整性属性前的所有字节,并且该文本应用零填充,称为64字节的倍数。另一种情况是客户端收到了两倍的绑定响应消息,也应该提示遭到了潜在的攻击,不应使用响应中的映射消息。客户端创建带用户名和由该密码计算的HMAC值的绑定请求,通过UDP发送到服务器,服务器校验完整性以后,返回该客户端的映射地址,以及服务器源地址和改变地址。这张图说明了对于不
Stun协议在RFC3489进行了详细定义,作为UDP穿透NAT映射的一种CS协议方案。STUN服务器通常挂载到公共网络上,内网客户端通过stun可以获取当前的NAT类型和本机的外网IP地址和端口号,以此来接收外网的数据。
首先需要确定当前的NAT类型:
- 全锥型:内部的同一地址和端口请求都映射到同一个外网地址和端口,并且外网的任何主机能通过该映射地址发到该内部主机。
- IP限制锥型,内部的同一地址和端口请求都映射到同一个外网地址和端口,与全锥形不同的是,外网主机只能在内部主机先发送到外网主机以后,该外网主机才能发回来(在NAT记录了绑定的关系)。
- 端口限制锥型,如同IP限制锥形,但限制包括端口。一个外部主机(指定IP X 和端口P)能发送数据到内部主机,仅当内部主机之前已经发送过数据到IP X 和端口P才行。(在NAT记录了绑定的关系)。
- 对称型NAT,内部的同一地址和端口发送到指定目的地址和端口,映射到同一个外部地址和端口。如果同一个内网地址发送包到另一个地址,映射会被改变。并且只有收到数据包的外部主机才能发送UDP包到该内部主机(先在NAT记录绑定关系)。
需要说明stun协议,客户端发送两种请求,绑定请求和共享密钥请求。服务器返回四种响应,绑定响应,绑定错误响应,共享密钥响应和共享密钥错误响应。
Stun结构:
Stun头的结构为stun消息类型,长度与事务ID,作为生成的随机值用来识别当前事务。

Stun头后面是0个或多个属性,属性格式为TLV,包含2字节类型,2字节长度和可变长的值,需要注意消息都是4字节对齐的。

属性的类型如下
0x0001: MAPPED-ADDRESS
0x0002: RESPONSE-ADDRESS
0x0003: CHANGE-REQUEST
0x0004: SOURCE-ADDRESS
0x0005: CHANGED-ADDRESS
0x0006: USERNAME
0x0007: PASSWORD
0x0008: MESSAGE-INTEGRITY
0x0009: ERROR-CODE
0x000a: UNKNOWN-ATTRIBUTES
0x000b: REFLECTED-FROM
这张图说明了对于不同的类型,M表示属性是强制要求的,O表示属性是可选的,C表示属性根据消息而定,N/A表示不应该加上该属性。

MAPPED-ADDRESS属性表示映射的IP地址和端口,包含8bit地址族,和16bit端口,然后是固定长度表示IP地址,其他属性如SOURCE/CHANGED/RESPONSE-ADDRESS的格式都与MAPPED-ADDRESS相同。

MESSAGE-INTEGRITY属性用来校验数据完整性,包含HMAC-SHA1的计算值,HMAC 长度为20字节。该属性必须为stun消息的最后一个属性,因为输入HMAC的文本为完整性属性前的所有字节,并且该文本应用零填充,称为64字节的倍数。而该HMAC的密钥为共享密钥响应的PASSWORD属性值。
CHANGE-REQUEST属性用来给客户端请求让服务端使用不同的IP地址或端口发回响应。其中A表示改变IP,B表示改变端口,需要注意无论该标志位是多少,CHANGED-ADDRESS都要返回另一个地址和端口。

ERROR-CODE属性为一个介于100-699的数值,加上UTF-8编码的描述短语。

Stun过程:
接下来可以描述stun的交互过程了,首先客户端找到STUN服务器,基于TLS连接,发送一个共享密钥请求,不带任何属性。服务器构造用户名和密码,并返回响应。客户端收到响应以后关闭连接。
客户端创建带用户名和由该密码计算的HMAC值的绑定请求,通过UDP发送到服务器,服务器校验完整性以后,返回该客户端的映射地址,以及服务器源地址和改变地址。
如果客户端增加了CHANGE-REQUEST属性,则服务器将通过另一个地址发回给客户端。如果客户端增加了RESPONSE-ADDRESS,则服务器将发给另一个指定的客户端,并增加REFLECTED-FROM属性,该属性为用户名关联的来源地址。通过这两个额外属性,客户端可以查看当前处于哪种NAT类型后面。
异常处理:
另外需要注意的是属性类型大于0x7fff是可选的,意味着消息可以被客户端或服务器处理,即使遇到了不认识的属性。而数值小于或等于0x7fff的属性属于必选属性,这意味着除非客户端或服务器理解该属性,否则无法处理消息。
客户端收到第一次响应后应继续监听10秒,如果在这段时间收到了不同的消息类型或不同的映射地址,可能遭到了攻击。另一种情况是客户端收到了两倍的绑定响应消息,也应该提示遭到了潜在的攻击,不应使用响应中的映射消息。
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)