Linux的高級路由和流量控制HOWT_第1頁
Linux的高級路由和流量控制HOWT_第2頁
Linux的高級路由和流量控制HOWT_第3頁
Linux的高級路由和流量控制HOWT_第4頁
Linux的高級路由和流量控制HOWT_第5頁
已閱讀5頁,還剩11頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、.Linux的高級路由和流量控制HOWTO 1 2Linux的高級路由和流量控制HOWTO1.22020-07-16 14:28第4章規(guī)那么-路由策略數據庫假設你有一個大規(guī)模的路由器,你可能不得不同時滿足不同用戶對于路由的不同需求。路由策略數據庫可以幫助你通過多路由表技術來實現。假設你想使用這個特性,請確認你的內核配置中帶有"IP:advanced router"和"IP:policy routing"兩項。當內核需要做出路由選擇時,它會找出應該參考哪一張路由表。除了"ip"命令之外,以前的"route"命令也能修

2、改main和local表。缺省規(guī)那么:ahuhome ahu$ip rule list 0:from all lookup local 32766:from all lookup main 32767:from all lookup default上面列出了規(guī)那么的優(yōu)先順序。我們看到,所有的規(guī)那么都應用到了所有的包上"from all"。我們前面已經看到了"main"表,就是"ip route ls"命令的輸出,但是"local"和"default"是初次見到。假設我們想做點有趣的事情,就可以生

3、成一些指向不同路由表的規(guī)那么,取代系統(tǒng)中的路由規(guī)那么。對于內核如何處理一個IP包匹配多個規(guī)那么的準確意義,請參見Alexey關于ip-cref文檔。4.1.簡單的源策略路由讓我們再來一個真實的例子。我有兩個Cable Modem,連接到了一個Linux的NAT"假裝"路由器上。這里的室友們向我付費使用Internet。假設我其中的一個室友因為只想訪問hotmail而希望少付一些錢。對我來說這沒有問題,他們肯定只能使用那個比較次的Cable Modem。那個比較快的cable modem的IP地址是212.64.94.251,PPP鏈路,對端IP是212.64.94.1。而那

4、個比較慢的cable modem的IP地址是212.64.78.148,對端是195.96.98.253。local表:ahuhome ahu$ip route list table local broadcast 127.255.255.255 dev lo proto kernel scope link src 127.0.0.1 local 10.0.0.1 dev eth0 proto kernel scope host src 10.0.0.1 broadcast 10.0.0.0 dev eth0 proto kernel scope link src 10.0.0.1 local

5、 212.64.94.251 dev ppp0 proto kernel scope host src 212.64.94.251 broadcast 10.255.255.255 dev eth0 proto kernel scope link src 10.0.0.1 broadcast 127.0.0.0 dev lo proto kernel scope link src 127.0.0.1 local 212.64.78.148 dev ppp2 proto kernel scope host src 212.64.78.148 local 127.0.0.1 dev lo prot

6、o kernel scope host src 127.0.0.1 local 127.0.0.0/8 dev lo proto kernel scope host src 127.0.0.1有很多明顯的事實,其實可能還需要進一步說明。好了,這樣就行了。"default"表為空。讓我們看看"main"路由表:ahuhome ahu$ip route list table main 195.96.98.253 dev ppp2 proto kernel scope link src 212.64.78.148 212.64.94.1 dev ppp0 pr

7、oto kernel scope link src 212.64.94.251 10.0.0.0/8 dev eth0 proto kernel scope link src 10.0.0.1 127.0.0.0/8 dev lo scope link default via 212.64.94.1 dev ppp0我們如今為我們的朋友創(chuàng)立了一個叫做"John"的規(guī)那么。其實我們完全可以使用純數字表示規(guī)那么,但是不方便。我們可以向/etc/iproute2/rt_tables文件中添加數字與名字的關聯(lián):#echo 200 John/etc/iproute2/rt_table

