freeradius中rlm_sqlcounter模塊對時間和流量限制的實驗筆記

實驗環境
fedora6 kernel:2.6.18-1.2798.fc6
mysql 5.0.22
freeradius 1.1.7
該模塊可以生成一個臨時的check屬性,該屬性的值通過sql語句從sql數據庫中的raddacct表統計數據,然後將它與數據庫radcheck或者 radgroupcheck表中的該屬性的值(已經被添加到check items中)進行比較,符合規則的纔會通過authorize。
eg.
sqlcounter noresetcounter {

counter-name = Max-All-Session-Time #沒有發現有什麼用

check-name = Max-All-Session  #對應radcheck表中的attribute

reply-name = Session-Timeout #返回給NAS的attribute type,這裏爲Session-Timeout

sqlmod-inst = sql  #指定查詢類型

key = User-Name  #

reset = never  #sqlcounter重置頻率,通常爲hourly, daily, weekly, monthly,never

query = "SELECT SUM(AcctSessionTime) FROM radacct WHERE UserName=’%{%k}’"

}
 


將上邊的內容加到radiusd.conf的modules中(在modules中已經有sqlcounter的示例),並在authorize中加入noresetcounter,這樣在認證過程中就會調用這個sqlcounter,radius會去計算radacct表中該用戶的所有AcctSessionTime之和,也就是累計上線時間,並與radcheck表中該用戶的Max-All-Session進行比較,如果Max-All-Session大於AcctSessionTime之和,就會將差值(正數)指定爲Session-Timeout的value,返回給NAS,反之拒絕登陸。這就實現了限制該用戶最大的上線時間,累計時間達到了Max-All-Session的話便會拒絕的登陸。
示例中有reset爲daily, weekly, monthly,如果是daily的話,這個時間限制只對當天有效,第二天就會重置數據了。關於這個沒有做詳細的實驗,據說因爲重置時間的原因計算的差值可能會有錯誤。具體可以看我在另一篇blog裏( some mail about freeradius sqlcounter limit the octets)摘錄的有關信息。
sqlcounter對時間的計算和限制登陸已經在freeradius的wiki裏有詳細的說明了,這裏還要說一下對流量的限制。
根據流量來限制登陸可以在radreply表中添加Chillispot-Max-All-Octets(我用的NAS爲coova-chilli)屬性,該賬號流量在達到這個值後,會被chilli強制下線。這裏的流量包括上行和下行,如果只限制下行,則需要Chillispot-Max-Input-Octets,對應的上行則是Chillispot-Max-Output-Octets,這是coova-chilli的屬性。實踐證明,coova官網說:
ChilliSpot- Max-Output-Octets:Maximum number of octets the user is allowed to receive,ChilliSpot-Max-Input-Octets:Maximum number of octets the user is allowed to transmit
這個正好說反了,但是在chillispot之前的版本中,比如chillipot 1.1.0卻的確是這樣的。
如果要防止流量已經達到了最大數值的賬號再次登陸的話,上邊的方法就不行了。因爲上邊只對當次登陸給了對應的屬性來讓他自動掉線,並沒有對其他有任何的限制。這就要借用sqlcounter來實現。事實上,上邊的方法完全是沒有必要的。我們只需要設置一個sqlcounter,並在radreply不要再重複添加Chillispot-Max-All-Octets屬性。這樣就既可以限制本次也會對以後的登陸進行計算.
限制下行流量的sqlcounter

sqlcounter octets {
counter-name = Max-All-Session-Octets #沒有發現有什麼用
check-name = Chillispot-Max-Input-Octets #對應radcheck表中的attribute
reply-name = Chillispot-Max-Input-Octets #返回給NAS的attribute type,這裏爲Session-Timeout
sqlmod-inst = sql #指定查詢類型
key = User-Name #
reset = never #sqlcounter重置頻率,通常爲hourly, daily, weekly, monthly,never
query = "SELECT SUM(AcctInputOctets) FROM radacct WHERE UserName=’%{%k}’"
}
 

最後別忘了將octets加入authorize中。
兩點說明
1. 我在freeradius-1.1.3版本中測試時發現,reply-name被默認固定成了Session-Timeout,我們指定的reply-name沒有效果,所以就不能用它來進行流量限制了。
2. 網上查到的資料還有一項參數,是error-msg還是reply-message,意思是返回給NAS的錯誤信息,但是我在1.1.7版本中沒有實驗成功,源碼中好像也沒有這樣的參數,不能確定.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章