• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            isware

            Linux做一個功能完備的路由器

                摘要:本文主要介紹如何用Linux做一個功能完備的路由器,這里將主要介紹靜態路由器和動態路由器的配置,但不包括IP偽裝或者說公用一個IP地址訪問外面網絡等問題。其已經不屬于本主題討論的范圍,請參考其他如防火墻的配置等的內容。  

                LRP(Linux Router Project) 已經成立了有好幾年的時間了。這個計劃的目的是利用Linux操作系統將老舊的個人電腦如486當成網絡的路由器使用。利用Linux低成本建立的路由器 可能引起企業界廣泛的注意。正如StoneFly Technology的系統整合工程師Bret Berger所說的,對無法負擔兩千(美元)思科 (Cisco)路由器的使用者來說,利用486加上幾張以太網卡,當成路由器使用,是另一個選擇。而對于一些小型企業、小型ISP ,甚至是政府機構,這 是一個很好的解決方案。事實上目前國內高校很多場合正是利用了這一解決方案。  

                由于LRP計劃已經把Linux的源代碼精簡 化,LRP軟件可以少于2MB ,同時也可以將LRP軟件放入一張軟盤內。也就是說在沒有硬盤的情況下,LPR也可以利用軟盤,載入電腦中使用。 Virtual Design Group的軟件工程師Michael Kornegay則表示,他們已經將Linux路由器軟件安裝在一架老舊的x86 個人電腦上,再加上兩張以太網卡,沒有使用硬盤的設備,只是使用軟盤啟動,便當成陽春型的路由器與防火墻使用。  

                我們在這一章 里不是教大家如何制作小于2MB的LRP軟件包,而是告訴大家如何利用Linux來獲得一個性能良好、價格低廉的路由器。利用Linux構建路由器使用的 成本雖然便宜,可是在性能與效率上與真正的路由器相比,卻還是有一段距離。對于玩家們或是一些要求不高的使用者來說,這是一個不錯的選擇。  

            什么是路由器? 
             簡單的說:路由器的功能就是尋路――給IP包尋找正確的路徑以通往目的地。下面是比較詳細的介紹:  

            原理與作用  

                路 由器(Router)用于連接多個邏輯上分開的網絡,所謂邏輯網絡是代表一個單獨的網絡或者一個子網。當數據從一個子網傳輸到另一個子網時,可通過路由器 來完成。因此,路由器具有判斷網絡地址和選擇路徑的功能,它能在多網絡互聯環境中,建立靈活的連接,可用完全不同的數據分組和介質訪問方法連接各種子網, 路由器只接受源站或其他路由器的信息,屬網絡層的一種互聯設備。它不關心各子網使用的硬件設備,但要求運行與網絡層協議相一致的軟件。  

                一 般說來,異種網絡互聯與多個子網互聯都應采用路由器來完成。 路由器的主要工作就是為經過路由器的每個數據幀尋找一條最佳傳輸路徑,并將該數據有效地傳送 到目的站點。由此可見,選擇最佳路徑的策略即路由算法是路由器的關鍵所在。為了完成這項工作,在路由器中保存著各種傳輸路徑的相關數據--路徑表 (RoutingTable),供路由選擇時使用。路徑表中保存著子網的標志信息、網上路由器的個數和下一個路由器的名字等內容。路徑表可以是由系統管理 員固定設置好的,也可以由系統動態修改,可以由路由器自動調整,也可以由主機控制。  

            靜態路徑表  

                由系統管理員事先設置好固定的路徑表稱之為靜態(static)路徑表,一般是在系統安裝時就根據網絡的配置情況預先設定的,當網絡結構的改變時需管理員手工改動相應的表項。    

            動態路徑表  

                動態(Dynamic)路徑表是路由器根據網絡系統的運行情況而自動調整的路徑表。路由器根據路由選擇協議(RoutingProtocol)提供的功能,自動學習和記憶網絡運行情況,在需要時自動計算數據傳輸的最佳路徑。  

            路由器的功能  

                (1) 協議轉換:能對網絡層及其以下各層的協議進行轉換。  
                (2) 路由選擇:當分組從互聯的網絡到達路由器時,路由器能根據分組的目的地址按某種路由策略,選擇最佳路由,將分組轉發出去,并能隨網絡拓撲的變化,自動調整路由表。 
               (3)能支持多種協議的路由選擇:路由器與協議有關,不同的路由器有不同的路由器協議,支持不同的網絡層協議。如果互聯的局域網采用了兩種不同的協議,例如,一 種是TCP/IP協議,另一種是SPX/IPX協議(即Netware的傳輸層/網絡層協議),由于這兩種協議有許多不同之處,分布在互聯網中的TCP /IP(或SPX/IPX)主機上,只能通過TCP/IP(或SPX/IPX)路由器與其他互聯網中的TCP/IP(或SPX/IPX)主機通信,但不能 與同一局域網中的SPX/IP(或TCP/IP)主機通信。多協議路由器能支持多種協議,如IP,IPX及X.25協議,能為不同類型的協議建立和維護不 同的路由表。這樣不僅能連接同一類型的網絡,還能用它連接不同類型的網絡。這種功能雖然使路由器的適應性變強,但同時也使得路由器的整體性能降低,現在 IP協議在網絡中越來越占主導地位,因此在下一代路由器(如交換式路由器)只需要支持IP協議。  
                (4) 流量控制:路由器不僅具有緩沖區,而且還能控制收發雙方數據流量,使兩者更加匹配。  
                (5) 分 段和組裝功能:當多個網絡通過路由器互聯時,各網絡傳輸的數據分組的大小可能不相同,這就需要路由器對分組進行分段或組裝。即路由器能將接收的大分組分段 并封裝成小分組后轉發,或將接收的小分組組裝成大分組后轉發。如果路由器沒有分段組裝功能,那么整個互聯網就只能按照所允許的某個最短分組進行傳輸,大大 降低了其他網絡的效能。  
                (6) 網絡管理功能:路由器是連接多種網絡的匯集點,網間分組都要通過它,在這里對網絡中的分組、設備進行監視和管理是比較方便的。因此,高檔路由器都配置了網絡管理功能,以便提高網絡的運行效率、可靠性和可維護行。  

                一個路由器必然有大于或者等于2的網絡接口,這樣它才存在路由的功能,否則,如果只有一個接口的話,也就無所謂"尋路"了!這里說的網絡接口不一定是物理上的接口,例如網卡或其他,也可以是虛擬的接口,例如隧道入口等。  

                如前面所描述的,一個路由器上運行的路由信息可以是靜態配置的,也可以是動態產生。前者通過手工配置完成、而后者則通過在路由器上運行跑相關路由協議的程序來根據網絡狀態動態改變內核中的路由表。下面我們仔細介紹一些這兩類路由器的配置。通常,一個路由器既有靜態配置的部分,又有動態配置的部分,二者結合起來。  

            多網卡的設置  

            靜態路由器的配置  

                Linux下最常用的指定路由規則的命令是route,當然也有些圖形化的工具可以使用,我們下面一個一個介紹。  

            route命令的使用  

                route工具主要功能是管理Linux系統內核中的路由表。它最大的用途就是用來設定靜態的路由表項,通常是在系統用ifconfig配置網絡接口(例如網卡等)后,用它來設定主機或者一網段的IP地址應該通過什么接口發送等。  

            Route工具有復雜的調用參數。  
            調用格式如下:  

            route [-CFvnee]  

            route [-v] [-A family] add [-net|-host] target [netmask  
            Nm] [gw Gw] [metric N] [mss M] [window W] [irtt I]  
            [reject] [mod] [dyn] [reinstate] [[dev] If]  

            route [-v] [-A family] del [-net|-host] target [gw Gw]  
            [netmask Nm] [metric N] [[dev] If]  

            route [-V] [--version] [-h] [--help]  

            主要參數說明如下:  

                -v 使用冗余輸出模式。  
                -A family   指定特定的地址族(例如"inet"、"inet6")。  
                -n 使用數字顯示的地址(例如,202.38.75.75)而不是去解釋域名。  
                -e 使用與netstat相同的輸出格式。  
                -ee 參數會產生很長的輸出,包括內核路由表的幾乎所有信息。  
                -net 目標(target)是一個網段。  
                -host 目標(target)是一個單獨的主機。  
                -F 顯示內核FIB路由表。結果可能被-e 和-ee參數改變。
                -C 顯示內核中路由緩存信息。  
                del 刪除一個路由表項。  
                add 增加一個路由表項。  
                target 配置的目的網段或者主機。可以是IP,或者是網絡或主機名。  
                netmask Nm   用來指明要添加的路由表項的網絡掩碼。  
                gw Gw 任何通往目的(target )的IP分組都要通過這個網關。  
                metric M  設置路由表中該項的尺度域(metric field)為M。  
                mss M 設置TCP的最大分片長度(MSS)M bytes。  系統缺省值是536。  
                window W  設置TCP發送窗口的尺寸為W bytes。  
                irtt I 設置TCP的初始化回路時間(irtt)I毫秒(1-12000)。缺省情況下按照RFC 1122 規定是300ms。  
                reject 安裝一個阻塞型的路由,這樣可能會有路由查找失敗。  
                mod, dyn, reinstate  添加或者修改一個動態路由表項。主要用來測試和診斷。  
                dev If 強行使用某個特定的輸出接口(If),而不用系統去尋找接口。  

            下面舉幾個配置的例子:  

                route add -net 192.56.76.0 netmask 255.255.255.0 dev eth0  
                添加一條路由表項,網段192.56.76.x 應該從接口"eth0"走。  

                route add default gw mango-gw  
                添加一條缺省路由(如果沒有其他匹配的路由項,就使用這個路由規則)。"mango-gw"是一個主機名, 而通往這個主機的路由規則應該事先已經設置好了。  

                route add ipx4 sl0  
                給主機"ipx4"添加一條路由規則,使用SLIP接口sl0。  

            Route命令的輸出結果  
            輸出的格式有以下幾欄:  

                Destination  目標網段或者主機。  
                Gateway  網關地址,如果沒有設置,則是"*"表示。  
                Genmask  網絡掩碼。  
                Flags 一些可能的標記如下:  
                 U (路由是活動的)  
                 H (目標是一個主機)  
                 G (使用網關(gateway))  
                 R (reinstate route 動態路由產生的表項)  
                 D (dynamically installed by daemon or redirect)  
                 M (modified from routing daemon or rederict)  
                 ! (reject route)  
                Metric 路由距離。  
                Ref 路由項引用次數。(linux內核中沒有使用)  
                Use 查找路由項的次數。.  
                Iface 該路由表項對應的輸出接口。  
                MSS 缺省的TCP最大分片尺寸。  
                Window 缺省的TCP窗口的尺寸。  
                irtt 缺省的TCP回路時間。  
                HH (cached only)  
                ARP入口的數目。  
                Arp (cached only)  該路由項對應的物理地址是否過期等信息。  

            下面是route -n的輸出實例:  

            tarn:~$ /sbin/route -n  
            Kernel IP routing table  
            Destination Gateway Genmask Flags Metric Ref Use Iface  
            202.38.64.3 202.38.75.62 255.255.255.255 UGH 0 0 0 eth0  
            202.38.75.75 0.0.0.0 255.255.255.255 UH 0 0 0 eth2  
            202.38.75.0 0.0.0.0 255.255.255.128 U 0 0 0 eth0  
            192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth2  
            192.168.75.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1  
            159.226.0.0 202.38.75.62 255.255.0.0 UG 0 0 0 eth0  
            127.0.0.0 0.0.0.0 255.0.0.0 U 0 0 0 lo  
            0.0.0.0 202.38.75.62 0.0.0.0 UG 1 0 0 eth0  

                上面的輸出中我們可以看出,該路由器配置的缺省網關是202.38.75.62,它上面有3個以太網接口(eth0、eth1和eth2)。其中第一條和第二條路由規則是針對一個主機的,其他的都是針對一個網段的,這可以重掩碼看出。  

            動態路由器的配置 

            基本原理介紹 

            先解釋一下什么是動態路由。 

                從 前面的描述中我們可以看到,路由器的基本功能就是為IP分組尋找到達目的地址的路徑。我們前一節介紹的是人工手動靜態配置路由規則,也就是人為的設定尋路 方式。但是因特網是個龐大的系統,上面跑的網絡結構負責,而且拓撲結構也在隨時改變,這樣在某些復雜的范圍里我們的靜態配置就不一定能獲得最佳的尋路路徑 了。而且一旦網絡結構發生改變,我們手動的靜態配置也往往無法及時跟著改變。在這個背景下,產生了動態路由配置的概念,也就是動態路由器。 

                動 態路由器上的路由表項是通過相互連接的路由器之間交換彼此信息,然后按照一定的算法優化出來的,而這些路由信息是在一定時間間隙里不斷更新,以適應不斷變 化的網絡,以隨時獲得最優的尋路效果。為了實現IP分組的高效尋路,IETF制定了多種尋路協議。其中用于自治系統 (AS:Autonomous System)內部網關協議有開放式最短路徑優先(OSPF:Open Shortest Path First)協議和 尋路信息協議(RIP:Routing Information Protocol)。所謂自治系統是指在同一實體(如學校、企業或ISP)管理下的主 機、路由器及其他網絡設備的集合。還有用于自治域系統之間的外部網絡路由協議BGP-4等。 

                運行這些路由協議的軟件就是我們通 常說的路由軟件,Linux下常見的路由軟件有gated和zebra,。前者既有GPL版本的發行,又有收費的版本;而后者則是日本某組織開發的完全 GPL的高效的路由軟件。Linux的發行里面一般都缺省就有gated這個軟件,我們下面主要介紹它的配置和使用方法。 

            路由協議的介紹 

            我們這里介紹一下RIP協議。 

                RIP 是Routing Information Protocol的縮寫,直接翻譯就是"路由信息協議"。RIP計算路由時使用了"距離向量 (distance vector)"算法,因此,它也被稱作"距離向量尋路協議 (distance vector routing protocol)。 

                RIP的特點是路由器間定時地交換網絡的整體知識, 并且只和相鄰路由器交換這種知識。換句話說,路由器只和相鄰路由器共享網絡信息。路由器一旦從相鄰路由器獲取了新的知識,就將其追加到自己的數據庫中,并 將該信息傳遞給所有的相鄰的路由器。相鄰路由器做同樣的操作,經過若干次傳遞,使自治系統內的所有路由器都能獲得完整的路由信息。 

                RIP 報文用UDP數據報來傳送。為了區別于其他的UDP應用,規定RIPng的公認專用UDP端口號為521。主動尋路更新報文的源/目的的端口都是 RIPng端口,應答的更新報文送往發起請求的端口。應當注意,IPv4中RIP使用的端口號是520,與RIPng的有所不同。 

                定時器愛RIP中有著比較重要的作用。在RIP中為支持尋路操作使用了三個不同的定時器。 

                第 一個是啟動定時進行RIP更新操作的定時器。此定時器通常設置成30秒。在RIP標準中對其進一步加以限制,它要求路由器對更新報文的發送間隔采用隨機 數,將RIP更新報文的間隔選取在25秒到35秒之間。其目的是為了避免網絡上所有的路由器以相同的定時發送更新報文,大量的業務量壓迫網絡造成沖突。利 用隨機間隔可均衡業務量,從而減少路由器的沖突。 

                RIP在避免沖突方面還有一點需要注意,在觸發更新中不論何時發送了報文,不 對30秒定時器復位。如果復位,多個路由器的更新報文的發送間隔就會發生沖突。這是由于所有的路由器在發送觸發更新后同時啟動定時器造成的。如不對該定時 器復位,即使與在數秒前剛廣播的觸發更新報文的內容完全一樣,定時的更新報文也照發不誤。 

                RIP使用的第二個定時器時期滿 (expiration)定時器。路由器只要收到通往特定信宿的路由,就對通往該信宿的期滿定時器初始化。期滿定時器雖然被設定為180秒,但在穩定的網 絡中總是每隔30秒被初始化。當網絡不穩定時,此定時器的時間區間表示該路由無效。 

                RIP最后一個定時器時垃圾收集 (garbage collection)定時器。路由器對無效路由打上尺度為無窮大的無效標記并將垃圾收集定時器置位。此時,定時器在120秒的區間內 工作。在該期間內路由器將尺度費用置成無窮大的同時,繼續公布該信宿。以這種方法公布路由,相鄰路由表就能迅速從尋路表中刪除該路由。 

            RIP協議也有它的缺陷: 

                網絡直徑較小 

                RIP將尺度(即費用)無窮大定義為16,這一定義對使用RIP的所有網絡的規模作出了嚴格的限制。因尺度必須是整數,故網絡的費用至少為1。在基于RIP的Internet中,所有的系統距其他任何系統不能超過15個網絡。這一大小被稱作網絡直徑。 

                這 一限制對管理員分配費用的靈活性是一個很大的制約。管理員分配費用最直接的方法是對各個網絡的費用都設成1。但是,在這種分配方式下,RIP就會選擇費用 最小的路徑,而不管該路徑上的信道容量的大小。因此會舍棄"較長"的高速路徑而通過低效的"較短"路徑傳送數據。為了避免這種情況的發生,管理員可將大于 1的費用分配給低效鏈路,人為地提高其費用。其結果是最大網絡直徑隨之變小,進一步限制了RIP的網絡規模。 

                對網絡變化的反應較慢 

                RIP網絡中的路由器從路由失效到將其識別出來要等待180秒,而在OSPF中典型值是1~2秒。 

                不支持組播 

                在RIP中沒有公布組成員信息的方法,因此不支持組播尋路。為實現組播尋路需和其他協議并用。
            gated的配置 

                gated支持RIP、OSPF、IS-IS等路由協議。我們這里著重介紹RIP協議的配置方法,其他協議的配置大家可以針對協議本身然后參考相關幫助文檔做類似的配置就可以。 

                首先修改/etc/sysconfig/network文件,使得FORWARD_IPV4=yes。然后在/etc/目錄下創建文件名為gated.conf的文件,里面就是需要填寫的配置信息。RIP協議的配置語法如下: 

            rip yes | no | on | off [ { 
            broadcast ; 
            nobroadcast ; 
            nocheckzero ; 
            preference preference; 
            defaultmetric metric ; 
            query authentication [none | [[simple|md5] password]] ; 
            interface interface_list 
            [noripin] | [ripin] 
            [noripout] | [ripout] 
            [metricin metric] 
            [metricout metric] 
            [version 1]|[version 2 [multicast|broadcast]] 
            [[secondary] authentication [none | [[simple|md5] password]] ; 
            trustedgateways gateway_list ; 
            sourcegateways gateway_list ; 
            traceoptions trace_options ; 
            } ] ; 

                上面的配置語法用來啟動或者禁止RIP協議的運行,并對RIP協議某些參數進行設置。各參數的含義如下: 

            broadcast 指明RIP分組將被廣播。當廣播靜態路由或者由其他協議產生的RIP路由項時,這很有用。 
            nobroadcast 指明當然的接口上不廣播RIP分組。 
            nocheckzero 指明RIP不處理RIP分組中的保留域。通常RIP將拒絕保留域為非零的分組。 
            preference preference 設置RIP路由的preference,其缺省值是100,這個值可以被其他的給定的策略重寫。 
            metric metric 定義當使用RIP廣告由其他路由協議獲得的路由信息時使用的尺度(metric)。其缺省值為16(不可達)。 
            query authentication [none | [[simple|md5] password]] ; 設定身份認證密碼。缺省是無需認證。 
            interface interface_list 針對某特定的接口進行參數設定。 
              可以有的參數如下: 
              noripin 指定該接口商接收的RIP分組無效。 
              ripin 這是缺省的參數。與noripin相反。 
              noripout 被指定的接口上將無RIP分組發出。缺省值是在所有的廣播和非廣播的接口商發送送RIP分組。 
              ripout 這是缺省值。與noripout的含義相反。 
              metricin metric 指定在新添加的路由表項加入內核路由表以前增加的尺度(metric)。缺省值是1。 
              metricout metric 指定通過特定的接口發出的RIP前,對尺度的增加值。缺省值是0。 
              version 1 指定發送第一個版本的RIP協議的分組。缺省值是這個。 
              version 2 在指定的接口商發送第二個版本的RIP協議分組。如果IP組播可以使用,則缺省發送完全第二版本的分組,如果不支持組播,則使用與第一版本兼容的第二版本的RIP分組。 
              multicast 指明在特定接口上的第二版本的RIP分組使用組播發送。 
              broadcast 指明在特定的接口上使用廣播來發送與第一版本兼容的第二版本的RIP分組,即使該接口支持組播。 

            [secondary] authentication [none | [simple|md5] password] 定義身份認證的方式。只對第二版本的RIP協議有用。缺省是無身份認證。 
            trustedgateways gateway_list 定義RIP接收RIP更新分組的網關。gateway_list 是一個簡單的主機名或者IP地址的列表。缺省情況下,在共享網絡上的所有的路由器都被認為支持提供RIP更新信息。 
            sourcegateways gateway_list 定義RIP直接發送分組的路由器列表,而不通過組播或者廣播。 
            traceoptions trace_options 設置RIP跟蹤選項。詳細設置略。 

            下面是些配置示例: 
            配置1: 



            # This configuration runs RIP in quiet mode, it only listens to 
            # packets, no matter how many interfaces are configured. 


            rip yes { 
            nobroadcast ; 
            } ; 

            配置2: 

            # This configuration emulates routed. It runs RIP and only sends 
            # updates if there are more than one interfaces up and IP forwarding is 
            # enabled in the kernel. 

            # NOTE that RIP *will not* run if UDP checksums are disabled in 
            # the kernel. 


            rip yes ; 

            zebra介紹 

                這 是日本人寫的以GNU版權方式發布的軟件,開始于1996年,主要的功能是實現了 RIPv1,RIPv2,RIPng, OSPFv2, OSPFv3, BGP-4, and BGP-4+路由協議,目前是0.87版,目前支持 Linux和FreeBSD,將來會支持Solaris 7和GNU Hurd。 

                其中 RIPv1, RIPv2, OSPFv2是用于IPv4的自治域系統內部網絡路由協議,最好的是OSPF,他支持VLSM(變長子網掩碼)、收斂快,能 根據鏈路的負載等動態調整路由,是目前最好的所有廠商都支持的內部路由協議。跟他差不多(也許還要好)的是cisco專有的EIGRP. 

                BGP- 4是用于自治域系統之間的外部網絡路由協議,也是目前Internet主干上目前使用的協議,非常的靈活。在國外用的非常普遍,如果一個網絡有兩個以上出 口(連接兩個ISP)極大的可能會用他。但是在國內好象很少使用,這也跟國內的網絡比較封閉有關。假如我們跟CSTNET和CETNET使用BGP-4的 話,只要這兩個出口一個是通的,我們對外的連接不會中斷超過1分鐘。 

                RIPng OSPFv3, BGP-4+主要擴展了對ipv6的支持。 

                這個軟件配置的很多方面跟cisco的IOS配置幾乎完全相同,我們完全可以拿一臺PC機來完成一些必須用昂貴的CISCO路由器才能完成的比較復雜的路由協議處理控制功能。 

                GNU Zebra可以到www.zebra.org去找。 

            路由器上的策略控制:IP帶寬管理(QoS) 

            為什么要管理帶寬? 

                因 特網的成功主要因素是IP(Internet Protocol)協議族的簡單和穩健。現在幾乎所有的人都在向IP靠攏,甚至傳統的電訊公司也在將它們的 基于電路交換的語音網絡向IP網絡轉。然而基于IP協議的因特網這時候就遇到了一個非常大的困難。它不相ATM協議,它是平等地對待任何業務,也就是說所 有的通過IP網絡的數據都被平等地盡可能好的傳送(稱:盡力型服務)。如果我愿意多付1倍的錢,我也不能讓我的主頁下載的速度提高一倍。這時候就引入了 QoS概念,也就是服務質量保證。這種情況下,平等對待所有IP業務數據的方法就要被放棄,而試圖區分不同的用戶或業務,然后分配不同的帶寬。這就是路由 器上的帶寬的分配和管理。 

                這些年來,不同的技術發展很 快,IETF(Internet Engineering Task Force)已經發布了幾種標準,包括:綜合服務、區分服務、資源預留技術。這些標 準都在Linux下有了實現。但它們的使用是個綜合的問題,需要網絡其他路由器的配合(例如資源預留),所以當前在實踐中使用不是很廣,但隨著因特網業務 的不斷增加,它們會逐漸越來越多的被大家使用的。 

                Linux內核2.1.x及后續版本里面主要是引入了traffic control代碼,來實現IP帶寬的分配和管理。 

            TC的特點 

                TC 是Traffic Control的縮寫,中文意思即為"流量控制"。TC有很大的伸縮性。作為一個提供虛擬主機服務的ISP來說,它可以利用Linux 的流量控制來給不同的客戶不供的服務質量保證。傳統的出售虛擬主機或者提供主頁存放服務的ISP通常是提供不同的磁盤空間來作為不同檔次的服務,例如一個 月100元可以獲得100M的空間。如果使用Linux的流量控制(TC),我們就可以多提供一種有區分的不同的服務,例如你是一個提供虛擬主機服務的 ISP,你可以有如下多的不同的服務選擇: 
                · 服務水平1: 花費¥100/月――瀏覽者獲得250Kbps的瀏覽頁面速度。 
                · 服務水平2: 花費¥150/月--250Kbps,但是如果帶寬允許的話在午夜0點 到臨晨6點之間可以達到1Mbps。 
                · 服務水平3: 花費¥200/月--250Kbps, 但是如果帶寬允許的話可以最大達到1Mbps,不限制時間(與服務水平2區別之處)。 
                · 服務水平4:花費¥500/月--提供1Mbps的高速的帶寬保證。適合視頻和音頻流的服務。 

                由上面的例子,我們可以利用TC很方便的指定各種有控制的服務規則。上面提到的每天不同時段提供不同的服務,我們可以很容易的用crontab來定時運行一些腳本去改變帶寬分配規則來達到。這是一個比較好的例子,我們在后面將介紹一個實例。 

            TC的使用實例說明 

                下面我們提供一個利用TC來實現對在一個Linux服務器上的兩個虛擬主機實行不同的帶寬策略的例子。在該例中,我們將講述如何配置和測試TC。 

            編譯內核 
                至于如何編譯一個新的內核已經不屬于本章節討論的范圍,我們假設你已經知道如何重新編譯一個內核。 
                編譯內核時將以下幾個內核選項選中:"kernel/User netlink socket"和"Netlink device emulation"。這樣TC就可以利用netlink來與內核傳送信息。同時將所有的排隊算法選上,位于包括 

            "Fair queueing" 
            "CBQ packet scheduler" 
            "CSZ packet scheduler" 
            "the simples PRIO pseudoscheduler" 
            "RED queue" 
            "SFQ queue" 
            "TBF queue" 
            "QoS support" 
            "rate estimator" 
            "packet classifier API" 
            "routing-tables-based classifier" 
            "U32 classifier" 
            "special RSVP classifier and special RSVP classifier for IPv6"。 

                選中這些選項以后,按正常的編譯內核步驟編譯內核,然后安裝新內核,并用新內核重新啟動系統。 

            編譯TC軟件包 

                可以在下面的地址下載到我們需要的軟件,然后按照軟件包里的說明編譯它: 
            ftp://linux.wauug.org/pub/net/ip-routing/iproute2-current.tar.gz 通常我們要做的只是簡單的輸入make就可以了。 

            TC 的設定 

            圖1. CBQ 樹圖 
                圖 一是我們將配置的一個系統的簡單的樹形圖示范。兩個葉子節點從父節點分配帶寬,IP地址10.0.0.10(標識符1:1)和地址10.0.0.11(標 識符1:2)是接口eth0上的IP別名,它們共同分享父節點(標識符1:0)的帶寬。這個例子里面只涉及到了對一個接口上的流量控制,大家可以仿照這個 例子構造自己感興趣的控制多個接口設備的配置。 
                配置QoS特性的第一步就是將qdisc加入到一個接口上,例如本例子: 
                qdisc add dev eth0 root handle 1: ... 

                然后定義你需要區別的類別。不同的類別對應不同的流量控制類型。我們的例子中,使用如下的語句: 

                tc class add dev eth0 parent 1:0 classid X:Y ... 

                我 們的例子中只使用了一層深的類別樹。當然,我們可以構造多層深度的復雜的樹,基本的原則是一樣的:就是一個子節點(如圖1所示)繼承一個父節點的資源同時 進一步根據類的定義去分配父節點的資源。例如,父類1:0擁有該設備的全部帶寬,那么子節點1:1不可能獲得超過10Mbits的帶寬,當然本例子中是限 制為1Mbps。 
                最后定義"IP分組--類別"的映射規則,用來告訴系統的分類器,經過路由器調度的某IP分組該對應什么類型。首先,將一個分類器與輸出接口關聯起來: 

                filter add dev eth0 parent 1:0 protocol ip ... 

                然后,定義"IP分組--類別"的映射規則。本例子中,將利用IP分組的源地址來作為分類的關鍵詞。 下面的腳本完成了這個功能。關于腳本中TC等命令的參數,大家可以參考隨機的文檔,這里限于篇幅,不做介紹了。 

            #! /bin/sh 
            #path to tc and the ip utilities; 
            #change to reflect yours. 
            TC=./iproute2/tc/tc 
            IP=./iproute2/ip/ip 
            ################################################## 
            #Addresses to be aliased 
            #change or add more to reflect yours 

            ALIAS1=10.0.0.10 
            ALIAS2=10.0.0.11 
            ################################################## 
            # add ip aliasing support 
            #uncomment if you want to use the ip utility to 
            #add ip-aliasing for you 

            #$IP addr add $ALIAS1 dev eth0 
            #$IP addr add $ALIAS2 dev eth0 
            ################################################## 
            # Attaching a device queue discipline to an 
            # interface a device queue discipline is 
            # equivalent almost to a device manager 

            #Attach CBQ to eth0 
            #Things you might need to change: 
            # bandwidth -- the bandwidth of the eth0 device 
            # note it must match the devices real bandwidth 
            # allot -- it is safe to leave it at the MTU of 
            # the device 
            # avpkt -- the average packet size that you 
            # suspect will be seen safe to leave at 1000 
            # for Ethernet with MTU of 1514 bytes 
            # mpu -- minimum packet size 

            $TC qdisc add dev eth0 root handle 1: cbq 
            bandwidth 10Mbit allot 1514 cell 8 avpkt 1000 
            mpu 64 
            ################################################## 
            # Attaching class queue disciplines 
            # bounded -- it is bound to the rate allocated; 
            # can borrow even if there is a lot of idle 
            # bandwidth just sitting there isolated -- cannot 
            # share its bandwidth to other classes prio is the 
            # priority assigned 0 being the highest and 7 the 
            # lowest weight -- safer to leave at 1 
            # queue discipline setup. Classid 1:1 will have a 
            # rate of 1Mbps which is bounded. 

            $TC class add dev eth0 parent 1:0 classid 1:1 cbq 
            bandwidth 10Mbit rate 1Mbit avpkt 1000 prio 5 
            bounded isolated allot 1514 weight 1 maxburst 21 
            #rate 1Mbit avpkt 1000 prio 5 bounded allot 1514 
            #weight 1 maxburst 21 
            # Classid 1:2 will have a rate of 3Mbps which is 
            # bounded. 
            $TC class add dev eth0 parent 1:0 classid 1:2 cbq 
            bandwidth 10Mbit rate 3Mbit avpkt 1000 prio 5 
            bounded allot 1514 weight 1 maxburst 21 
            ################################################## 
            # Define the filter to be attached to eth0 
            # Create with hash table of 256 slots with ID 1: 

            $TC filter add dev eth0 parent 1:0 protocol ip 
            prio 5 handle 1: u32 divisor 256 
            ################################################## 
            # define the criteria for mapping incoming packets 
            # to classes. Add to the 5th slot of hash table a 
            # rule to select virtual address ALIAS1 direct it 
            # to class 1:1 

            $TC filter add dev eth0 parent 1:0 prio 5 u32 
            ht 1:6: match ip src $ALIAS1 flowid 1:1 
            # Add to 6th slot of hash table rule to select 
            # ALIAS2 direct it to class 1:2 
            $TC filter add dev eth0 parent 1:0 prio 5 u32 
            ht 1:6: match ip src $ALIAS2 flowid 1:2 
            ## Lookup hash table, if it is not fragmented 
            ## frame. Use protocol as hash key 

            $TC filter add dev eth0 parent 1:0 prio 5 handle 
            ::1 u32 ht 800:: match ip nofrag 
            offset mask 0x0F00 shift 6 
            hashkey mask 0x00ff0000 at 8 link 1: 

            #some more examples of how to use u32 
            # Add to 4th slot of hash table rule to select 
            # tcp/telnet to 193.233.7.75 direct it to class 
            # 1:4 and prescribe to fall to best effort, 
            # if traffic violates TBF (32kbit,5K) 
            #$TC filter add dev eth1 parent 1:0 prio 5 u32 
            # ht 1:4: match ip dst 193.233.7.75 
            # match tcp dst 0x17 0xffff 
            # flowid 1:4 
            # police rate 32kbit buffer 5kb/8 mpu 64 
            # mtu 1514 index 1 
            ## Add to 1st slot of hash table rule to select 
            ## icmp to 193.233.7.75 direct it to class 1:3 
            ## and prescribe to fall to best effort, 
            ## if traffic violate TBF (10kbit,5K) 
            #$TC filter add dev eth1 parent 1:0 prio 5 u32 
            # ht 1:4: match ip dst 193.233.7.75 
            # match tcp dst 0x17 0xffff 
            # flowid 1:4 
            # police rate 32kbit buffer 5kb/8 mpu 64 
            # mtu 1514 index 1 
            ## Add to 1st slot of hash table rule to select 
            ## icmp to 193.233.7.75 direct it to class 1:3 
            ## and prescribe to fall to best effort, 
            ## if traffic violate TBF (10kbit,5K) 
            #$TC filter add dev eth1 parent 1:0 prio 5 u32 
            # ht 1:: sample ip protocol 1 0xff 
            # match ip dst 193.233.7.75 flowid 1:3 
            # police rate 10kbit buffer 5kb/8 mpu 64 
            # mtu 1514 index 2 
            ################################################## 
            #Look at all that we created: 

            echo "---- qdisc parameters ----------" 
            $TC qdisc ls dev eth0 
            echo "---- Class parameters ----------" 
            $TC class ls dev eth0 
            echo "---- filter parameters ----------" 
            $TC filter ls dev eth0 

            測試 

                我們的例子當中,是有在同一個Linux服務器上有兩個虛擬WWW服務器,我們的設定是采用了IP別名,將兩個地址同時綁在一個接口上。我們可以用ftp來 測試。首先用ftp連接10.0.0.10服務器,我們可以獲得大概1Mbps的速率;然后ftp另外的地址10.0.0.11,我們可以獲得大概 3Mbps的速率。

            posted on 2011-06-01 14:44 艾斯維亞 閱讀(704) 評論(0)  編輯 收藏 引用

            久久精品国产久精国产果冻传媒 | 亚洲精品乱码久久久久久不卡| 国产精品久久国产精麻豆99网站| 久久九九精品99国产精品| 狠狠色婷婷久久一区二区三区| 国产免费福利体检区久久| 欧美精品国产综合久久| 51久久夜色精品国产| 欧美亚洲国产精品久久| 国产精品美女久久久久av爽| 7777精品久久久大香线蕉| 日本免费久久久久久久网站| 四虎国产精品成人免费久久| 91精品国产91热久久久久福利 | 99久久成人18免费网站| 一本色道久久HEZYO无码| 久久久久国产日韩精品网站| 久久久久久久99精品免费观看| 欧美粉嫩小泬久久久久久久 | 日本久久久久久久久久| 一本大道久久a久久精品综合| 亚洲精品美女久久777777| 久久人人爽人人精品视频| 久久线看观看精品香蕉国产| 男女久久久国产一区二区三区| 免费精品久久久久久中文字幕| 国产成人久久精品麻豆一区| 国产成人精品免费久久久久| 久久永久免费人妻精品下载| 亚洲精品国产字幕久久不卡| 综合久久精品色| 国产精品久久久香蕉| 色综合合久久天天给综看| 女同久久| 精品国产乱码久久久久久呢| 国产精品中文久久久久久久 | 国产精品99精品久久免费| 久久久久久亚洲精品成人| 99久久99久久精品免费看蜜桃 | 久久久青草青青国产亚洲免观| 国产A级毛片久久久精品毛片|