張文盛,侯整風
(1.合肥工業大學 計算機與信息學院,安徽 合肥 230009;2.安徽廣播電視大學 網絡中心,安徽 合肥 230022)
隨著Internet迅速普及,用戶數不斷擴大,各種網絡應用層出不窮,使得網絡流量的持續增長和固定帶寬之間的矛盾成為內網的重要問題[1-2].進而,用戶有意或無意(病毒)發送大量數據包,占用過高網絡帶寬,甚至堵塞網絡,造成對資源的不公平使用現象越來越頻繁[3-4].如何有效控制每個用戶的帶寬占用,使得大家公平有效使用帶寬便成為一個很現實和緊迫的課題.
對用戶的流量監控可量化為三個指標:連接數,字節流量和包流量[5-6].連接是指,內網用戶都是通過網關的NAT功能上網,為了實現NAT,網關需要跟蹤和維持每個連接,建立連接數據庫,每個連接包括如下信息:源地址,目的地址,協議(TCP,UDP等),源端口,目的端口,網關轉換使用的地址,網關轉換使用的端口等.一個用戶建立太多的連接,網關會創建相同數量的這樣表項,占用大量內存,檢索更耗時間.極端情況下,會導致內存耗盡,系統死機,顯然需要控制每個用戶的連接數.字節流量很好理解,就是我們通常說的流量,例如多少MB/s.包流量是指,用戶可發送大量的小包,總體的流量雖然不大,但每個包都會觸發網卡中斷來處理,導致中斷太多,系統疲于應付處于癱瘓狀態,因此有必要限制用戶的包速.這三個指標當中,除連接數外,字節流量和包流量是有方向的,分成發送方向和接收方向,對應內網用戶的上傳和下載.
Linux內置的Netfilter框架非常優秀,眾所周知的iptabes包過濾防火墻就是建立Netfilter框架之上[7-11].目前iptables功能已經非常強大,被廣泛應用于內外網網關,完成地址轉換和包過濾等任務.其提供的模塊如Limit,Connbytes,Connlimit,Hashlimit,Recent等涉及對每個IP的帶寬管理,但不成系統.Linux還內置了鏈路層Sched框架,提供TBF,HTB,SFQ等隊列規程,可實現QOS和流量控制功能.能部分實現對每個IP的帶寬管理,但是應用起來很復雜.我們利用Netfilter和Sched框架,建立一套基于IP的內網流量監控系統,統計每個內網IP地址的連接數、字節流量和包流量,檢測惡意流量,按照管理員設置的策略進行限制,使每個內網用戶都能公平合理地利用網絡資源[12-13].
本系統部署時的拓撲圖如圖1所示.本系統主要由三個部分組成:網關,管理服務器和用戶.內網用戶通過網關提供的NAT功能上網,網關應該部署在網絡出口處并接入主交換機,網關配置兩塊網卡,一塊配外網地址接互聯網,一塊配內網地址接主交換,主交換下接匯聚層或接入層交換機,接入層交換機直接接入用戶終端,形成樹形結構.管理服務器直接接入主交換機,和網關進行通訊,管理數據存放在數據庫中.

圖1 系統部署拓撲圖
詳細的系統功能和系統間連接及功能交互如圖2所示.

圖2 系統功能及連接圖
網關是系統核心,網關的主要功能分三個部分,流量統計、流量控制和訪問重定向.流量統計是記錄為每個用戶建立的連接數、轉發的字節數和包數,設計內容見表1.
統計內容按協議、數據方向、數據超限否進行分類.協議分TCP、UDP、ICMP和其他四種.數據方向分內到外和外到內.每個連接上也計數,統計內容和上面基本相同.
流量控制是根據管理員設置的策略對用戶的連接數、字節速和包速進行限制.限制策略有兩種,直接丟棄數據和執行QOS,執行QOS是指不丟棄數據,但是降低數據包的優先級,在滿足正常流量的情況下再處理,這里用到Sched框架和Prio隊列規程.除了連接數,字節速和包速的限速算法采用經典的令牌桶算法.

表1 流量統計
訪問重定向是對未認證的用戶,只開放DNS查詢和對于80端口的HTTP訪問,并全部重定向到本機,由應用層的的Bind進程完成DNS服務,由Nginx進程完成URL重定向到管理服務器的登錄驗證頁面,引導用戶先驗證,驗證通過后才開放全部訪問權限.
除了主要功能外,網關還需要一個控制服務器進程,完成和管理服務器的通訊和服務.控制服務器根據接收到的命令,使用系統調用接口從內核模塊接收統計數據或者向內核模塊設置參數.管理服務器運行在B/S模式下,使用基于MVC的PHP語言和MySQL數據庫開發,需要專用的通訊協議和PHP擴展完成控制服務器和服務器間的通訊.B/S模式是無狀態的,而流量監視任務需要計算兩次計數的差值,解決方法是將PHP Session ID的MD5值作為會話鍵值傳給控制服務器,在控制服務器上進行會話綁定,由控制服務器完成計算,返回計算結果.
本系統的實現分成四個部分:網關內核模塊、控制服務器、PHP擴展和管理系統.
根據系統功能,內核模塊需要在Netfilter架構中注冊兩個鉤子:重定向鉤子和流量監控鉤子,如圖3所示.
重定向鉤子的優先級在Mangle表的PREROUTING鏈和Nat表的PREROUTING鏈之間.此時連接已經建立,我們為每個內網IP地址建立信息數據庫和連接隊列,將這些連接掛入對應隊列.重定向鉤子查詢對應內網IP是否驗證過,如果沒有,給到53端口的UDP包和到80端口的TCP包打上Mark n,其他包全部丟棄.在PREROUTING鏈中加入一條規則,

