您好,欢迎来到思海网络,我们将竭诚为您提供优质的服务! 诚征网络推广 | 网站备案 | 帮助中心 | 软件下载 | 购买流程 | 付款方式 | 联系我们 [ 会员登录/注册 ]
促销推广
客服中心
业务咨询
有事点击这里…  531199185
有事点击这里…  61352289
点击这里给我发消息  81721488
有事点击这里…  376585780
有事点击这里…  872642803
有事点击这里…  459248018
有事点击这里…  61352288
有事点击这里…  380791050
技术支持
有事点击这里…  714236853
有事点击这里…  719304487
有事点击这里…  1208894568
有事点击这里…  61352289
在线客服
有事点击这里…  531199185
有事点击这里…  61352288
有事点击这里…  983054746
有事点击这里…  893984210
当前位置:首页 >> 技术文章 >> 文章浏览
技术文章

搭建Linux下RADIUS服务器

添加时间:2011-2-17  添加: admin 

RADIUS主要用于对远程拨入的用户进行授权和认证。它可以仅使用单一的“数据库”对用户进行认证(效验用户名和口令)。它主要针对的远程登录类型有:SLIP、PPP、telnet和rlogin等。

其主要特征有:

1. 客户机/服务器(C/S)模式

一个网络接入服务器(以下简称NAS)作为RADIUS的客户机,它负责将用户信息传入RADIUS服务器,然后按照RADIUS服务器的不同的响应来采取相应动作。另外,RADIUS服务器还可以充当别的RADIUS服务器或者其他种类认证服务器的代理客户。

2.网络安全(Network Security)

NAS和RADIUS服务器之间的事务信息交流由两者共享的密钥进行加密,并且这些信息不会在两者之间泄漏出去。

3.灵活认证机制(Flexible Authentication Mechanisms)

RADIUS服务器支持多种认证机制。它可以验证来自PPP、PAP、CHAP和UNIX系统登录的用户信息的有效性。

4.协议可扩展性(Extensible Protocol)

所有的认证协议都是基于“属性-长度-属性值”3元素而组成的。所以协议是扩展起来非常方便。在目前很多比较高版本的Linux中,它们都把RADIUS的安装程序包含在系统源码中。这样使得我们可以很容易地通过免费的Linux系统学习RADIUS授权、认证的原理和应用。


RADIUS协议原理


要弄清楚RADIUS协议为何能实现授权和认证,我们必须应该从四个方面去认识RADIUS协议:协议基本原理、数据包结构、数据包类型、协议属性。下面我们就来详细地介绍这些内容。

协议基本原理

NAS提供给用户的服务可能有很多种。比如,使用telnet时,用户提供用户名和口令信息,而使用PPP时,则是用户发送带有认证信息的数据包。

NAS一旦得到这些信息,就制造并且发送一个“Access-Request”数据包给RADIUS服务器,其中就包含了用户名、口令(基于MD5加密)、NAS的ID号和用户访问的端口号。

如果RADIUS服务器在一段规定的时间内没有响应,则NAS会重新发送上述数据包;另外如果有多个RADIUS服务器的话,NAS在屡次尝试主RADIUS服务器失败后,会转而使用其他的RADIUS服务器。

RADIUS服务器会直接抛弃那些没有加“共享密钥”(Shared Secret)的请求而不做出反应。如果数据包有效,则RADIUS服务器访问认证数据库,查找此用户是否存在。如果存在,则提取此用户的信息列表,其中包括了用户口令、访问端口和访问权限等。

当一个RADIUS服务器不能满足用户的需要时,它会求助于其他的RADIUS服务器,此时它本身充当了一个客户端。

如果用户信息被否认,那么RADIUS服务器给客户端发送一个“Access-Reject”数据包,指示此用户非法。如果需要的话,RADIUS服务器还会在此数据包中加入一段包含错误信息的文本消息,以便让客户端将错误信息反馈给用户。

相反,如果用户被确认,RADIUS服务器发送“Access-Challenge”数据包给客户端,并且在数据包中加入了使客户端反馈给用户的信息,其中包括状态属性。接下来,客户端提示用户做出反应以提供进一步的信息,客户端得到这些信息后,就再次向RADIUS服务器提交带有新请求ID的“Access-Request”数据包,和起初的“Access-Request”数据包内容不一样的是:起初“Access-Request”数据包中的“用户名/口令”信息被替换成此用户当前的反应信息(经过加密),并且数据包中也包含了“Access-Challenge”中的状态属性(表示为0或1)。此时,RADIUS服务器对于这种新的“Access-Request”可以有三种反应:“Access-Accept”、“Access-Reject”或“Access-Challenge”。

如果所有的要求都属合法,RADIUS返回一个“Access-Accept”回应,其中包括了服务类型(SLIP, PPP, Login User等)和其附属的信息。例如:对于SLIP和PPP,回应中包括了IP地址、子网掩码、MTU和数据包过滤标示信息等。

数据包结构

RADIUS数据包被包装在UDP数据报的数据块(Data field))中,其中的目的端口为1812。具体的数据包结构如表1。


8位 8位 16位
code Identifier Length
Authenticator(128位)
Attributes…(不定长)

 

