3COM公司的SuperStack II Remote Access
System 1500為中小型企業和Internet
服務提供商提供全面的遠程訪問服務。其在一個平台中集成了非常廣泛的功能,以較低的設備開支,提供了撥入/撥出訪問、採用撥號或幀中繼和專線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和2866中,也可以在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一共需要下載以下軟件:
筆者是在內核版本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 ('new_password') WHERE user =
'root';
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、填充各個表格
下一步需要向上面創建的各個數據庫的表格中添加內容。
[root@radiusd scripts]# ./dictimport.pl ../raddb/dictionary
對3comRas1500來說,還需要加載usr的dictionary文件如下:
[root@radiusd scripts]# ./dictimport.pl ../raddb/dictionary.usr
[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是否開放。
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中設置以下屬性:
這裡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:
若需要設置該用戶的時間限額,則選擇check
item下面的add check
item,選擇Total-TimeLimte,面輸入時間限制的數字(時間單位為秒)因此三分鐘的時間限額對應的Total-TimeLimte屬性值為180,選擇
add check item,就會為該用戶加入了時間限額為3分鐘。
3
按照上面的例子,當設置了時間限額以,用戶使用時間超過該限額則自動斷線,而且不能再登錄進入,但是該web界面沒有提供如何清除使用時間的方法,這樣當需要為用戶增加時間限制,需要在以前的時間限額上添加新的時間限額,管理起來非常麻煩,這裡我寫了一個小小的cgi來清除用戶的使用記錄。