天天看點

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 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

繼續閱讀