8、s#ip rule add from 10.0.0.10 table John#ip rule ls 0:from all lookup local 32765:from 10.0.0.10 lookup John 32766:from all lookup main 32767:from all lookup default如今,剩下的事情就是為John的路由表創(chuàng)立路由項了。別忘了刷新路由緩存:#ip route add default via 195.96.98.253 dev ppp2 table John#ip route flush cache這樣就做好了。至于如何在ip-up階段實

9、現就留給讀者自己去研究吧。4.2.多重上連ISP的路由以以下圖是很常見的配置,同一個局域網甚至是同一臺計算機通過兩個ISP連接到互聯(lián)網上。_+-+/|+-+ISP 1+-_|/_/_+-+-+-+|_/_|if1|/|局域網-+Linux路由器|國際互聯(lián)網_ _/|_ _/|if2|_/+-+-+-+|+-+ISP 2+-|+-+_這種情況下通常會出現兩個問題。4.2.1.流量分割首先是如何保證:回應來自某一個ISP的數據包時,仍然使用一樣的ISP。讓我們先定義一些符號。令第一塊網卡上圖的if1的名字叫$IF1,而第二塊網卡叫做$IF2。然后設置$IF1的IP地址為$IP1,$IF2的IP地址

10、為$IP2。并且,令ISP1的網關地址為$P1,ISP2的網關地址為$P2。最后,令$P1的網絡地址為$P1_NET,令$P2的網絡地址為$P2_NET。額外創(chuàng)立兩個路由表,T1和T2。參加到/etc/iproute2/rt_tables中。然后如下設置兩個路由表中的路由:ip route add$P1_NET dev$IF1 src$IP1 table T1 ip route add default via$P1 table T1 ip route add$P2_NET dev$IF2 src$IP2 table T2 ip route add default via$P2 table T2

11、沒什么大不了的,不過是建立了通向該網關的一條路由,并使之成為默認網關,分別負責一個單獨的上行流,并且為這兩個ISP都作這樣的配置。要指出的是,那條網絡路由是必要條件,因為它可以讓我們找到那個子網內的主機,也包括上述那臺網關。下一步,我們設置"main"路由表。把包通過網卡直接路由到與網卡相連的局域網上不失為一個好方法。要注意"src"參數,他們可以保證選擇正確的出口IP地址。ip route add$P1_NET dev$IF1 src$IP1 ip route add$P2_NET dev$IF2 src$IP2然后,設置你的缺省路由:ip route

12、 add default via$P1接著,設置路由規(guī)那么。這實際上在選擇用什么路由表進展路由。你需要確認當你從一個給定接口路由出數據包時,是否已經有了相應的源地址:你需要保證的就是假設你已經有了相應的源地址,就應該把數據包從相應的網卡路由出去:ip rule add from$IP1 table T1 ip rule add from$IP2 table T2以上命令保證了所有的回應數據都會從他們來的那塊網卡原路返回。如今,完成了非常根本的配置。這將對于所有運行在路由器上所有的進程起作用,實現IP假裝以后,對本地局域網也將起作用。假設不進展假裝,那么你要么擁有兩個ISP的地址空間,要么你想對

13、兩個ISP中的一個進展假裝。無論哪種情況,你都要添加規(guī)那么,基于發(fā)包的主機在局域網內的IP地址,選擇從哪個ISP路由出去。4.2.2.負載平衡第二個問題是如何對于通過兩個ISP流出的數據進展負載平衡。假設你已經成功地實現了流量分割,這件事并不難。與選擇兩個ISP中的一個作為缺省路由不同,這次是設置缺省路由為多路路由。在缺省內核中,這會平衡兩個ISP的路由。象下面這樣做基于前面的流量分割實驗:ip route add default scope global nexthop via$P1 dev$IF1 weight 1nexthop via$P2 dev$IF2 weight 1這樣就可以平衡

