我已在上篇文章講解了如何搭建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 1812
User-Name = "crayon"
User-Password = "123456"
NAS-IP-Address = xxx.xxx.xxx.xxx
NAS-Port = 0
Message-Authenticator = 0x00000000000000000000000000000000
rad_recv: Access-Reject packet from host xxx.xxx.xxx.xxx port 1812, id=248, length=68
Reply-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 = sql
counter-name = Monthly-Traffic
check-name = Max-Monthly-Traffic
reply-name = Monthly-Traffic-Limit
key = User-Name
reset = monthly
query = "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 1812
User-Name = "crayon"
User-Password = "123456"
NAS-IP-Address = xxx.xxx.xxx.xxx
NAS-Port = 0
Message-Authenticator = 0x00000000000000000000000000000000
rad_recv: Access-Reject packet from host xxx.xxx.xxx.xxx port 1812, id=172, length=70
Reply-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