跳到主要内容

3. Packet Format (数据包格式)

3. Packet Format (数据包格式)

恰好一个 RADIUS 数据包封装在 UDP 数据字段 [4] 中, 其中 UDP 目标端口字段指示 1812 (十进制)。

当生成回复时, 源端口和目标端口会被反转。

本备忘录记录了 RADIUS 协议。RADIUS 的早期部署使用 UDP 端口号 1645, 这与 "datametrics" 服务冲突。RADIUS 的官方分配端口号是 1812。

RADIUS 数据格式的摘要如下所示。字段从左到右传输。

 0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Code | Identifier | Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
| Authenticator |
| |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Attributes ...
+-+-+-+-+-+-+-+-+-+-+-+-+-

Code (代码)

Code 字段是一个八位字节, 标识 RADIUS 数据包的类型。当接收到具有无效 Code 字段的数据包时, 它会被静默丢弃。

RADIUS 代码 (十进制) 分配如下:

  • 1: Access-Request
  • 2: Access-Accept
  • 3: Access-Reject
  • 4: Accounting-Request
  • 5: Accounting-Response
  • 11: Access-Challenge
  • 12: Status-Server (experimental)
  • 13: Status-Client (experimental)
  • 255: Reserved

代码 4 和 5 在 RADIUS 计费文档 [5] 中介绍。代码 12 和 13 保留以供可能使用, 但此处不再进一步提及。

Identifier (标识符)

Identifier 字段是一个八位字节, 有助于匹配请求和回复。RADIUS 服务器可以在短时间内检测到重复请求, 如果它具有相同的客户端源 IP 地址、源 UDP 端口和标识符。

Length (长度)

Length 字段是两个八位字节。它指示数据包的长度, 包括 Code、Identifier、Length、Authenticator 和 Attribute 字段。Length 字段范围之外的八位字节必须被视为填充并在接收时被忽略。如果数据包短于 Length 字段指示的长度, 则必须被静默丢弃。最小长度是 20, 最大长度是 4096。

Authenticator (认证器)

Authenticator 字段是十六 (16) 个八位字节。最高有效八位字节首先传输。此值用于对来自 RADIUS 服务器的回复进行认证, 并在密码隐藏算法中使用。

Request Authenticator (请求认证器)

在 Access-Request 数据包中, Authenticator 值是一个 16 八位字节的随机数, 称为 Request Authenticator。该值应该在密钥 (客户端和 RADIUS 服务器之间共享的密码) 的生命周期内是不可预测和唯一的, 因为请求值与相同密钥一起重复将允许攻击者使用先前截获的响应进行回复。由于预期可能使用相同的密钥对不同地理区域的服务器进行认证, Request Authenticator 字段应该表现出全局和时间唯一性。

Access-Request 数据包中的 Request Authenticator 值也应该是不可预测的, 以免攻击者欺骗服务器响应预测的未来请求, 然后使用该响应伪装成该服务器以应对未来的 Access-Request。

虽然像 RADIUS 这样的协议无法防止通过实时主动窃听攻击窃取经过认证的会话, 但生成唯一的不可预测请求可以防止针对认证的各种主动攻击。

NAS 和 RADIUS 服务器共享一个密钥。该共享密钥后跟 Request Authenticator 通过单向 MD5 哈希生成 16 八位字节的摘要值, 该值与用户输入的密码进行异或, 并将异或结果放置在 Access-Request 数据包的 User-Password 属性中。有关更详细的描述, 请参见属性部分中 User-Password 的条目。

Response Authenticator (响应认证器)

Access-Accept、Access-Reject 和 Access-Challenge 数据包中的 Authenticator 字段值称为 Response Authenticator, 包含对八位字节流计算的单向 MD5 哈希, 该流由以下组成: RADIUS 数据包, 从 Code 字段开始, 包括 Identifier、Length、来自 Access-Request 数据包的 Request Authenticator 字段和响应属性, 后跟共享密钥。即, ResponseAuth = MD5(Code+ID+Length+RequestAuth+Attributes+Secret), 其中 + 表示连接。

Administrative Note (管理注意事项)

密钥 (客户端和 RADIUS 服务器之间共享的密码) 应该至少与精心选择的密码一样大且不可猜测。最好密钥至少为 16 个八位字节。这是为了确保密钥有足够大的范围来提供针对穷举搜索攻击的保护。密钥禁止为空 (长度 0), 因为这将允许轻易地伪造数据包。

RADIUS 服务器必须使用 RADIUS UDP 数据包的源 IP 地址来决定使用哪个共享密钥, 以便 RADIUS 请求可以被代理。

当使用转发代理时, 代理必须能够在数据包通过每个方向时更改数据包 - 当代理转发请求时, 代理可以添加 Proxy-State 属性, 当代理转发响应时, 如果它添加了 Proxy-State 属性, 则必须删除它。Proxy-State 始终在任何其他 Proxy-State 之后添加或删除, 但不能对其在属性列表中的位置做出其他假设。由于 Access-Accept 和 Access-Reject 回复是在整个数据包内容上进行认证的, 因此剥离 Proxy-State 属性会使数据包中的签名无效 - 因此代理必须重新签名。

RADIUS 代理实现的进一步细节超出了本文档的范围。