14、兩個ISP的路由。通過調整"weight"參數我們可以指定其中一個ISP的優(yōu)先權高于另一個。應該指出,由于平衡是基于路由進展的,而路由是經過緩沖的,所以這樣的平衡并不是100%準確。也就是說,對于一個經常訪問的站點,總是會使用同一個ISP。進而,假設你對此不滿意,你可能需要參考以下Julian Anastasov的內核補?。篔ulian的路由補丁會彌補上述缺陷。第5章GRE和其他隧道Linux有3種隧道。它們是:IP-in-IP隧道、GRE隧道和非內核隧道如PPTP。5.1.關于隧道的幾點注釋隧道可以用于實現很多非常不一般而有趣的功能。但假設你的配置有問題,卻也會發(fā)生可怕的

15、錯誤。除非你確切地知道你在做什么,否那么不要把缺省路由指向一個隧道設備。而且,隧道會增加協(xié)議開銷,因為它需要一個額外的IP包頭。一般應該是每個包增加20個字節(jié),所以假設一個網絡的MTU是1500字節(jié)的話,使用隧道技術后,實際的IP包長度最長只能有1480字節(jié)了。這倒不是什么原那么性的問題,但假設你想使用隧道技術構建一個比較大規(guī)模的網絡的話,最好仔細研究一下關于IP包的分片和會聚的知識。哦,還有,挖一個隧道最好的方法當然是同時從兩頭挖。5.2.IP-in-IP隧道這種隧道在Linux上已經實現很長一段時間了。需要兩個內核模塊:ipip.o和new_tunnel.o。比方說你有3個網絡:內部網A和

16、B,中間網C比方說:Internet。A網絡的情況:網絡地址10.0.1.0子網掩碼255.255.255.0路由器10.0.1.1路由器在C網絡上的地址是172.16.17.18。B網絡的情況:網絡地址10.0.2.0子網掩碼255.255.255.0路由器10.0.2.1路由器在C網絡上的IP地址是172.19.20.21。C網絡已經連通,我們假定它會將所有的數據包從A傳到B,反之亦然。而且你可以隨意使用Internet。這就是你要做的:首先,確認模塊是否加載:insmod ipip.o insmod new_tunnel.o然后,在A網絡的路由器上輸入:ifconfig tunl0 10

17、.0.1.1 pointopoint 172.19.20.21 route add-net 10.0.2.0 netmask 255.255.255.0 dev tunl0并且在B網絡的路由器上輸入:ifconfig tunl0 10.0.2.1 pointopoint 172.16.17.18 route add-net 10.0.1.0 netmask 255.255.255.0 dev tunl0假設你想中止隧道,輸入:ifconfig tunl0 down簡單之極!但是你不能通過IP-in-IP隧道轉發(fā)播送或者IPv6數據包。你只是連接了兩個一般情況下無法直接通訊的IPv4網絡而已。至

18、于兼容性,這部分代碼已經有很長一段歷史了,它的兼容性可以上溯到1.3版的內核。據我所知,Linux的IP-in-IP隧道不能與其他操作系統(tǒng)或路由器互相通訊。它很簡單,也很有效。需要它的時候盡管使用,否那么就使用GRE。5.3.GRE隧道GRE是最初由CISCO開發(fā)出來的隧道協(xié)議,可以做一些IP-in-IP隧道做不到的事情。比方,你可以使用GRE隧道傳輸多播數據包和IPv6數據包。在Linux下,你需要ip_gre.o模塊。5.3.1.IPv4隧道讓我們先來做一做IPv4隧道:比方說你有3個網絡:內部網A和B,中間網C比方說:Internet。A網絡的情況:網絡地址10.0.1.0子網掩碼255

19、.255.255.0路由器10.0.1.1路由器在C網絡上的地址是172.16.17.18。我們稱之為neta。B網絡的情況:網絡地址10.0.2.0子網掩碼255.255.255.0路由器10.0.2.1路由器在C網絡上的IP地址是172.19.20.21。我們稱之為netb。C網絡已經連通,我們假定它會將所有的數據包從A傳到B,反之亦然。至于原因,我們不考慮。在A網絡的路由器上,輸入:ip tunnel add netb mode gre remote 172.19.20.21 local 172.16.17.18 ttl 255 ip link set netb up ip addr a