圖3 網關內核模塊

這條規則將數據包重定向到本機,交由Bind和Nginx去處理域名查詢和HTTP重定向,使用用戶層應用程序處理而不是內核的好處是極大降低實現的復雜性.Nginx只需要建立一個默認站點,完成重定向到驗證頁面:

用戶驗證通過后,管理系統通過PHP擴展和網關通訊,設置用戶的IP為驗證狀態.
流量監控鉤子的優先級低于Filter表的FORWARD鏈,讓包先經過FORWARD鏈過濾.流量監控的算法是:
根據包找到對應的連接;



如果配置為執行QOS策略,還要在內外網網卡上綁定Prio隊列規程:

內核模塊提供系統接口供用戶層程序訪問,分別是:
1)SO_GET_TC_COUNTER_INFO查詢內核模塊版本和各主要數據結構大小,控制服務器用于檢查是否是自己支持的內核模塊;
2)SO_GET_TC_COUNTER_COUNT查詢有多少個內網IP控制信息,從而知道多少內網IP正在上網,也為了方便后面的操作,例如為獲取全部控制信息分配多大內存;
3)SO_GET_ALL_TC_COUNTERS獲取全部的內網IP控制信息,可以提取其中的統計數據,進行流量分析;
4)SO_GET_TC_COUNTER_BY_IP獲取指定IP的控制信息,監控特定IP的流量;
5)SO_GET_ALL_CONNS_BY_IP獲取指定IP的全部連接信息,監控特定IP的各個連接上的流量;
6)SO_SET_TC_COUNTER_BY_IP設置指定IP的控制信息,例如令牌桶大小,超限策略是執行QOS還是直接丟棄,正常Mark和超限Mark的值是多少,設置驗證狀態,空閑時間等等.
控制服務器完成對以上接口的包裝,并通過定制TCP協議對外提供服務.另外一個好處是這個接口一般只有root能訪問,經過控制服務器中轉,采用口令的方式驗證,在取消限制的同時不降低安全性.
PHP擴展使用定制的協議完成和控制服務器的通訊,協議接口除了上面所有的功能外,增加:
1)登錄驗證服務,只有授權的用戶名和密碼可以訪問控制服務器;
2)流量查詢服務,通過控制服務器提供的計算服務解決B/S無狀態問題.
PHP擴展到控制服務器的連接使用長連接技術,優化查詢性能.
管理系統主要管理用戶數據庫,通過PHP擴展執行用戶登錄驗證,監控用戶流量狀態,設置用戶流量控制參數等操作.
系統可以設置是否允許用戶登錄,是否綁定登錄IP,空閑時間等,并記錄用戶登錄信息.空閑時間是指,用戶沒有退出登錄而直接關機,系統無法知曉,使用超時機制檢測用戶一段時間內沒有任何流量就銷毀用戶的控制結構,節省內存,提高查找效率.
通過構建基于Netfilter的流量控制系統,可以有效控制客戶端經過網關的流量,監控用戶上網行為,提升內網安全和管理水平.另一方,其缺點也顯而易見,只能在流量通過網關時執行控制,無法從源頭限制,如果發生惡意的流量攻擊,系統將無能為力.
[1]周中偉.校園網絡流量控制的應用研究[J].湖南工業職業技術學院學報,2009,9(5):26-28.
[2]馮淑媛,趙明,鄭志凌.校園網絡流量控制策略的研究[J].湖南工業職業技術學院學報,2011,11(6):13-14.
[3]張連成,王振興,苗甫.網絡流量偽裝技術研究[J].計算機應用研究,2011,28(7):2418-2423.
[4]鄭黎明,鄒鵬,賈焰,等.網絡流量異常檢測中分類器的提取與訓練方法研究[J].計算機學報,2012,35(4):719-730.
[5]張藝瀕,張志斌,趙詠,等.TCP與UDP網絡流量對比分析研究[J].計算機應用研究,2010,27(6):2192-2197.
[6]蔣海,劉淑芬.流量監測MRTG的改進及其實現[J].計算機應用研究,2006(2):201-202.
[7]樂艷輝,李之棠,柳斌.基于Netfilter的P2P流量測量系統[J].計算機應用研究,2008,25(4):1224-1226.
[8]王振宇,鄧錦福.基于Netfilter的DNS實時監控統計系統的設計[J].計算機應用研究,2009,26(4):1487-1496.
[9]王裕邦,盧顯良,段翰聰,等.BT流量控制系統的設計與實現[J].計算機應用研究,2007,24(9):214-220
[10]劉羅仁,羅金玲.一種控制網關流量的控制器設計[J].重慶科技學院學報:自然科學版,2008,10(2):73-76
[11]黃文焱,褚偉.網絡流量控制系統在開源路由器上的實現[J].計算機技術與發展,2010,20(8):225-228
[12]張五生,鄭靈翔.基于Linux的流量控制系統研究[J].廈門大學學報:自然科學版,2010,49(1):38-42
[13]梁根,郭小雪,秦勇,等.基于Linux的流量控制機制研究[J].微計算機應用,2008,29(12):87-92