3com公司的superstack ii remote access system 1500为中小型企业和inte.net 服务提供商提供全面的远程访问服务。其在一个平台中集成了非常广泛的功能,以较低的设备开支,提供了拨入/拨出访问、采用拨号或帧中继和专线ppp连接的局域网间路由选择功能。其具有以下这些特点:
*易于安装。基于html浏览器的安装向导、图形用户界面(gui)和文档浏览。
*先进、易于操作。nat/pat地址转换功能提供低成本高效率的共享isp访问。dhcp服务器、中继和代理功能为本地和远程用户提供了简捷的lan访问方式。
*访问方式安全。包括本地验证,并可与radius、 windows nt .netware nos 服务器配合实现远程验证功能。
*i/o单元模块化。模块化单元,便于i/o卡的添加和扩展以及pri访问单元的热插拔。
*univerrsal connecttm技术。通过同一基本速率的 isdn 连接,提供了业界领先的模拟连接方式(速率可高达v.90)和 isdn 拨入访问方式。
*可伸缩性。将 isdn 和模拟连接方式集于一身,端口范围为4至24端口,可以随着您的需要进行扩展。
3com ras1500以较低价位为要求严格的用户提供了企业级网络的功能和优异性能,因此成为当前国内小型isp首选的远程接入服务器(remonte.network access server),在国内各个小型isp得到了广泛的应用。但是,虽然ras1500可以通过网管软件transcend.network supervisor (tns)提供功能强大易用的记费认证功能,能满足中小型企业的需求,但是其昂贵的价格使小型isp望而却步。因此如何以较低的价格实现ras1500的认证和记费就成为当前使用ras1500的小型isp的难以解决问题。
本文讨论了如何使用linux作为3comras1500的radius服务器,实现集中化的认证和记费功能,以减少管理的负担和费用。这里实现的radius服务器可以实现拨号用户的集中管理,可以实现拨号用户账号和系统账号集成或分开;并且在拨号账户独立时,实现web界面的管理,如:察看详细的log信息及各个用户的记账信息;实现用户拨号时间的限定,当该用户拨号时间到达限定以后,自动断开,而且不能再拨入。还可以实现用户的月拨号时间限定,每个月该用户只能使用限额的时间等等。
一、radius协议原理
radius是remote authentication dial in user service-远程拨入用户认证服务的简写。其定义了在nas.network access server,拨号服务器,如:pastmaster,3com rs1500等)和集中存放认证信息的radius服务器之间传输认证、授权和配置信息的协议。其协议的标准最新的定义在rfc2865和rfc2866中,也可以在www.freeradius.org处得到相关的rfc。radius以client/server模式工作,实现了对远程电话拨号用户的身份认证、授权和计费功能。其client端多为网络访问服务器(nas),主要用来将用户信息传递给server;server则对用户进行认证,并反回用户的配置信息。为保证传输的安全性,在client和server之间传送的数据均以md5方式加密。radius server端和client端通信主要有两种情况,一种是接入认证,另一种是计费请求。
radius是一种基于udp协议的上层协议,认证服务的监听端口号为1812,记费服务的监听端口号为1813。标准的radius数据包的结构包括code、id、length、authenticator和attributes几部分。
code表示该包的类型。id号区分不同消息并给予相应的应答。length为该radius包的总长度,authenticator 是供md5加密使用的字符串。attributes则对应包中具体内容,attributes包括三个部分:type、length、value。type表示该attribute的具体含义;length为该type的长度;value是该type的具体值。
1.接入请求 (access-request)
type length
01 username(以00为结束) ≥3(其长度为加入00后的长度)
02 password(以00为结束) 6
04 ip-address 6(接入服务器nas地址)
05 nas-port 6(物理端口号)
3d port-type 6
18 state ≥3(此处可不使用)
1f calling-station-id ≥3(电话呼入被叫号)
ie called-station-id ≥3(电话呼入主叫号)
2c acct-session-id(以00为结束) ≥3(以00结束其长度为加入00后的长度)
当用户请求连接时,client端给server发送认证请求,在请求包中带有username、password、nas_port等。server端收到该请求后会到users文件中查找对应信息,当用户的username和password正确时,server会返回access-accept信息,否则返回access-reject信息。
2.同意接入 (access-accept)
type length
06 service-type 6
07 framed-protocol 6
其中, service-type是用户的服务类型,大部分用户是framed(其值为2);framed-protocol则是用户所使用的协议,多为ppp(其值为1)或slip(其值为2)。access-accept包是由server端发给client端用户的数据包,此时server已认证通过了该用户,返回确认信号和该用户的配置参数.这些参数是在users文件中配入的。
3.拒绝接入 (access-reject)
无type位。access-reject包是用户认证不通过时,server发送给client端的否认信号。
4.计费请求 (accounting-request)
type length
01 username(以00为结束) ≥3(其长度为加入00后的长度)
04 ip-address 6
05 nas-port 6
3d port-type 6
28 acct-status-type 6(1:start;2:stop)
29 acct-delay-time 6
2c acct-session-id(以00为结束) ≥3(其长度为加入00后的长度)
2d acct-authentic 6(1:radius;2:local;3:remote)
2e acct-session-time 6
1f calling-station-id ≥3(被叫号)
1e called-station-id ≥3(主叫号)
07 framed-protocol 6
08 framed-ip-addres 6(nas地址)
2a acct-input-octets 6(仅用于stop中,表示多少字节从此端口输入)
2b acct-output-octets 6(仅用于stop中,表示多少字节从此端口送出)
2f acct-input-packets 6(仅用于stop中,表示多少包送给了用户)
(带*为必需项)
计费请求信息分为两种情况:一是start即当用户认证通过并连接成功时发出的信息;一是stop即用户断链时发出的信息,通知该用户断链,停止计费。两者是由acct-status-type来区分的。server记录这些信息到detail文件中,以供二次开发时使用。
5.计费应答 (accounting- response)
当server收到client端送来的计费请求时,会返回accounting-response包,告诉client端已收到该信息,该包无type位。
上面为radius协议的简单的原理,但是笔者推荐在动手之前阅读rfc2865和rfc2866,这样可以在安装除错中解决很多问题。
二、下载安装必需的支持软件
这里介绍使用linux环境下的radius服务器软件-icradius来实现radius服务器,其主页地址为:http://radius.innercite.com,当前最新版本为0.17。包括icradius一共需要下载以下软件:
icradius http://icradius.hislora.com.au/
perl http://www.perl.com
mysql http://www.mysql.com
perl dbi http://www.mysql.com/downloads/contrib.html
mysql dbd modules http://www.mysql.com/downloads/contrib.html
perl的authen::radius模块 http://www.mirror.ac.uk/sites/ftp.internat.freebsd.org/pub/freebsd/packages-4.1/all/p5-authen-radius-0.05.tgz[peek]
笔者是在内核版本2.2.14-5.0的redhat6.2环境下,使用的icradius为0.17版;perl为redhat6.2自带的5.005_03版;mysql下载的是rpm包形式发布的3.23.22-1的源代码;perl dbi为1.13版;mysql dbd modules为1.2214版本。所有的软件都为源代码方式下载。
1、mysql的安装;
笔者使用的rpm包方式的源代码,因此首先要解开rpm包:
[root@radiusd ideal]# rpm -ivh mysql-3.23.22-1.src.rpm
mysql ##################################################
然后:
[root@radiusd ideal]# cd /usr/src/redhat/sources/
[root@radiusd sources]# ls -al
total 6432
drwxr-xr-x 2 root root 4096 oct 29 14:07 .
drwxr-xr-x 7 root root 4096 oct 30 2000 ..
-rw-r--r-- 1 root root 6560696 jul 30 11:23 mysql-3.23.22-beta.tar.gz
-rw-rw-r-- 1 root root 3082 jul 30 11:23 mysql.gif
[root@radiusd sources]# tar xvgz mysql-3.23.22-beta.tar.gz
解压源代码包,就会在当前目录下生成mysql-3.23.22-beta的子目录,其中包含了mysql的源代码,然后使用下面的命令进行安装:
./configure
make
make install
scripts/mysql_install_db
就实现了mysql数据库服务器安装,其中启动mysql服务器的命令为:
/usr/local/mysql/bin/safe_mysqld &
现在就实现了mysql数据库服务器的安装和运行,下面我们应当设立基本的用户权限信息。缺省的,mysql拥有一个缺省的具有对数据库完全访问可控制的用户,名字为root,所以首先应当为该用户添加访问密码:
[root@radiusd src]# mysql -u root mysql
reading table information for completion of table and column names
you can turn off this feature to get a quicker startup with -a
welcome to the mysql monitor. commands end with ; or g.
your mysql connection id is 183 to server version: 3.23.22-beta
type help for help.
mysql>
这样就进入了mysql服务器的客户程序,然后发出sql语句命令:
update user set password = password ( ew_password) where user = oot;
flush privileges;
这里的new_password是为mysql的root用户设立的密码。但是一般推荐再创建一个权限和root完全相同的用户,命令如下:
insert into user
values (host,user,passwd,
y,y,y,y,y,y,y,y,y,y,y,y,y,y);
一般,mysql与icradius服务器都是运行在同一个服务器上,这时候,host为localhost,若你的icradius服务器运行在另外一台服务器上,则你需要在这里设定host为你的icradius服务器的名字。用户为你设定的用户名,密码为该用户的密码。
2、perl dbi的安装
perl dbi的安装非常简单,只要解开压缩包:tar xvfz dbi-1.13.tar.gz,然后进入解开得到的子目录以后,发出如下的命令:
perl makefile.pl
make
make test
make test test_verbose=1 (若上一步出现了问题时,才使用该命令)
make install (只有在前面的测试通过以后才能发出该命令)
3、mysql dbd modules的安装
perl dbi的安装非常简单,只要解开压缩包:tar xvfz msql-mysql-modules-1.2214.tar
.gz 。然后进入解开得到的子目录以后,发出如下的命令:
perl makefile.pl(会被询问以下问题:
[root@radiusd msql-mysql-modules-1.2214]# perl makefile.pl
which drivers do you want to install?
1) mysql only
2) msql only (either of msql 1 or msql 2)
3) mysql and msql (either of msql 1 or msql 2)
4) msql 1 and msql 2
5) mysql, msql 1 and msql 2
enter the appropriate number: [3] 1
### 在我们这里的需求,应该回答1
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自动被安装到这个目录下,则这里直接回车即可
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
4、perl的authen::radius模块的安装
首先,解压软件包 tar xvfz p5-authen-radius-0.05.tgz,则会在当前目录下生成文件+comment、+contents、+desc及+mtree_dirs和目录lib。然后创建目录:
mkdir /usr/lib/perl5/5.00503/authen/
然后拷贝该perl模块到创建的目录下:
cp lib/perl5/site_perl/5.005/authen/radius.pm /usr/lib/perl5
/5.00503/authen/
即可。
三、icradius的安装配置
1、解压编译软件包:
tar xvfz icradius-0.17.tar.gz
cd icradius-0.17/src
然后拷贝针对linux的make文件makefile.lnx为makefile:
cp makefile.lnx makefile
然后运行:
make
make install
2、创建radius数据库
首先需要创建数据库raidus:连接mysql数据库:
mysql -u root -pyourpassword
>create database radius; ### 创建radius数据库
然后需要创建radius数据库需要的各个表格,这里要使用使用icradius-0.17目录下的script子目录下的radius.db文件,该文件已经定义了所需要的各个表格,这里只要使用命令:
mysql -u root -pyourpassword radius < radius.db
即可。这时就创建得到了radius认证计费所需要的各个表格。这里一共定义了以下表格:
tables_in_radius
dictionary
hints
nas
radacct
radacct_summary
radcheck
radgroupcheck
radgroupreply
radreply
realmgroup
realms
usergroup
这里各个表格的含义大致是:
dictionary表格定义了在radius消息中的属性及属性值和其数字id的对应关系,还定义了每个属性值允许的数据类型。
nas定义了该radius管理的访问服务器的信息,如其ip地址,设备名字等等。
radacct用来保存记账信息;
radacct_summary也是用来保存记账信息。
radcheck定义了当用户拨入时需要检查的属性,如:密码,时间限额等等。
radgroupcheck定义了某个组的成员在拨入时,需要检查的公共属性。每个用户都可以属于一个组
radgroupreply定义了该组成员在拨入验证通过以后,在应答信息内需要定义的属性及其对应的
属性值。
radreply定义了成员在拨入验证通过以后,在应答信息内需要定义的属性及其对应的属性值。
usergroup定义了用户和组的对应关系。
3、填充各个表格
下一步需要向上面创建的各个数据库的表格中添加内容。
对于directionary表格的内容,icradius软件提供了一个脚本文件-script/dictimport.pl来创建,首先需要编辑该文件,修改my $dbusername = oot;my $dbpassword = ootpass;为对应的数据库管理员的用户名和密码。然后运行该脚本如下:
[root@radiusd scripts]# ./dictimport.pl ../raddb/dictionary
对于3comras1500来说,还需要加载usr的dictionary文件如下:
[root@radiusd scripts]# ./dictimport.pl ../raddb/dictionary.usr
第二需要向nas表格中添加内容如下,首先进入mysql:
[root@radiusd scripts]# mysql -u root -pszpzclljxk radius
reading table information for completion of table and column names
you can turn off this feature to get a quicker startup with -a
welcome to the mysql monitor. commands end with ; or g.
your mysql connection id is 30 to server version: 3.23.22-beta
type help for help.
mysql>
发出sql语言命令如下:
insert into nas
values (0,"3comras1500","ras1500","192.168.2.32","usr",24,"mlix1819","public","on");
这了,第一个字段含义为标示该nas设备的id号,为数字类型;第二个字段为设备名;第三个字段为设备的简称;第四个字段为设备的ip地址;第五个设备类型,对于3com设备类型为usr;第六个为设备的端口总数;第七个字段为radius服务器和nas之间共享的密码;第八个字段为snmp协议的共同体名;最后一个为snmp是否开放。
srcipts目录下的radius.cgi是一个实现web界面管理用户及记费信息的cgi程序,但是要在使用该脚本程序以前,首先要在radcheck表格中添加如下内容:
insert into radcheck values ("","admin","password","adminuserpassword");
insert into radcheck values ("","admin","radius-operator","yes");
这里,admin为radius的管理员用户名,adminuserpassword为管理员密码。
然后将radius.cgi和usage.cgi拷贝到www服务器的cgi-bin目录下,再编辑这两个文件,正确的设定数据库管理员的用户名和密码。然后指定两个文件中的$cookiedomain及$radhost为空。两个文件中的$radsecret指定为nas和radius共享的密码。
4、配置启动radiusd
在/etc/目录下创建子目录raddb:
[root@radiusd /etc]# mkdir /etc/raddb
在该目录下创建文件client,并设定其访问权限:
[root@radiusd raddb]# touch clients
[root@radiusd raddb]# chmod 664 clients
拷贝/home/radius/etc/raddb/目录下的radiusd.conf拷贝到/etc/raddb目录下:
[root@radiusd raddb]# cp /tmp/radius/etc/raddb/radius.conf /etc/raddb/
把/usr/src/icradius-0.17/raddb/中的除了radius.conf以外的所有文件拷贝到/etc/raddb目录中。
然后拷贝mysql的库文件到系统库目录中:
[root@radiusd /lib]# cp /usr/local/lib/mysql/* /lib
其中在/usr/icradius-0.17/redhat/目录下有一个名为rc.radiusd-redhat的文件,其是redhat环境下radiusd的启动文件,将其拷贝到/etc/rc.d/init.d目录下:
# cp /usr/src/icradius-0.17/redhat/rc.radiusd-redhat /etc/rc.d/init.d/rc.radiusd
编辑文件/etc/raddb/radius.conf文件,将第5行中,password后面修改为mysql的管理员密码。
编辑文件/etc/rc.d/init.d/rc.radius,修改
radiusd=/usr/sbin/radiusd
watcher=/usr/sbin/radwatch
为
radiusd=/usr/local/sbin/radiusd
watcher=/usr/local/sbin/radwatch
拷贝/usr/src/icradius-0.17/scripts目录下的radwatch到/usr/local/sbin目录下。
拷贝/usr/src/icradius-0.17/scripts目录下的radiusd.cron.daily到/etc/cron.daily/目录下。
拷贝/usr/src/icradius-0.17/scripts目录下的radiusd.cron.monthly到/etc/cron.daily/目录下。
然后就可以启动radiusd了:/etc/rc.d/init/rc.radiusd start。
这个时候,px ax就应该看到下面这些进程:
19090 pts/1 s 0:00 sh /usr/local/bin/safe_mysqld
19114 pts/1 s 0:00 /usr/local/libexec/mysqld --basedir=/usr/local --data
19116 pts/1 s 0:00 /usr/local/libexec/mysqld --basedir=/usr/local --data
19117 pts/1 s 0:00 /usr/local/libexec/mysqld --basedir=/usr/local --data
19164 pts/1 s 0:00 sh /usr/local/sbin/radwatch /usr/local/sbin/radiusd -
19165 pts/1 s 0:00 /usr/local/sbin/radiusd -f -y
19167 pts/1 s 0:00 /usr/local/libexec/mysqld --basedir=/usr/local --data
19168 pts/1 s 0:00 /usr/local/libexec/mysqld --basedir=/usr/local --data
19169 pts/1 s 0:00 /usr/local/libexec/mysqld --basedir=/usr/local --data
19170 pts/1 s 0:00 /usr/local/libexec/mysqld --basedir=/usr/local --data
19171 pts/1 s 0:00 /usr/local/libexec/mysqld --basedir=/usr/local --data
19174 pts/1 s 0:00 /usr/local/sbin/radiusd -f -y
19175 pts/1 s 0:00 /usr/local/libexec/mysqld --basedir=/usr/local --data
察看系统开放的端口:nestat -l,输出中应该有以下内容:
udp 0 0 *:radacct *:*
udp 0 0 *:radius *:*
然后察看radius的log文件,最后应该是下面的内容:
sun oct 29 18:46:17 2000: info: starting - reading configuration files ...
sun oct 29 18:46:17 2000: info: sql: attempting to connect to root@localhost:rad
ius
sun oct 29 18:46:18 2000: info: ready to process requests.
这就说明radius服务器已经成功的运行,这时候,应该按照3comras1500的sysmanage.pdf中的shuoming正确的设置ras1500。
四、以web界面管理用户
上面的图是radius的管理界面,在这里输入radius管理员的用户名和密码,则可以进入下面所示的管理界面:
这个管理界面是浅显易懂的,这里我以最常见的情况为例子来说明如何添加用户。
首先创建一个组,该组具有所有用户都应该具有的特性,选择manage groups->add new group->为该组起一个名字:all_user->选择add group。
随后进入组属性设置界面,在这个界面里,在reply item中设置以下属性:
reply items
attribute value check to remove
framed-ip-address 255.255.255.254
framed-ip.netmask 255.255.255.0
framed-protocol ppp
framed-compression van-jacobson-tcp-ip
这里framed-ip-address为255.255.255.254表示由nas从自己的ip pool中选择一个ip地址分配给该用户。其他属性都是非常清楚的了。
然后添加用户:manage users->add new user->为该用户组起一个名字:test,并设定该用户的密码 -> add user,然后就进入了用户属性设置界面,然后选择add to group -> 选择all_user组->确定,然后就可以看到,该用户的下面这些reply item:
reply items
attribute value check to remove group
framed-ip-address 255.255.255.254 -- all_user
framed-ip.netmask 255.255.255.0 -- all_user
framed-protocol ppp -- all_user
framed-compression van-jacobson-tcp-ip -- all_user
若需要设置该用户的时间限额,则选择check item下面的add check item,选择total-time—limte,后面输入时间限制的数字(时间单位为秒)因此三分钟的时间限额对应的total-time—limte属性值为180,选择 add check item,就会为该用户加入了时间限额为3分钟。
五、其他一些问题
所有的问题都应该可以通过阅读readme和faq.txt来解决。这里仅仅讨论两种常见的 问题。
1、若运行radius是出现segmentation fault,则可能需要作以下一些工作:
在加载dictionary以前,执行下面的sql语句:
insert into dictionary values (,vendor,usr,429,,);
然后运行 dictimport来加载dictionary.usr,再执行下面的sql语句:
update dictionary set vendor = "usr" where type = "attrib_nmc";
update dictionary set type = "attribute" where type = "attrib_nmc";
2 若希望限制用户登录时间,则在用户的check items中添加使用login-time属性。时间格式为被 ""或","隔离开来的串。天可能为mo, tu, we, th, fr, sa ,su. 分别代表星期1-星期日,其中wk表示工作日,也就是周一到周五(wk for mo-fr)。"any" or "al" 表示每一天。时间格式为hhmm-hhmm 的格式。例如:
wk2305-0855,sa,su2305-1655
允许一个用户在工作日的晚上23:05到早上8:55,周六全天,周日晚23:05到下午16:55。
3 按照上面的例子,当设置了时间限额以后,用户使用时间超过该限额则自动断线,而且不能再登录进入,但是该web界面没有提供如何清除使用时间的方法,这样当需要为用户增加时间限制,需要在以前的时间限额上添加新的时间限额,管理起来非常麻烦,这里我写了一个小小的cgi来清除用户的使用记录。
内容如下: clear_acct.cgi 和 web界面
只要输入要清除记账的用户名和mysql管理员密码就可以清除用户的记账信息。
4 此外我写了一个小小的提供用户察看自己的拨号时间使用情况的cgi程序,使用户可以输入自己的拨号密码通过验证以后,察看自己的拨号log记录
cgi程序 web页面
icrraius不仅仅支持3comras500,其他的拨号服务器也支持,但是笔者没有作试验,感兴趣的同志可以试一试。
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器