20、dd 10.0.1.1 dev netb ip route add 10.0.2.0/24 dev netb讓我們略微討論一下。第1行,我們添加了一個隧道設備,并且稱之為netb為了可以表示出這個隧道通向哪里。并且表示要使用GRE協(xié)議mode gre,對端地址是172.19.20.21另一端的路由器,我們的隧道數據包發(fā)源于172.16.17.18以便當你的路由器在C網絡中擁有多個地址的時候,你可以指定哪一個應用于隧道并且包的TTL字段應設置為255ttl 255。第2行,啟用該隧道。第3行,我們給這個新生的網卡配置了一個IP:10.0.1.1。對于小網絡來說足夠了,但假設你網絡中的隧道多得象無

21、證運營的小煤窯一樣,你可能就要考慮給你的隧道規(guī)劃一個單獨的IP地址范圍在本例中,你可以使用10.0.3.0。第4行,我們?yōu)锽網絡設置了一條路由。注意子網掩碼的另一種表示方法。假設你不熟悉這種表示,我就來解釋一下:你把你的子網掩碼寫成二進制形式,數數里面由多少個1。假設你連這個也不會做,不妨就簡單地記?。?55.0.0.0就是/8,255.255.0.0就是/16,255.255.255.0就是/24。讓我們再看看B網絡的路由器。ip tunnel add neta mode gre remote 172.16.17.18 local 172.19.20.21 ttl 255 ip link s

22、et neta up ip addr add 10.0.2.1 dev neta ip route add 10.0.1.0/24 dev neta假設你想從A路由器中停頓隧道,輸入:ip link set netb down ip tunnel del netb當然,你可以把netb換成neta,在B路由器上操作。5.3.2.IPv6隧道關于IPv6地址,請參看第6章第1節(jié)。這就開場吧。我們假設你有如下的IPv6網絡,你想把它連接到6bone或者一個朋友那里。Network 3ffe:406:5:1:5:a:2:1/96你的IPv4地址是172.16.17.18,6bone路由器的IPv4地

23、址是172.22.23.24。ip tunnel add sixbone mode sit remote 172.22.23.24 local 172.16.17.18 ttl 255 ip link set sixbone up ip addr add 3ffe:406:5:1:5:a:2:1/96 dev sixbone ip route add 3ffe:/15 dev sixbone讓我們來討論一下。我們創(chuàng)立了一個叫做sixbone的隧道設備。我們設置它的形式是sit也就是在IPv4隧道中使用IPv6并且告訴它對端remote和本端local在哪里。TTL設置為最大,255。接著,我們

24、激活了這個設備up。然后,我們添加了我們自己的網絡地址,并添加了一條通過隧道去往3ffe:/15如今全部屬于6bone的路由。GRE隧道是如今最受歡送的隧道技術。它也廣泛地應用于Linux世界之外并成為一個標準,是個好東西。5.4.用戶級隧道在內核之外,還有很多實現隧道的方法,最知名的當然要數PPP和PPTP,但實際上還有很多有些是專有的,有些是平安的,有些甚至根本不用IP,但那遠遠超出了本HOWTO所涉及的范圍。第6章用Cisco和6bone實現IPv6隧道Marco Davids marcosara.nl著NOTE to maintainer:As far as Iam concerned

25、,this IPv6-IPv4 tunneling is not per definition GRE tunneling.You could tunnel IPv6 over IPv4 by means of GRE tunnel devicesGRE tunnels ANY to IPv4,but the device used here"sit"only tunnels IPv6 over IPv4 and is therefore something different.6.1.IPv6隧道這是Linux隧道才能的另一個應用。這在IPv6的早期實現中非常流行。下面動

26、手試驗的例子當然不是實現IPv6隧道的唯一方法。然而,它卻是在Linux與支持IPv6的CISCO路由器之間搭建隧道的常用方法,經歷證明多數人都是照這樣做的。八成也適宜于你.。簡單談談IPv6地址:相對于IPv4地址而言,IPv6地址非常大,有128bit而不是32bit。這讓我們得到了我們需要的東西-非常非常多的IP地址。確切地說,有340,282,266,920,938,463,463,374,607,431,768,211,465個。同時,IPv6或者叫Ipng,下一代IP還能讓Internet上的骨干路由器的路由表變得更小、設備的配置更簡單、IP層的平安性更好以及更好地支持QoS。例如

