利用cbq管理頻寬

文﹕VEGA 

曾經拜讀技巧心得的 [達成頻寬控管功能了!!!!! / 作者:阿忠],利用tc指令對上下游
宣告頻 寬資源,再根據位址設定頻寬控制原則,這一篇心得讓我初嚐QoS的美味。 
從tc開始拜讀,直至 advance routing 與 packet filter 的精彩文章參讀過後,對於
頻寬控制 終於有一點眉目,但是在組態設定上,由於tc的宣告繁瑣,外加核心必須支援
QoS模組,所以 對於一般人來說,QoS的門檻實在是有一點高得困難。 

RH7.2上,QoS為標準核心支援模組,您不需要下載 iproute2 與重新編譯核心,就可以
輕鬆享有 QoS的頻寬控制便利,在此藉由 study-area 版面,希望提供我的個人經驗,
讓有興趣的人也能輕 鬆享用 CBQ 對 QoS 的便利。 

--------------------------------------------------------------------------------
首先檢視一下我公司內部網路的概念圖,目前公司使用一條768 adsl與128k雙向固接,
adsl主要 提供網頁檢視與對外傳輸使用,128k專線則作為DNS/MX功能。 



沒有頻寬款理政策下,問題點出在當部份使用者下載檔案或使用瀏覽影音媒體時,大多
無辜的使 用者只能忍受龜爬的速度,為了解決這一個困擾已久的問題,決定建議施行QoS
管制政策。 

目前使用中的代理伺服器硬體基本為: 

=================================
AMD Authon MP 1.6G x 2
DDR 512Mb
IDE 60G for sys
SCSI 20Gx2 for proxy cache & logs
ADSL 768/128固接
=================================

對於20G的cache目錄來說,使用262144KB做快取記憶,符合squid的建議值,系統總使
用512Mb算剛剛好。基本政策是所有內部網路對外不管是檢視網頁,或使用其他方式與
外界通連,都必須經過proxy快取與記錄,或經過QoS規則限制頻寬。 

QoS政策:
基本上網: 640k下載,優先權高過其他服務。
傳輸鏈結: 128k低優先,除了Squid的代理伺服器外的各項服務。 

最新的cbq.init,請至freshmeat搜尋下載,目前為0.7.0,解決了先前0.6.4版本的錯
誤訊 息問題,關於CBQ組態檔案與使用方式,cbq.init裡邊都有相當清楚的敘述。 

CBQ所有的組態檔案,預設儲存路徑在/etc/sysconfig/cbq裡邊,檔案格式規定以
cbq-[編號1][編號2].class_name
組態檔案的編號1與編號2為兩組16進位數值,從0002至FFFF。 

附上我的QoS policy。

CBQ的組態裡邊,與tc一樣地,首先您必須宣告於區段中的類別頻寬,在類別頻寬的
主幹頻寬下,衍生出來的樹枝頻寬服從CBQ的頻寬限制,最重要地,網路卡兩邊都必
須設定對區段的頻寬限制。 

啟動cbq.init最簡單的指令就是 cbq.init start,支援tc指令以compile選項輸出。 

--------------------------------------------------------------------------------
還沒完!重要的還在後邊! 

在www的瀏覽未飽和前,192.168.0.0/18區段內的頻寬的確會被0003-0005與0103-0105之
間的CBQ組態給 成功控制住,只有不到128k的資源可以供這些不知道連到哪邊去的使用
者揮霍,可是 還有一個可怕的問題還未出現! 

基本政策上,Squid享有最高的頻寬使用權,由於squid以eth0對目標80埠擷取檔案後,
經由eth1的3128埠直接交給用戶端吸收,左手拿錢就 右手花錢,在資料傳送的過程中
,根本就不再經過腦袋瓜核心的封包處理,宛若電子商務 金銀焚化爐,這一個問題根
據通用埠口或單點位址建立QoS規則都不是好方法,前者降低全面速度,沒犯法的照樣
被揍;後者設定繁瑣,必須根據問題單一解決。所以QoS範例組態對squid無法發揮良好
作用,這一個可怕的漏洞就是,當使用者下載大檔案時,照樣把頻寬塞爆。 

在一段絕望後,難道一台主機就不能達成QoS的控制功能嗎?以硬體來解決的話,可以用第
二部主機負責快取,以限制快取主機的頻寬方式達成,如同限制區段網路上的主機頻寬一
樣,但是在花錢之前,柳暗花明又一春!squid的組態檔案又露出一線希望。 

在Squid 2.2版後,新增delay_pools的頻寬控制功能,一方面可以限制squid的使用頻
寬量, 最重要地,它可以限制每一個傳輸序的資料傳輸速度,這裡用的是bits為單位
,換算bps的話, 把bps除以8正是結果。 

例如我的快取網域服務中,可以使用squid的區段為wellusers,其他使用者被視作all,
所有列名在 允許存取squid快取的wellusers必須遵守8k/s的傳輸速度,所有使用者共享
768k的下載資源。 

acl wellusers src 192.168.0.0/255.255.192.0
acl all src 0.0.0.0/0.0.0.0
..
..
delay_pools 1
delay_class 1 3
delay_access 1 allow wellusers
delay_access 1 deny all
delay_parameters 1 96000/96000 -1/-1 8000/96000
..
..

經過CBQ的QoS與Squid的delay_pools雙重火力下,終於成功剋住網路頻寬爆衝的危機,
經過MRTG與 實際的檔案傳輸驗證下,起先快速傳輸的檔案速度,在一段時間的
delay_pools延遲下,最後降至 9k/s以內傳輸速度,對於一般使用者來說,終於可以安心
上網。 

惡毒的建議:


道高一尺、魔高一丈,在您安全的設定下,或許就是有人不信邪,利用GetRight等多
序傳輸企圖擠爆網路頻寬,或許您可以不厭其煩地針對IP位址限制頻寬,針對這一點
,我個人的建議是利用iptables的DROP鎖定網路卡MAC。 


--------------------------------------------------------------------------------
相關資源: 
cbq.init download:
http://freshmeat.net/projects/cbq.init/ 

個人經驗必有訛誤,但目前的組態設定已經成功剋住以前頻寬佔據的問題,歡迎指正賜教
!