mysql流量控制_Daloradius限制上网流量
第十四節(jié):Daloradius限制上網(wǎng)流量
本節(jié)內(nèi)容主要通過在Daloradius下配置Freeradius,可以按月限制用戶的流量,Freeradius本身沒有內(nèi)置限制用戶每個月最大流量的功能。網(wǎng)上有很多類似的文章,但是都是針對freeradius版本2的文檔。由于版本3在很多地方與2有細(xì)微差別,直接用版本2的設(shè)置方法是行不通的。
這里總結(jié)整理了freeradius3的環(huán)境下每月流量限制功能的設(shè)置方法
1、增加radius自定義屬性
編輯字典文件:
vi /etc/raddb/dictionary
1
vi/etc/raddb/dictionary
在最下方增加兩行自定義屬性
ATTRIBUTE Max-Monthly-Traffic? 3003 integer
ATTRIBUTE Monthly-Traffic-Limit? ? 3004? ? integer
1
2
ATTRIBUTEMax-Monthly-Traffic?3003integer
ATTRIBUTEMonthly-Traffic-Limit??3004??integer
2、配置計數(shù)器SQL
1)新建月流量的計數(shù)器sql語句,下面的文件沒有需要新增
vi /etc/raddb/mods-config/sql/counter/mysql/monthlytrafficcounter.conf
1
vi/etc/raddb/mods-config/sql/counter/mysql/monthlytrafficcounter.conf
內(nèi)容如下
query = "SELECT SUM(acctinputoctets + acctoutputoctets) DIV 1048576 FROM radacct WHERE UserName='%{${key}}' AND UNIX_TIMESTAMP(AcctStartTime) > '%%b'"
1
query="SELECT SUM(acctinputoctets + acctoutputoctets) DIV 1048576 FROM radacct WHERE UserName='%{${key}}' AND UNIX_TIMESTAMP(AcctStartTime) > '%%b'"
重要說明:在radius 中的結(jié)果是以B來統(tǒng)計的,上面的語句中查詢結(jié)果除以 1048576 將單位轉(zhuǎn)換為MB,如果此處不 除以 1048576 ,最大只能限制2G,因為 int 最大為 2G
1KB=1024B;
1MB=1024KB=1024×1024B=1048576B
2)在sqlcounter模塊中增加新的計數(shù)器
編輯sqlcounter文件
vi /etc/raddb/mods-available/sqlcounter
1
vi/etc/raddb/mods-available/sqlcounter
在最下面一行追加以下內(nèi)容,注意,如果本文件中有其他內(nèi)容,請注視掉
sqlcounter monthlytrafficcounter {
sql_module_instance = sql
#dialect = ${modules.sql.dialect}
dialect = "mysql"
counter_name = Monthly-Traffic
check_name = Max-Monthly-Traffic
reply_name = Monthly-Traffic-Limit
key = User-Name
reset = monthly
$INCLUDE ${modconfdir}/sql/counter/${dialect}/${.:instance}.conf
}
1
2
3
4
5
6
7
8
9
10
11
sqlcountermonthlytrafficcounter{
sql_module_instance=sql
#dialect = ${modules.sql.dialect}
dialect="mysql"
counter_name=Monthly-Traffic
check_name=Max-Monthly-Traffic
reply_name=Monthly-Traffic-Limit
key=User-Name
reset=monthly
$INCLUDE${modconfdir}/sql/counter/${dialect}/${.:instance}.conf
}
啟用sqlcounter模塊
cd /etc/raddb/mods-enabled
ln -s ../mods-available/sqlcounter sqlcounter
1
2
cd/etc/raddb/mods-enabled
ln-s../mods-available/sqlcountersqlcounter
3、將monthlytrafficcounter模塊添加到用戶認(rèn)證過程中
編輯以下文件
vi /etc/raddb/sites-enabled/default
1
vi/etc/raddb/sites-enabled/default
在authorize部分中的sql后面,添加monthlytrafficcounter,例如:
authorize {
...
sql
# check monthly usage limit
monthlytrafficcounter
...
}
1
2
3
4
5
6
7
authorize{
...
sql
# check monthly usage limit
monthlytrafficcounter
...
}
注意:monthlytrafficcounter 一定要放在sql的下方,否則不生效,在很多教程中沒有說明這一點
4、重啟radiusd
1)重啟服務(wù)(或者先用radiusd -X模式進(jìn)行調(diào)試)
systemctl restart radiusd
1
systemctlrestartradiusd
2)故障排除,某些時候radiusd重啟后,會出現(xiàn)以下錯誤
/etc/freeradius/mods-enabled/sqlcounter[43]: Reference
"${modules.sql.dialect}" not found
1
2
/etc/freeradius/mods-enabled/sqlcounter[43]:Reference
"${modules.sql.dialect}"notfound
錯誤分析:這個錯誤的原因是在sqlcounter里面調(diào)用了sql模塊里面的dialect變量。如果模塊的啟動順序出現(xiàn)了啟動sqlcounter時,sql還沒有被加載的情況,就會導(dǎo)致這個變量獲取不到。
解決思路一:是在/etc/raddb/radiusd.conf中的instantiate部分指定模塊的啟動順序;
解決思路二:簡單粗暴的方式,直接在sqlcounter中將所有的dialect都指定為’mysql’。例如:
sqlcounter dailycounter {
sql_module_instance = sql
#dialect = ${modules.sql.dialect}
dialect = "mysql"
counter_name = Daily-Session-Time
check_name = Max-Daily-Session
reply_name = Session-Timeout
key = User-Name
reset = daily
$INCLUDE ${modconfdir}/sql/counter/${dialect}/${.:instance}.conf
}
1
2
3
4
5
6
7
8
9
10
11
12
sqlcounterdailycounter{
sql_module_instance=sql
#dialect = ${modules.sql.dialect}
dialect="mysql"
counter_name=Daily-Session-Time
check_name=Max-Daily-Session
reply_name=Session-Timeout
key=User-Name
reset=daily
$INCLUDE${modconfdir}/sql/counter/${dialect}/${.:instance}.conf
}
5、對目標(biāo)用戶或者組設(shè)置限量屬性
例如:增加mygroup組,對這個組限制每個月最大流量為1GB(1024MB)此處的單位已經(jīng)轉(zhuǎn)換為MB了。如果用戶已經(jīng)超過這個使用量,認(rèn)證將失敗。
在radius數(shù)據(jù)庫的check表以及reply表中,分別添加以下兩條記錄(也可以使用第三方的radius操作界面進(jìn)行操作,例如daloradius系統(tǒng))
# 在數(shù)據(jù)庫中限制用戶組的最大流量為1GB(本例中的用戶組名為mygroup)
mysql> INSERT INTO radgroupcheck (groupname,attribute,op,VALUE) VALUES ('mygroup','Max-Monthly-Traffic',':=','1024');
# 流量統(tǒng)計時間的間隔(60秒)
mysql> INSERT INTO radgroupreply (groupname,attribute,op,VALUE) VALUES ('mygroup','Acct-Interim-Interval',':=','60');
1
2
3
4
5
# 在數(shù)據(jù)庫中限制用戶組的最大流量為1GB(本例中的用戶組名為mygroup)
mysql>INSERTINTOradgroupcheck(groupname,attribute,op,VALUE)VALUES('mygroup','Max-Monthly-Traffic',':=','1024');
# 流量統(tǒng)計時間的間隔(60秒)
mysql>INSERTINTOradgroupreply(groupname,attribute,op,VALUE)VALUES('mygroup','Acct-Interim-Interval',':=','60');
如果用戶使用量已經(jīng)超過限制,radius認(rèn)證會失敗。使用radtest調(diào)試,可以看到返回的信息
返回的錯誤信息樣例:
Sending Access-Request Id 219 from 0.0.0.0:40100 to 127.0.0.1:1812
User-Name = 'myusername'
User-Password = 'mypassword'
NAS-IP-Address = 172.16.241.135
NAS-Port = 0
Message-Authenticator = 0x00
Received Access-Reject Id 219 from 127.0.0.1:1812 to 127.0.0.1:40100 length 70
Reply-Message = 'Your maximum monthly usage time has been reached'
(0) -: Expected Access-Accept got Access-Reject
1
2
3
4
5
6
7
8
9
SendingAccess-RequestId219from0.0.0.0:40100to127.0.0.1:1812
User-Name='myusername'
User-Password='mypassword'
NAS-IP-Address=172.16.241.135
NAS-Port=0
Message-Authenticator=0x00
ReceivedAccess-RejectId219from127.0.0.1:1812to127.0.0.1:40100length70
Reply-Message='Your maximum monthly usage time has been reached'
(0)-:ExpectedAccess-AcceptgotAccess-Reject
6、【可選】為daloRadius系統(tǒng)添加dictionary輔助定義
使用daloRadius管理界面管理為用戶或組添加屬性時,選擇Vendor的下拉框可以很方便的選擇屬性。對于自定義的屬性,也可以使用SQL語句添加到dictionary表里使其出現(xiàn)在下拉列表里
INSERT INTO dictionary (Type, Attribute,Vendor, RecommendedOP,RecommendedTable,RecommendedHelper,RecommendedTooltip) VALUES ('integer','Max-Monthly-Traffic','dictionary.freeradius.vpntraffic', ':=', 'check', 'The traffic of user per month', '1024=1G');
INSERT INTO dictionary (Type, Attribute,Vendor, RecommendedOP,RecommendedTable,RecommendedHelper,RecommendedTooltip) VALUES ('integer','Monthly-Traffic-Limit','dictionary.freeradius.vpntraffic', ':=', 'reply', 'The traffic of user per month', '1024=1G');
1
2
3
INSERTINTOdictionary(Type,Attribute,Vendor,RecommendedOP,RecommendedTable,RecommendedHelper,RecommendedTooltip)VALUES('integer','Max-Monthly-Traffic','dictionary.freeradius.vpntraffic',':=','check','The traffic of user per month','1024=1G');
INSERTINTOdictionary(Type,Attribute,Vendor,RecommendedOP,RecommendedTable,RecommendedHelper,RecommendedTooltip)VALUES('integer','Monthly-Traffic-Limit','dictionary.freeradius.vpntraffic',':=','reply','The traffic of user per month','1024=1G');
總結(jié)
以上是生活随笔為你收集整理的mysql流量控制_Daloradius限制上网流量的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql查询补丁更新_OS:服务器系统
- 下一篇: 无法想mysql进行插入_mysql 无