4 RADIUS协议的概述
(1)Radius协议在协议栈中的位置
Radius是一种流行的AAA协议,同时其采用的是UDP协议传输模式,AAA协议在协议栈中位置如图3所示。

图3 Radius协议在协议栈中的位置
(2)Radius协议选择UDP作为传输层协议
①NAS和Radius服务器之间传递的是几十上百个字节长度的数据,且Radius要求特别的定时器管理机制,用户可以容忍几十秒的验证等待时间。
②当处理大量用户,服务器端采用多线程,UDP简化了服务器端的实现过程。
③TCP是必须成功建立连接后才能进行数据传输的,这种方式在有大量用户使用的情况下实时性不好。Radius要有重传机制和备用服务器机制,它所采用的定时,TCP不能很好的满足。由于数据包可能会在网络上丢失,如果客户没有收到响应,那么可以重新发送该请求包。多次发送之后如果仍然收不到响应,RADIUS客户可以向备用的RADIUS服务器发送请求包。
④Radius依靠自身协议保证报文重传和服务器备份机制以确保计费可靠性。
5 认证计费功能概述
IP-PBX呼叫控制功能,主要是VoIP终端用户的认证计费控制过程,是VoIP系统商业化运营的核心模块。
Radius Client端,也叫NAS,主要的任务就是根据VoIP终端的呼叫请求携带的各种属性,包括账户ID、被叫号码、通话时间等,封装成标准的Radius数据包发送到Radius Server端,达到账户信息实时更新的效果。整个NAS端程序主要由两个模块构成:认证模块和计费模块,并把这两个模块整合到开源IP-PBX项目 Asterisk中。
5.1 标准RADIUS协议分析
(1)Radius Packet
RADIUS数据包被包装在UDP数据报的数据块(Data field))中,其中的目的端口为1812,RADIUS协议包结构如图4所示。
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 ...(不定长)
+-+-+-+-+-+-+-+-+-+-+-+-+-
Attribute:
0 1 2
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Length | Value …(不定长)
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
图4 RADIUS协议包结构图
(2)对Radius Packet格式各个域解释
①Code:包类型,一个字节长,指示RADIUS包的类型,包含不合法的Code的Radius包将被直接丢弃,code域主要包含了以下值类型。
1)code=1 Access-Request——认证请求数据包
本文AAA功能就是构建code=1的认证请求数据包。
2)code=2 Access-Accept——认证响应数据包
3) code=3 Access-Reject——认证拒绝数据包
4)code=4 Accounting-Request——计费请求数据包
本文Asterisk的AAA功能另外一个重点任务就是构建code=4的计费请求数据包,Accounting-Request 数据包中的两种状态类型(Acct-Status-Type)的计费请求数据包:Start(Value=1):Client开始对指定用户提供服务,计费开始;Stop(Value=2):Client停止对指定用户提供服务,计费结束。
5)code=5 Accounting-Response——计费响应数据包
因为是要更新账户信息,所以目前本文不需要处理计费响应数据包。
②Identifier:包标识符,一个字节长,用于匹配请求包和响应包,同一组请求包和响应包的Identifier应相同。协议规定:
1) 在任何时间,发给同一个RADIUS服务器的不同包的Identifier域不能相同,如果出现相同的情况,RADIUS将认为后一个包是前一个包的拷贝而不对其进行处理。
2) Radius针对某个请求包的响应包应与该请求包在Identifier上相匹配(相同)。
③Length:包长度,两个字节长,说明数据包的长度,是code、identifier、length、authenticator attribute fields的长度总和,有效范围是20~4096,超出范围的数据将被视为附加数据(Padding)或直接被忽略。
④Authenticator:验证字,16字节长,用于验证消息的负载,对包进行签名,该验证字分为两种。
1) 请求验证字---Request Authenticator,用在请求报文中,必须为全局唯一的随机值。
2) 响应验证字---Response Authenticator,用在响应报文中,用于鉴别响应报文的合法性。响应验证字=MD5(Code+ID+Length+请求验证字+Attributes+Key)。
⑤Attributes:Type指示了Atribute的类型,通用的有几十种,在系统中使用到的,如表4.1所示。Asterisk AAA模块的构建主要是构建表1列出的这些属性值的RADIUS数据包。
表1 Atribute的属性列表
|
属性值
|
属性名称
|
属性意义
|
|
1
|
User-Name
|
用户账户ID
|
|
2
|
User-Password
|
用户密码
|
|
4
|
Nas-IP-Address
|
Nas的ip地址
|
|
5
|
Nas-Port
|
用户接入端口号
|
|
6
|
Service-Type
|
服务类型
|
|
7
|
Framed-Protocol
|
协议类型
|
|
8
|
Framed-IP-Address
|
为用户提供的IP地址
|
|
11
|
Filter-Id
|
过滤表的名称
|
|
27
|
Session-Timeout
|
通知NAS该用户可用的会话时长 (时长预付费)
|
|
32
|
NAS-Identifier
|
标识NAS的字符串
|
|
40
|
Acct-Status-Type
|
计费请求报文的类型
|
|
41
|
Acct-Delay-Time
|
Radius客户端发送计费报文耗费的时间
|
|
44
|
Acct-Session-Id
|
计费会话标识
|
|
45
|
|