本文主要介紹Linux網絡流量控制基本原理和路由軟件Coyote Linux,並聯系實際網絡環境,使用Coyote Linux配置路由服務器,利用TC命令進行不同網絡流量需求的控制,實現了專業路由器的流量控制功能。
1 引言
隨著計算機應用的普及和Internet的不斷發展,計算機網絡更廣泛的應用到了各行各業,多台計算機共享寬帶上網的情況也變得很普遍。現在對於ADSL來說,大都是開啟ADSL Modem的路由功能實現寬帶共享,對於一些LAN寬帶來講,一般是使用寬帶路由器,但是單獨購買寬帶路由器也是一筆不小開支,而且對網絡也不能進行有效實際地控制和管理。利用淘汰下來的舊電腦來做成專業的寬帶路由服務器,並且對連網的計算機進行流量控制或網絡管理就成了一些網絡管理人員的選擇。
2 Coyote Linux路由軟件
現在網上有很多制作軟件寬帶路由器的軟件,比如一盤秀、網絡神牛、FD Linux、LRP(Linux Router Project Linux路由工程)、FLi4L、Freecso、Coyote Linux等,這些軟件有一個共同的特點,都是基於Linux,可以在一張軟盤上運行。其中Coyote Linux是一個不錯的路由軟件,俗稱“北美小銀狼”,這款路由軟件是免費的。它是基於Linux 2.4.29 的系統內核,一台486以上,8M內存以上的普通PC,再加兩塊網卡就可以穩定運行,支持Ethernet (靜態的和動態DHCP), PPPoE, PPP撥號連接等上網方式,支持防火牆和QOS流量控制,支持SSH 2.0遠程操作和遠程web管理等,功能非常強大,和專業路由器相比毫不遜色。
Coyote Linux軟件可以到它的官方網站http://www.CoyoteLinux.com下載,現在最新的版本是Coyote Linux 2.24,它提供了一個在windows下運行的向導程序,解壓縮後運行coyote.exe,按照制作向導提示根據自己的實際網絡情況設置好參數,最後插入空白軟盤就可以制作出一張Coyote Linux路由服務器啟動軟盤。如果參數設置正確的話,用該軟盤啟動計算機就成了一台寬帶路由服務器,內部的多台計算機就可以通過它共享連入Internet。
3 流量控制的基本原理
Linux操作系統中的流量控制器(Traffic Control)主要是通過在輸出端口處建立一個隊列來實現流量控制。Linux流量控制的基本原理如圖1所示。
圖1 Linux流量控制的基本原理
接收包從輸入接口(Input Interface)進來後,經過流量限制(Ingress Policing)丟棄不符合規定的數據包,由輸入多路分配器(Input De-Multiplexing)進行判斷選擇:如果接收包的目的是本主機,那麼將該包送給上層處理;否則需要進行轉發,將接收包交到轉發塊(Forwarding Block)處理。轉發塊同時也接收本主機上層(TCP、UDP等)產生的包。轉發塊通過查看路由表,決定所處理包的下一跳。然後,對包進行排列以便將它們傳送到輸出接口(Output Interface)。一般我們只能限制網卡發送的數據包,不能限制網卡接收的數據包,所以我們可以通過改變發送次序來控制傳輸速率。Linux流量控制主要是在輸出接口排列時進行處理和實現的。
Linux流量控制主要由三大部分來實現:
◆ 隊列規則(Queue Discipline)
無論何時,內核如果需要通過某個網絡接口發送數據包,它都需要按照為這個接口配置的QDisc(排隊規則)把數據包加入隊列。然後,內核會盡可能多地從QDisc裡面取出數據包,把它們交給網絡適配器驅動模塊。
◆ 分類(Classes)
某些QDisc(排隊規則)可以包含一些類別,不同的類別中可以包含更深入的QDisc(排隊規則),通過這些細分的QDisc還可以為進入的隊列的數據包排隊。通過設置各種類別數據包的離隊次序,QDisc可以為設置網絡數據流量的優先級。
◆ 過濾器(Filters)
filter用於為數據包分類,決定它們按照何種QDisc進入隊列。無論何時數據包進入一個劃分子類的類別中,都需要進行分類。分類的方法可以有多種,使用filter(過濾器)就是其中之一。使用filter(過濾器)分類時,內核會調用附屬於這個類(class)的所有過濾器,直到返回一個判決。如果沒有判決返回,就作進一步的處理,而處理方式和QDisc有關。
因此,Linux流量控制主要分為建立隊列、建立分類和建立過濾器三個方面。其基本實現步驟為:
(1) 針對網絡物理設備(如以太網卡eth0)綁定一個隊列QDisc;
(2) 在該隊列上建立分類class;
(3) 為每一分類建立一個基於路由的過濾器filter;
(4) 最後與過濾器相配合,建立特定的路由表。
4 Coyote Linux中流量控制
某學校網絡結構圖如圖2所示,連接到Internet的線路帶寬為10M,校內有兩個不同帶寬的局域網:局域網1和局域網2,局域網1有 8 兆的帶寬給教師來上網查閱資料,局域網2需要2 兆的帶寬給學生上網使用。校內局域網和Internet連接采用安裝了兩塊RTL8139網卡的P166 32M計算機,用制作好的Coyote Linux路由軟盤啟動成為路由服務器。在此路由服務器上就需要一種策略,來進行流量控制和網絡管理。
圖2網絡結構圖
Coyote Linux 路由服務器有兩個網卡eth0 和eth1。如圖3所示eth0 連接到校內的局域網LAN上,eth1連接到廣域網Internet上。 通過修改 eth0 上的輸出隊列,我們可以確定校內計算機的下載(download)速率;通過修改 eth1 上的輸出隊列,我們可以確定校內計算機的上載(upload)速率。
圖3 路由服務器接口圖
以下就是在Coyote Linux路由服務器上對校內計算機下載的網絡流量控制方法,要想對上載的網絡流量進行控制方法是一樣的,只要在eth1上再建立一套規則。
4.1建立隊列
在網卡eth0的輸出接口上建立一個隊列。
將一個CBQ隊列綁定到網絡物理設備eth0上,其編號為1:0,實際帶寬為10Mb,包的平均大小為1000字節,包間隔發送單元的大小為8字節,最小傳輸包大小為64字節。
#tc qdisc add dev eth0 root handle 1:0 cbq bandwidth 10Mbit cell 8 avpkt 1000 mpu 64
4.2 建立分類
對內部不同網絡流量的局域網建立不同的分類,分類建立在隊列之上。針對一個隊列需建立一個根分類,然後在其上建立子分類。對於分類,按其分類的編號順序起作用,編號小的優先。一旦符合某個分類匹配規則,通過該分類發送數據包,則其後的分類不再起作用。
(1)創建根分類1:1,分配帶寬為10Mb。
#tc class add dev eth0 parent 1:0 classid 1:1 cbq bandwidth 10Mbit rate 10Mbit allot 1514 cell 8 weight 1Mbit prio 8 maxburst 20 avpkt 1000
該隊列的最大可用帶寬為10Mb,實際分配的帶寬為10Mb,可接收沖突的發送最長包數目為20字節,最大傳輸單元(加MAC頭)大小為1514字節,優先級別為8,包的平均大小為1000字節,包間隔發送單元的大小為8字節,相應於實際帶寬的加權速率為10Mb。
(2)創建分類1:10,其父分類為1:1,分配帶寬為8Mb。
#tc class add dev eth0 parent 1:1 classid 1:10 cbq bandwidth 10Mbit rate 8Mbit allot 1514 cell 8 weight 800Kbit prio 5 maxburst 20 avpkt 1000 bounded isolated
該隊列的最大可用帶寬為10Mb,實際分配的帶寬為 8Mb,可接收沖突的發送最長包數目為20字節,最大傳輸單元(加MAC頭)大小為1514字節,優先級別為5,包的平均大小為1000字節,包間隔發送單元的大小為8字節,相應於實際帶寬的加權速率為800Kb,獨占帶寬且不可借用未使用帶寬。
(3)創建分類1:20,其父分類為1:1,分配帶寬為2Mb。
#tc class add dev eth1 parent 1:1 classid 1:20 cbq bandwidth 10Mbit rate 2Mbit allot 1514 cell 8 weight 200Kbit prio 5 maxburst 20 avpkt 1000 bounded isolated
該隊列的最大可用帶寬為10Mb,實際分配的帶寬為 2Mb,可接收沖突的發送最長包數目為20字節,最大傳輸單元(加MAC頭)大小為1514字節,優先級別為5,包的平均大小為1000字節,包間隔發送單元的大小為8字節,相應於實際帶寬的加權速率為200Kb,獨占帶寬且不可借用未使用帶寬。
4.3 管理隊列
創建隊列,告訴內核使用SFQ隨機公平隊列來管理隊列。
SFQ針對一個TCP或UDP流,流量被分成相當多數量的FIFO(先進先出)隊列,使用散列算法將所有的對話映射到這些FIFO隊列,數據按照簡單輪轉的方式發送,每個會話都按順序得到發送機會。
#tc qdisc add dev eth0 parent 1:10 sfq quantum 1514b perturb 15 #tc qdisc add dev eth0 parent 1:20 sfq quantum 1514b perturb 15
上面就是創建SFQ管理隊列,每個FIFO隊列傳輸1514bit後切換到下一FIFO個隊列,每15秒後重新配置一次散列算法。
4.4建立過濾器
過濾器主要服務於分類,只需針對根分類提供一個過濾器。
(1)應用u32分類器到分類1:10,父分類編號為1:0,優先級為100,過濾協議為IP,目標地址為192.168.1.0/24。
#tc filter add dev eth0 protocol ip parent 1:0 prio 100 u32 match ip dst 192.168.1.0/24 flowid 1:10
(2)應用u32分類器到分類1:20,父分類編號為1:0,優先級為25,過濾協議為IP,目標地址為192.168.2.0/24。
#tc filter add dev eth0 protocol ip parent 1:0 prio 25 u32 match ip dst 192.168.2.0/24 flowid 1:20
在Coyote Linux路由服務器中通過以上配置操作,可以實現校內兩個局域網不同的下載速度,實現了網絡的流量控制,如果要進行更多的流量控制的話,就需要用TC命令進行更詳細的規則配置。
5 總結
利用淘汰的電腦和路由軟件配置成一個具有流量控制和網絡管理的專業路由器,作為中小企業部門內部網絡和外部Internet連接的橋梁有著很大的實用意義。這樣可以節約資金,充分利用空余資源,實現安全、可靠、靈活的網絡管理方案,也可以為網絡技術人員對網絡更深入地分析研究提供了一個良好的環境。