歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux綜合 >> Linux資訊 >> Linux業界

搭建Linux下RADIUS服務器

作者:何千軍 文章來源:開放系統世界——賽迪網 2002年11月22日

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位,取值范圍(20grant 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協議的開發還興趣的話,你可以在此基礎上做深入的研究。




Copyright © Linux教程網 All Rights Reserved