STUN协议说明 – 消息,属性,错误代码

STUN协议在VoIP实现中起着重要作用:发现NAT的存在,并学习和使用NAT分配给客户端的绑定。在本文中,我们将详细介绍STUN协议本身。

STUN协议

STUN是一种客户端 – 服务器协议。 STUN客户端(通常嵌入在VoIP软件中,例如IP PBX或IP电话)向STUN服务器发送请求以发现其公共IP和端口,并且STUN服务器返回响应。有两种类型的请求;通常通过UDP发送的绑定请求和通过TCP通过TLS(安全通信)发送的共享机密请求。共享密钥请求要求服务器返回一组临时凭证,然后在绑定请求和绑定响应交换中使用这些凭证,以便进行身份验证和消息完整性。

从STUN客户端发送到STUN服务器的绑定请求用于确定NAT分配的IP和端口绑定。 STUN客户端通过UDP向STUN服务器发送绑定请求;服务器检查绑定请求的源IP地址和端口,并将它们复制到发送回客户端的绑定响应中。在请求中还有属性(在本文后面更详细地解释),允许客户端要求将响应发送到其他地方;到不同的IP地址和端口。

STUN消息

STUN消息是使用大端(network ordered)二进制编码的TLV(类型长度值)。所有STUN消息都以STUN头开始,后跟STUN有效负载。有效负载是一系列STUN属性(本文稍后将详细介绍),其中的一组取决于消息类型。 STUN头包含:

STUN消息类型,通常是以下之一:

0x0001:绑定请求

0x0101:绑定响应

0x0111:绑定错误响应

0x0002:共享秘密请求

0x0102:共享秘密响应

0x0112:共享密钥错误响应

消息长度 – 以字节为单位表示STUN有效负载的总长度,但不包括20字节的头。

事务ID -Is用于关联请求和响应。

STUN协议属性存在于STUN请求和响应中

STUN服务器请求和响应都包含消息属性。 正如我们将在下面看到的,一些属性不是强制性的,一些属性可以在绑定请求和绑定响应中找到,其中一些只能出现在绑定请求中,而其他一些只能出现在绑定响应中。 下面是STUN属性列表和每个属性的简短说明:

  • 0x0001:MAPPED-ADDRESS– 此属性包含IP地址和端口。它始终位于绑定响应中,它指示服务器在客户端发送的绑定请求中看到的源IP地址和端口,即; STUN客户端的公共IP地址和端口,可以从Internet访问它。
  • 0x0002:RESPONSE-ADDRESS – 该属性包含IP地址和端口,是一个可选属性,通常位于绑定请求中(从STUN客户端发送到STUN服务器)。它指示要发送绑定响应(从STUN服务器发送到STUN客户端)的位置。如果绑定请求中不存在此属性,则绑定响应将发送到绑定请求的源IP地址和端口,该属性为0x0001:MAPPED-ADDRESS。
  • 0x0003:CHANGE-REQUEST – 此属性仅在绑定请求中允许且可选,包含两个标志;控制用于发送响应的IP地址和端口。这些标志称为“更改IP”和“更改端口”标志。 “更改IP”和“更改端口”标志对于确定客户端是否位于受限锥形NAT或受限端口锥形NAT后面非常有用。它们指示服务器从不同的源IP地址和端口发送绑定响应。
  • 0x0004:SOURCE-ADDRESS– 此属性通常出现在绑定响应中;它指示发送响应的源IP地址和端口,即客户端运行的计算机的IP地址(通常是内部专用IP地址)。由于此属性,STUN服务器可以检测两次NAT配置,因此非常有用。
  • 0x0005:CHANGED-ADDRESS– 此属性通常出现在绑定响应中;如果客户端请求“更改IP”和“更改端口”行为,它会通知客户端将使用的源IP地址和端口。
  • 0x0006:USERNAME– 此属性是可选的,并且存在于具有PASSWORD属性的共享密钥响应中。它用作识别消息完整性检查中使用的共享密钥的方法。
  • 0x0007:PASSWORD– 此属性是可选的,仅与共享密钥响应一起出现在USERNAME属性中。 PASSWORD属性的值具有可变长度,并用作STUN服务器和STUN客户端之间的共享密钥。
  • 0x0008:MESSAGE-INTEGRITY – 此属性必须是STUN消息中的最后一个属性,并且可以同时出现在绑定请求和绑定响应中。它包含STUN消息的HMAC-SHA1。
  • 0x0009:ERROR-CODE – 此属性仅出现在绑定错误响应和共享密钥错误响应中。它表示发生了错误,并且还指示已发生的错误类型。它包含的数值范围为100到699;这是错误代码,也是以UTF-8编码的文本原因短语,用于描述错误代码,适用于客户端。
  • 0x000a:UNKNOWN-ATTRIBUTES – 当错误代码为420时,此属性出现在绑定错误响应或共享秘密错误响应中;从请求中的客户端发送的某些属性是未知的,服务器不理解它们。
  • 0x000b:REFLECTED-FROM – 此属性仅存在于绑定响应中,其用途是提供可跟踪性,因此STUN服务器不能用作拒绝服务攻击的一部分。它包含请求来自的源的IP地址,即STUN客户端的IP地址。

常见的STUN服务器错误代码

与许多其他协议一样,STUN协议有一个错误代码列表。 STUN协议错误代码与HTTP或SIP类似。 以下是使用STUN协议时遇到的最常见错误代码的列表。 有关STUN协议错误代码的完整列表,请参阅STUN RFC 3489。

  • 错误代码400  – 错误请求; 请求格式不正确。 客户必须修改请求并尝试再次发送。
  • 错误代码420  – 未知属性; 服务器不理解请求中的属性。
  • 错误代码430  – 陈旧凭证; 请求中发送的共享密钥已过期; 客户端应获取新的共享密钥。
  • 错误代码432  – 缺少用户名; 请求中不存在username属性。
  • 错误代码500  – 服务器错误; 临时错误,客户端应该尝试再次发送请求。