· Code Code域长度为8位,具体取值见表2。其中,1、2、3用于用户认证,而4、5则是统计流量用,12、13 用于试验阶段,255作为保留。


code 含义
1 Access-Request
2 Access-Accept
3 Access-Reject
4 Accounting-Request
5 5Accounting-Response
11 Access-Challenge
12 Status-Server(experimenta)
13 Status-client(experimenta)
255 Reserved

 

· Identifier Identifier域长度为8位,主要用于匹配请求和回应数据包,也即是数据包的编号。

· Length 长度为16位,取值范围(20<=Length<=4096),此长度包括Code、Identifier、Length、Authenticator和 Attribute五个数据域的长度总和(Code、Identifier、Length、Authenticator为定长,Attribute为变长)。超出范围的数据将被视为附加数据(Padding)或直接被忽略。

· Authenticator 长度为16个字节(128位),主要用于鉴定来自RADIUS服务器的回应,同时也用于对用户口令进行加密。

(1) Request Authenticator

在“Access-Request”数据包中,Authenticator是一个16字节的随机数,称为“Request Authenticator”。它在NAS和RADIUS服务器之间通过“共享密码”(secret)传输数据的整个生命周期中是唯一的。  

(2) Response Authenticator

在“Access-Accept”、“Access-Reject”和“Access-Challenge”中的Authenticator域被称为“Response Authenticator”。

有下面的计算方法:

ResponseAuth = MD5(Code+ID+Length+RequestAuth+ Attributes+Secret) ——(公式1)

 

· Attributes 属性域的数据格式如表3所示。


8位 8位 不定长(0或多个字节)
Type Length value…

 

Type指示了Atribute的类型,通用的有几十种,如表4所示。


Type 说明 Type 说明
1 User-Name 5 NAS-Port-Id
2 Password 6 Service-Type
3 CHAP-Password 7 Framed-Protocol
4 NAS-IP-Address … …

数据包类型

RADIUS数据包的类型由其Code域(头8位)指定。

· Access-Request(接入-请求)

“Access-Request”数据包由NAS发出,由RADIUS服务器接收。

其中的“User-Password”或“CHAP-Password”属性值被默认地以MD5方法加密。

数据包结构如表5所示。


8位 8位 16位
Code=1 Identifier-随着Attributes的Value变化而变化,重传时则保持不变 Length
Authenticator(128位)—根据Identifier变化而变化
Attributes…(不定长)

 

Attributes应该包括以下几个属性:

◆ “User-Name”
◆ “User-Password”或“CHAP-Password”
◆ “NAS-IP-Address”
* “NAS-Identifier”
◆ “NAS-Port”
◆ “NAS-Port-Type”

 

· Access-Accept

“Access-Accept” 由RADIUS服务器发出,返回给NAS。表示用户的信息是合法的。其中包括了必要的配置信息,以便下一步为用户提供服务。数据包结构如表6所示。


8位 8位 16位
Code=2 Identifier-和“Access-Request”的Identifier相同 Length
Authenticator(128位)-属于Response Authenticator,由公式1计算得到
Attributes…(不定长)

 

Access-Reject“Access-Reject”由RADIUS服务器发出,返回给NAS。表示用户的信息是非法的。其中应该包括一个或多个的“Reply-Message”(回复消息,包含一些便于NAS返回给用户的一些错误信息)。数据包结构如表7所示。


8位 8位 16位
Code=3 Identifier-和“Access-Request”的Identifier相同 Length
Authenticator(128位)-属于Response的Authenticator,由公式1计算得到
Attributes…(不定长)

 

属性

属性如表8所示。其中,Length的计算方法为:Type+Length+Value。


8位 8位 不定长(0或多个字节)
Type Length Value…

 

Value有4种类型:

◆ String —— 0~253字节,字符串

◆ Ipaddress —— 32位,IP地址

◆ Integer —— 32位,整数

◆ Time —— 32位,从00:00:00 GMT, January 1, 1970到当前的总秒数

从这里可看出,RADIUS协议是一个不定长的协议栈。

安装RADIUS Server


要安装整套的IC-RADIUS,首先我们需要如表9所示的几个软件包。需要说明一下:表9中的源码包都是免费得到的,它们可以帮助我们架设一个完整的RADIUS应用环境。


软件源码包 说明
mysql-3.23.39.tar.gz MySQL数据库系统
DBI-1.18.tar.gz Perl调用数据库的通用接口
Msql-Mysql-modules-1.2216.tar.gz Perl DBI针对MySQL的Driver,即DBD for MySQL
RadiusPerl-1.05.tar.gz Perl对Radius的Authen模块
icradius-0.18.1.tar.gz IC-RADIUS源码包

 

假设所有的原码包都被拷贝到了/usr/tmp目录下了。

安装MySQL

1.解压源码包:

Linux]#cd /usr/tmp
Linux]#gzip zxvf mysql-3.23.39.tar.gz
Linux]#cd mysql-3.23.39

 

2.配置参数,安装软件:

//将mysql安装在/usr/local/mysql中
Linux]#./configure prefix=/usr/local/mysql
Linux]#make //编译,时间有点长,要有耐心
Linux]#make install //安装到/usr/local/mysql中

 

3.创建初始数据库:

Linux]#cd /usr/local/msyql/bin
Linux]#./mysql_install_db

 

4.创建共享库链接

Linux]#ldconfig //更新系统共享库链接

 

5.复制启动/停止脚本:

Linux]#cp /usr/tmp/mysql-3.23.39/support-files/mysql.server \
      /etc/rc.d/init.d/mysql.server

 

6.复制并修改初始化配置文件:

Linux]#cp /usr/tmp/mysql-3.23.39/support-files/my-medium.cnf \
/etc/my.cnf

 

使用vi打开my.cnf,在[client]下加入user=root,password处留空。

7.改变root口令:

Linux]#mysqladmin u root p password ‘新口令'

 

8.如果有多个版本的mysql共存

在/etc/my.cnf的[mysqld]下加入:

1. Log-bin
2. Server-id=1 //必须是唯一的,以区别于其他的mysql.server的id

 

安装DBI

Linux]#cd /usr/tmp
Linux]#tar zxvf DBI-1.18.tar.gz
Linux]#cd DBI-1.18
Linux]#perl Makefile.PL
Linux]#make test
//如果测试不通过,则使用make test TEST_VERBOSE=1
Linux]#make install

 

安装DBD for MySQL

Linux]#cd /usr/tmp
Linux]#tar zxvf Msql-Mysql-modules-1.2216.tar.gz
Linux]#cd Msql-Mysql-modules-1.2216
Linux]#perl Makefile.PL

 

这时,系统开始和用户交互,如下:

MySQL only
mSQL only (either of mSQL 1 or mSQL 2)
MySQL and mSQL (either of mSQL 1 or mSQL 2)
mSQL 1 and mSQL 2
MySQL,mSQL1andmSQL2
Enter the appropriate number: [3] 1

 

在我们这里的需求,应该回答1(说明此模块是同时for MySQL和mSQL的)

Do you want to install the MysqlPerl emulation? You might keep your old Mysql module (to be distinguished from DBD::mysql!) if you are concerned

about compatibility to existing applications! [n] n 这里回答n

Where is your MySQL installed? Please tell me the directory that

contains the subdir 'include'. [/usr/local/mysql]?

这是缺省的mysql安装目录,我们已经按照上面的方式安装,则MySQL自动被安装到这个目录下,则这里直接回车即可

Which database should I use for testing the MySQL drivers? [test]

直接回车即可

On which host is database test running (hostname, ip address

or host:port) [localhost]?

若mysql服务器和icradius服务器安装在同一个服务器上 则这里直接回车即可

User name for connecting to database test? [undef] root?

root Password for connecting to database test? [undef] passwd?

这里输入mysql的root用户的密码

make
make test
make install

安装RadiusPerl:Authen模块

Linux]#cd /usr/tmp
Linux]#tar zxvf RadiusPerl-0.05.tar.gz
Linux]#cd RadiusPerl-0.05
Linux]#perl Makefile.PL
Linux]#make
Linux]#make test
Linux]#make install

 

安装IC-RADIUS

1. 安装软件:

Linux]#cd /usr/tmp
Linux]#tar zxvf icradius-0.18.1.tar.gz
Linux]#cd icradius-0.18.1
Linux]#cp Makefile.lnx Makefile
Linux]#make
Linux]#make install

 

2.创建radius数据库:

Linux]#cd s
Linux]#mysql u root p mysql
Mysql>create database radius; //创建radius数据库
//添加radius用户
Mysql>grant all on radius.* on radius@localhost identified by ‘radius';
Linux]#mysqladmin u root p refresh //刷新数据库内容

 

3.导入数据表:

Linux]# mysql -u root -pyourpassword radius < radius.db
修改dictimport.pl,设置
my $dbusername = 'radius';
my $dbpassword = 'radius'

 

然后,导入dictionary内容,使radius.dictionary数据表中包含了基本的属性(ATTRIBUTE)和属性值(VALUE)等信息。

Linux]# ./dictimport.pl ../raddb/dictionary

 

Radius数据库结构如表10所示。


Radius数据库
dictionary radgroupcheck
hints radgroupreply
nas radreply
radacct realmgroup
radact_summary realms
radcheck usergroup

 

4. 启动radiusd

Linux]#cd /etc/rc.d/init.d
Linux]#radiusd start

 

这样,我们已经在Linux上成功的安装了一个完整的RADIUS服务器,你可以体验一下RADIUS服务器运行的感觉了。若你对RADIUS协议的开发还兴趣的话,你可以在此基础上做深入的研究。

关键字:RADIUS、服务器

分享到:

顶部 】 【 关闭
版权所有:佛山思海电脑网络有限公司 ©1998-2024 All Rights Reserved.
联系电话:(0757)22630313、22633833
中华人民共和国增值电信业务经营许可证: 粤B1.B2-20030321 备案号:粤B2-20030321-1
网站公安备案编号:44060602000007 交互式栏目专项备案编号:200303DD003  
察察 工商 网安 举报有奖  警警  手机打开网站