27、:2002:836b:9820:0000:0000:0000:836b:9886寫下一個IPv6地址確實是件費事事。所以我們可以使用如下規(guī)那么來進展簡化:.數字打頭的零不要寫,就像IPv4一樣。.每16bit或者兩個字節(jié)之間使用冒號分隔。.當出現很多連續(xù)的零時可簡寫成":"。在一個地址中只能使用一次。例如:地址2002:836b:9820:0000:0000:0000:836b:9886可以寫成:2002:836b:9820:836b:9886,看上去更簡單些。另一個例子:地址3ffe:0000:0000:0000:0000:0020:34A1:F32C可以寫成3ffe:2

28、0:34A1:F32C,要短得多。IPv6將可能取代現有的IPv4。因為它采用了相對更新的技術,所以如今還沒有全球范圍的IPv6網絡。為了可以平滑地過渡,引入了6bone方案。IPv6網絡中的站點通過現有的IPv4體系互聯(lián),把IPv6數據包封裝在IPv4數據包中進展傳輸。這就是為什么引入隧道機制的原因。為了可以使用IPv6,我們需要一個可以支持它的內核。如今有很多文檔都很好地說明了這個問題。不外乎以下幾步:.找到一個新版的Linux發(fā)行版,要有適宜的glibc庫。.找到一份最新的內核源代碼。都準備好了以后,就可以繼續(xù)編譯一個帶IPv6支持的內核了:.cd/usr/src/linux.make

29、menuconfig.選擇"Networking Options".選擇"The IPv6 protocol"、"IPv6:enable EUI-64 token format","IPv6:disable provider based addresses"提示:不要編譯成內核模塊,那樣經常會出問題。換句話說,就是把IPv6內置入內核。然后你就可以象往常一樣保存配置并編譯內核了。提示:在編譯之前,可以修改一下Makefile,把EXTRAVERSION=-x變成EXTRAVERSION=-x-IPv6有很多文檔都很

30、好地說明了如何編譯并安裝一個內核,我們這篇文檔不是討論這個問題的。假設你在這個過程中出現了問題,請參閱適宜的資料。你可以先看看/usr/src/linux/README。當你完成之后,用新的內核重啟系統(tǒng),你可以輸入"/sbin/ifconfig-a"看看有沒有新的"sit0-device"設備。SIT的意思是"簡單Internet過渡"Simple Internet Transition。假設到這里沒有問題,你就可以獎勵自己了,你已經向著下一代IP網絡邁進了一大步。如今繼續(xù)下一步。你需要把你的主機,或甚至整個局域網連接到另外一個IPv

31、6網絡上。這個網絡很可能是"6bone",它就是為了這個特定的目的而專門設立的。讓我們假定你有如下IPv6網絡:3ffe:604:6:8:/64,并且希望連接到6bone,或者其他地方。請注意,/64這個子網聲明的意義與IPv4一樣。你的IPv4地址是145.100.24.181,6bone的路由器的IPv4地址是145.100.1.5。#ip tunnel add sixbone mode sit remote 145.100.1.5local 145.100.24.181 ttl 255#ip link set sixbone up#ip addr add 3FFE:6

32、04:6:7:2/126 dev sixbone#ip route add 3ffe:0/16 dev sixbone讓我們討論一下。第1行,我們創(chuàng)立了一個叫做sixbone的隧道。設置為sit讓IPv4隧道承載IPv6數據包形式,并設置對端與本端IP。TTL設為最大-255。下一步,我們激活up了這個設備。然后添加我們自己的網絡地址,并設置利用隧道通往3ffe:/15which is currently all of 6bone的路由。假設你運行這個的這臺機器是你的IPv6網關,就得考慮運行下面的命令:#echo 1/proc/sys/net/ipv6/conf/all/forwarding#/us

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論