Ubuntu下配置FreeRadius+L2TP+MySQL,实现限制用户流量和登录人数
我已在上篇文章講解了如何搭建L2TP+MySQL+FreeRadius了,具體鏈接Ubuntu下配置FreeRadius+MySQL+xl2tpd,實現L2TP由FreeRadius認證連接并由MySQL管理用戶
現在我們要解決的是,如何使用MySQL來管理用戶流量。
一、MySQL管理FreeRadius
據我們所知,FreeRadius主要是認證用戶在連接登錄時的信息是否正確,及是否允許該用戶連接,而我們所有的這些配置都已集成在MySQL上,現在我們來分析一下MySQL的表信息。
MySQL下的radius庫共有12個表,包括cui、nas、radacct、radcheck、radgroupcheck、radgroupreply、radhuntgroup、radippool、radpostauth、radreply、radusergroup、wimax。
我們重點分析一下nas、radacct、radcheck、radgroupcheck、radgroupreply、radusergroup這六個表。
1.nas表
????nas表主要是用于代替FreeRadius原本的文件加載client信息,原本的文件加載路徑在/etc/freeradius/clients.conf,現在我們用nas表來配置client,配置的client將被FreeRadius加載,如何配置可見文章開頭的鏈接。
2.radacct表
????radacct主要是存放用戶連接過程中產生的信息,包括登錄時間,退出時間,連接時長、上傳所花費的流量、下載所花費的流量等,這個表我們將用于控制用戶流量。
3.radcheck表
? ? radcheck表主要是用戶管理的表,在這里可以設置L2TP用戶登錄的用戶名和密碼,原本在/etc/ppp/chap-secrets管理的用戶表已失效。
4.radgroupcheck表
? ? radgroupcheck表主要是設置用戶組下的驗證配置,驗證成功則允許該用戶組下的用戶連接,驗證不成功則拒絕該用戶連接,這里我們將用戶檢測用戶是否超出所設定的流量值,并決定是否繼續給該用戶連接。我們所有的控制操作都基本在該表配置
5.radgroupreply表
? ? radgroupreply表主要是設置用戶組下的用戶連接成功后返回的響應信息。
6.radusergroup
? ? radusergroup表主要是將用戶和組綁定在一起,即將用戶設置到某一個用戶組上。用戶在登錄連接時,首先會獲取用戶所在組的驗證配置,若驗證通過,則允許連接,并返回響應信息。
二、控制同時在線人數
1.打開FreeRadius的sql驗證
? ? 修改FreeRadius的sites-enabled/default文件
vim /etc/freeradius/sites-enabled/default? ??注釋掉accounting{}和seesion的radutmp,并反注釋sql屬性
accounting{... # radutmp...sql... }session{... # radutmp...sql... }? ? 修改sites-enabled/inner-tunnel文件
vim /etc/freeradius/sites-enabled/inner-tunnel? ? 注釋掉session的radutmp屬性,并打開sql屬性
session{... # radutmp...sql... }? ? 原來的是使用radutmp文檔驗證,現在使用sql驗證。
2.打開FreeRadius的SQL語句配置
? ? 修改sql/mysql/dialup.conf文件
vim /etc/freeradius/sql/mysql/dialup.conf? ? 反注釋掉simul_count_query的語句配置,去掉#號
... simul_count_query = "SELECT COUNT(*) \FROM ${acct_table1} \WHERE username = '%{SQL-User-Name}' \AND acctstoptime IS NULL" ...? ? 重啟一下FreeRadius服務
/etc/init.d/freeradius restart? ? 到這里已經完成了配置文件的基本設置,接下來可以使用radgroupcheck表對用戶組設置登錄人數限制了。
3.使用radgroupcheck表設置用戶組登錄人數限制
? ? 進入MySQL,為radgroupcheck表插入一條記錄
INSERT INTO radgroupcheck ( id , GroupName , Attribute , op , Value ) VALUES (NULL , 'normal', 'Simultaneous-Use', ':=', '1');? ? 這里使用了Simultaneout-User屬性,并設置它的值為1,這條語句代表了用戶組normal下的用戶,不能夠同時登錄同一個賬號,第二個登錄的用戶將無法連接,防止了用戶重復登錄,我們在服務器上使用radtest進行測試一下,看看返回什么信息。
? ? 首先,我們現在其他設備上登錄連接L2TP,并保持連接狀態,其次,我們在終端使用radtest再次連接,看看返回什么信息(前提是該用戶已經綁定在normal組上)
radtest crayon 123456 xxx.xxx.xxx.xxx 0 testing123? ? 服務器返回響應
Sending Access-Request of id 248 to xxx.xxx.xxx.xxx port 1812User-Name = "crayon"User-Password = "123456"NAS-IP-Address = xxx.xxx.xxx.xxxNAS-Port = 0Message-Authenticator = 0x00000000000000000000000000000000 rad_recv: Access-Reject packet from host xxx.xxx.xxx.xxx port 1812, id=248, length=68Reply-Message = "\r\nYou are already logged in - access denied\r\n\n"? ? 這里服務器返回了Access-Reject信息,表示已拒絕該用戶的登錄請求,原因是You are already logged in,即你已登錄了,不能再次登錄。
三、限制用戶流量使用
1.配置FreeRadius的自定義屬性
? ? 編輯dictionary文件
vim /etc/freeradius/dictionary? ? 在文件行尾加入自定義屬性
ATTRIBUTE Max-Monthly-Traffic 3003 integer ATTRIBUTE Monthly-Traffic-Limit 3004 integer? ? 加入這兩行代表了radgroupcheck表上可以識別并使用該屬性
2.配置SQL計數器
????修改radiusd.conf文件
vim /etc/freeradius/radiusd.conf????取消注釋modules{}的$INCLUDE sql/mysql/counter.conf屬性
modules{...$INCLUDE sql/mysql/counter.conf... }? ? 修改sql/mysql/counter.conf文件
vim /etc/freeradius/sql/mysql/counter.conf? ? 在行尾添加counter配置
sqlcounter monthlytrafficcounter {sqlmod-inst = sqlcounter-name = Monthly-Trafficcheck-name = Max-Monthly-Trafficreply-name = Monthly-Traffic-Limitkey = User-Namereset = monthlyquery = "SELECT SUM(acctinputoctets + acctoutputoctets) FROM radacct WHERE UserName='%{%k}' AND UNIX_TIMESTAMP(AcctStartTime) > '%b'"#query的SQL語句表示統計本月下用戶上傳流量和下載流量的總和,單位是字節,即1MB = 1024 * 1024 = 1048576 }? ? 編輯sites-enabled/default文件
vim /etc/freeradius/sites-enabled/default? ? 在authorize{}模塊下的行尾(即'}’前一行)添加monthlytrafficcounter計數器,打開計數驗證
authorize{....monthlytrafficcounter }? ? 重啟FreeRadius服務
/etc/init.d/freeradius restart? ? 到這里已經完成了基本配置,接下來可以使用radgroupcheck表對用戶組設置流量限制了。
3.使用radgroupcheck表對用戶組設置流量限制
????進入MySQL,為radgroupcheck表插入一條記錄,設置normal用戶組的流量限制為1MB
INSERT INTO radgroupcheck (groupname,attribute,op,VALUE) VALUES ('normal','Max-Monthly-Traffic',':=','1048576');? ? 設置統計時間周期為60秒
INSERT INTO radgroupreply (groupname,attribute,op,VALUE) VALUES ('normal','Acct-Interim-Interval',':=','60');????這里使用了Max-Monthly-Traffic屬性,并設置它的值為1048576,這條語句代表了用戶組normal下的用戶能使用的上傳和下載流量最大為1MB,我們先使用到超出流量,然后在服務器上使用radtest進行測試一下,看看返回什么信息。(前提是該用戶已經綁定在normal組上)
radtest crayon 123456 xxx.xxx.xxx.xxx 0 testing123? ? 服務器返回響應
Sending Access-Request of id 172 to xxx.xxx.xxx.xxx port 1812User-Name = "crayon"User-Password = "123456"NAS-IP-Address = xxx.xxx.xxx.xxxNAS-Port = 0Message-Authenticator = 0x00000000000000000000000000000000 rad_recv: Access-Reject packet from host xxx.xxx.xxx.xxx port 1812, id=172, length=70Reply-Message = "Your maximum monthly usage time has been reached"????這里服務器返回了Access-Reject信息,表示已拒絕該用戶的登錄請求,原因是Your maxmum monthly usage time has been reached,即你超出使用的流量,拒絕登錄。
?
?
如何使用daloRadius來實現web管理VPN,Ubuntu下配置FreeRadius+MySQL+xl2tpd + daloRadius,實現L2TP由web管理
?
參考資料:
http://www.racksam.com/2017/07/03/freeradius3-monthly-traffic-limit/
https://www.zhukun.net/archives/5367
?
總結
以上是生活随笔為你收集整理的Ubuntu下配置FreeRadius+L2TP+MySQL,实现限制用户流量和登录人数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OpenCV基础八:OpenCV在各操作
- 下一篇: App通过QQ/微信登录绑定用户信息的一