歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux綜合 >> Linux資訊 >> 更多Linux

ip命令手冊(二)

7.路由表管理    7.1.縮寫  route、ro、r    7.2.對象    路由條目保存在內核的路由表中,它們包含尋找到其它網絡節點的路徑信息。路由表條目都包括一對網絡地址/掩碼長度以及可選的TOS值等信息。如果數據包目的地址位於屬於路由條目的的范圍,以及路由的TOS等於0或者等於數據包的TOS,它就匹配路由條目。如果一個數據包匹配多個路由條目,系統內核將按照以下規則決定選擇哪個路由:    注:作者在文中把地址被子網掩碼屏蔽後的部分/掩碼長度這種表達方式叫做前綴(prefix)。例如:10/8表示網絡10.0.0.0,子網掩碼長度是8位;10.1/16表示網絡10.1.0.0,子網掩碼長度是16位;    范圍最小的優先匹配,較大的放棄;路由TOS等於數據包TOS的匹配,不等於的放棄;如果經過上面兩步的選擇,還有數個路由,就選擇優先值最高的路由;如果還有數個路由可供選擇,就重復進行第一步。     為了簡化,我們使用{prefix,tos,preference}來標記每個路由。    7.3.路由屬性    路由條目提供IP數據包投遞所需的路由信息、數據(例如:輸出設備、下一跳的路由器)和一些可選屬性(例如:路徑的最大傳輸單元MTU或者源地址等)。這些屬性將在後面的章節詳細介紹。    7.4.路由類型    路由的設置以及其它的可選屬性都依賴於路由類型。最重要的路由類型是unicast路由,這種類型的路由表示到另外主機的真實路由。一般情況下,通常的路由表只有這種類型的路由條目。不過,還存在其它類型的路由,使用的語法也不相同。Linux-2.2理解以下幾種類型的路由:    unicast 這種類型的路由描述到目的地址的真實路徑。     unreachable 這些目的地址是不可達的。如果發過去的數據包都被丟棄並且收到ICMP信息host unreachable,目的地址就會被標記為不可達。在這種情況下,本地發送者將返回EHOSTUNREACH錯誤。     blackhole 這些目的地址不可達,而且發過去的數據包都被丟棄。在這種情況下,本地發送者將返回EINVAL錯誤。     prohibit 這些路由是不可達的。發過去的數據包都被丟棄,而且產生ICMP信息communication administratively prohibited 。本地發送者會返回EAccess錯誤。     local 目的地址被分配給本機。數據包通過回環被投遞到本地。     broadcast 目的地址是廣播地址,數據包作為鏈路廣播發送。     throw 和策略規則(policy rule)一塊使用的控制路由。如果選擇了這種路由,就會認為沒有發現路由,在這個表中的查詢就會被終止。沒有找到策略路由就相當於在路由表中沒有找到路由,數據包會被丟棄,並產生ICMP信息net unreachable。本地發送者會返回ENETUNREACH錯誤。     nat 特定的NAT路由。目標地址屬於啞地址(或者稱為外部地址),在轉發前需要進行地址轉換。     anycast 目標是anycast地址,被分配給本機。這類地址和本地地址大同小異,不同的是這類地址不能用於任何數據包的源地址。     multicast 使用多播路由。在普通的路由表中,這種路由並不存在。     7.5.路由表    從Linux-2.2開始,內核把路由歸納到許多路由表中,這些表都進行了編號,編號數字的范圍是1到255。另外,為了方便,還可以在/etc/iproute2/rt_tables中為路由表命名。默認情況下,所有的路由都會被插入到表main(編號254)中。在進行路由查詢時,內核只使用路由表main。    實際上,還有另外一個路由表也一直存在,這個表是不可見的,而且極為重要。這就是表local。這個表保存本地和廣播路由。內核會自動維護這個路由表,通常系統管理員沒有必要對它進行修改,甚至不必看到。    在使用策略路由(policy routing)時,我們將使用多個路由。在這種情況下,表識別符有很多參數,因此需要使用{prefix,tos,preference}的形式唯一地識別每個路由。    7.6.ip route add -- 添加新路由  ip route change -- 修改路由  ip route replace -- 替換已有的路由    縮寫:add、a;change、chg;replace、repl    參數    to PREFIX或者to TYPE PREFIX(default) 路由的目標前綴(prefix)。如果TYPE被忽略,ip命令就會使用默認的類型unicast。其它的類型在上一節都有介紹。PREFIX是一個IP或者IPv6地址,也可以跟著一個斜槓和掩碼長度。如果沒有掩碼長度,ip命令就假定是一個單一ip地址。另外,還有一個特殊的PREFIX--default(缺省路由),它等於IPv4的0/0,或者IPv6的::/0。     tos TOS 或者defield TOS 定義服務類型關鍵詞。在進行路由匹配時,內核首先比較數據包的TOS和route的TOS,如果沒有和數據包TOS相同的路由,還可以選擇TOS等於0的路由。TOS或者是一個十六進制的數字,或者是一個由/etc/iproute2/rt_dsfield文件定義的識別符。     metric NUMBER或者preference NUMBER 定義路由的優先值,NUMBER時一個任意的32位數字。     table TABLEID 路由要加入的表。TABLEID或者是一個數字或者是/etc/iproute2/rt_tables文件定義的一個字符串。如果沒有這個參數,ip命令就會把路由加入到表main中,本地(local)、廣播(broadcast)和網絡地址轉換(nat)路由除外。在默認情況下,這些類型的路由都會被加入表local中。     dev NAME 輸出設備的名字     via ADDRESS 指定下一跳路由器的地址。實際上,這個域的可靠性取決於路由類型。對於通常的unicast路由,它或者是真正的下一跳路由器地址,或者如果它是BSD兼容模式安裝的直接路由,它可以是一個網絡接口的本地地址。對於NAT路由,它是轉換後的地址。     src ADDRESS 在向目的prefix發送數據包時選擇的源地址。     realm REALMID 指定路由分配的realm。REALM可以是一個數字或者/etc/iproute2/rt_realms文件定義的一個字符串。有關realm更為詳細的信息請看附錄(Route realms and policy propagation, rtacct)。     mtu MTU或者mtu lock MTU 設置到達目的路徑的最大傳輸單元(MTU)。如果沒有使用修飾符lock,內核會通過路徑最大傳輸單元發現(Path MTU Discovery)機制更新MTU;如果使用了修飾符lock,內核就不會測試路徑的最大傳輸單元。在這種情況下,發出的所有IPv4數據包DF域都會被設置為0(允許分片),對於IPv6數據包也允許分片。     window NUMBER 設置到目的地址TCP連接的最大窗口值,以字節為單位。使用這個參數可以限制對端發送數據的速率。     rtt NUMBER 估算初始往返時間(Round Trip Time)     rttvar NUMBER 估算初始往返時間偏差(RTT variance)     ssthresh NUMBER 估算慢啟動閥值(slow start threshould)     cwnd NUMBER 把擁擠窗口(congestion window)值鎖定為NUMBER。如果沒有lock標記,這個值會被忽略。     advmss NUMBER 設置在建立TCP連接時,向目的地址聲明的最大報文段大小(Maximal Segment Size,MSS)。如果沒有設置,Linux內核會使用計算第一跳的最大傳輸單元得到的數值。     nexthop NEXTHOP 設置多路徑路由的下一跳地址。NEXTHOP比較復雜,它的語法和以下高層參數類似:  via ADDRESS--表示下一跳路由器;dev NAME--表示輸出設備;weight NUMBER--在多路由路徑中,這個元素的權重。表示相對帶寬或者服務質量。     scope SCOPE_VAL 路由前綴(prefix)覆蓋的范圍。SCOPE_VAL可以是一個數字,也可以是/etc/iproute2/rt_scope文件定義的一個字符串。如果沒有這個參數,ip命令就會根據具體情況猜測:對於經過網關的unicast路由,就設置為global;對於直連的unicast路由和廣播路由,就設置為link;對於本地路由,就設置為host。     protocol RTPROTO 本條路由得路由協議識別符。RTPROTO可以是一個數字,也可以是/etc/iproute2/rt_protos文件定義的一個字符串。如果使用時沒有提供這個參數,ip命令就使用默認值boot(也就是說,ip命令認為添加路由的人不知道自己做了些什麼)。有些協議值有其固定的解釋:  redirect--路由是由ICMP重定向加入的;kernel--路由是由內核在自動配置期間加入的;boot--路由是啟動過程中加入的。如果一個路由監控程序將要啟動,這些路由都會被清除;static--為了覆蓋動態路由,由系統管理員手工添加的路由。路由監控程序也會優先考慮這類路由,甚至可能通告給其對端;ra--路由是通過路由發現協議加入的(Router Discovery Protocol)。  其它的值沒有保留,系統管理員可以自由分配(或者不分配)給協議標記。至少,路由監控程序應該注意對一些唯一協議值的設置,這些協議值在rtnetlink.h文件或者rt_protos數據庫中分配。     onlink 假裝和下一跳路由器是直接相連的,即使它沒有匹配任何接口前綴(prefix)。     equalize 允許把數據包隨機從多個路由發出。如果沒有這個路由修飾符,內核就會凍結下一跳路由的地址。     示例    設置到網絡10.0.0/24的路由經過網關193.233.7.65ip route add 10.0.0/24 via 193.233.7.65修改到網絡10.0.0/24的直接路由,使其經過設備dummyip route chg 10.0.0/24 dev dummy加入缺省多路徑路由,讓ppp0和ppp1分擔負載(注意:scope值並非必需,它只不過是告訴內核,這個路由要經過網關而不是直連的。實際上,如果你知道遠程端點的地址,使用via參數來設置就更好了)。ip route add default scope global nexthop dev ppp0 nexthop dev ppp1設置NAT路由。在轉發來自192.203.80.144的數據包之前,先進行網絡地址轉換,把這個地址轉換為193.233.7.83(回來的轉換將會在後面的章節路由策略中介紹)。ip route add nat 192.203.80.142 via 193.233.7.83     7.7.ip route delete-- 刪除路由    縮寫:delete、del、d    參數    ip route del使用和ip route add相同的參數,不過語法稍有不同。這個命令使用關鍵詞(to、tos、preference和table)選擇要刪除的路由。如果命令中使用了可選屬性,ip命令會校驗這個屬性和要刪除的路由是否一致;如果沒有給定關鍵詞或者屬性不一致,ip route del會執行失敗。    示例    刪除上一節命令加入的多路徑路由ip route del default scope global nexthop dev ppp0 nexthop dev ppp1     7.8.ip route show -- 列出路由    縮寫:show、list、sh、ls、l    簡介    使用這個命令,你可以看到路由表的內容,或者查詢符合某些條件的路由。    參數    to SELECTOR(default) 只選擇到給定地址的路由。 SELECTOR由修飾符(root、match、exact,可選)和一個前綴(prefix)組成。root PREFIX表示選擇前綴(prefix)不短於PREFIX的路由,例如:root 0/0將選在路由表裡面的全部路由;match PREFIX表示選擇前綴(prefix)不長於PREFIX的路由,match 10.1/16會選擇前綴(prefix)是10.1/16、10./8和0/0的全部路由;而exact PREFIX(或者just PREFIX)表示精確匹配。如果沒有這些選項(ip route ls),ip命令就假定是ip route ls to root 0/0,將列出系統的所有路由。     tos TOS或者dsfield TOS 只列出tos等於TOS的路由     table TABLEID 列出路由表TABLEID裡面的路由。缺省設置是table main。TABLEID或者是一個真正的路由表ID或者是/etc/iproute2/rt_tables文件定義的字符串,或者是以下的特殊值:  all -- 列出所有表的路由;cache -- 列出路由緩存的內容。     cloned或者cached 列出被克隆出來的路由(由於某些路由屬性改變,例如:MTU,而由某些路由派生出來的路由)。實際上,它的內容和表緩存的內容是一樣的。     from SELECTOR 和to的語法是相同的,只不過由目的地址換為源地址而已。注意:這個選項之適用於被克隆出來的路由。     protocol RTPROTO 只列出協議是RTPROTO的路由     scope SCOPE_VAL 只列出范圍是SCOPE_VAL的路由     type TYPE 只列出類型為TYPE的路由     dev NAME 只列出通過設備NAME的路由     via PREFIX 只列出下一跳通過PREFIX的路由     src PREFIX 只列出源地址屬於PREFIX的路由     realm REALMID或者raalm FROMREALM/TOREALM 只列出realm為REALMID的路由     示例    計算使用gated/bgp協議的路由個數kuznet@amber:~ $ ip route ls proto gated/bgp wc 1413 9891 79010kuznet@amber:~ $計算路由緩存裡面的條數,由於被緩存路由的屬性可能大於一行,以此需要使用-o選項uznet@amber:~ $ ip -o route ls cloned wc 159 2543 18707kuznet@amber:~ $     輸出格式    通常,在這個命令輸出的信息中,每個路由紀錄占一行。不過,有時某些紀錄可能會超過一行,例如被克隆出來的路由或者包含一些額外的信息。如果在命令中使用了-o選項,在每個紀錄中,會使用代替回車作為回行標記。例如:    kuznet@amber:~ $ ip ro ls 193.233.7/24193.233.7.0/24 dev eth0 proto gated/conn scope link src 193.233.7.65 realms inr.ac kuznet@amber:~ $     如果是列出被克隆的條目,輸出信息將是另外的形式。例如:    kuznet@amber:~ $ ip ro ls 193.233.7.82 tab cache193.233.7.82 from 193.233.7.82 dev eth0 src 193.233.7.65 realms inr.ac/inr.ac cache mtu 1500 rtt 300 iif eth0193.233.7.82 dev eth0 src 193.233.7.65 realms inr.ac cache mtu 1500 rtt 300kuznet@amber:~ $     輸出信息的第二行是以關鍵詞cache開頭的,顯示路由的其它緩存標記和屬性。本行的第一個域是cache <緩存標記>,緩存標記包括:    local 數據包被投遞到本地。它適用於本地回環單向傳播(unicast)路由,如果這個主機是對應廣播組的一個成員,它也適用於廣播路由何多播路由。     reject 路徑無效。任何試圖通過這個路由的企圖都會導致錯誤。     mc 目的是多播地址(multicast)。     brd 目的是廣播地址(broadcast)。     src-direct 源地址是在一個直接連接的接口。     redirected 路由是由ICMP重定向建立的。     redirect 數據包通過這個路由將觸發ICMP重定向。     fastroute 路由適合用於快速路由(fastroute)。     equalize 使數據包隨機地通過這個路由。     dst-nat 目的地址需要進行地址轉換。     src-nat 源地址需要進行地址轉換。     masq 源地址需要偽裝(masquerading)。     notify 修改/刪除這個路由將觸發RTNETLINK報警。     接著是一些路由屬性,支持的屬性如下:    error 對於reject路由,這是返回給本地發送者的錯誤碼。這些錯誤碼也會被轉換為ICMP錯誤碼,發送給遠程發送者。     eXPires 到了超時時間,這個條目就會消失。     iif 需要這個路由的數據包如期到達這接口。     統計選項    如果在命令中使用-statistics選項,ip命令會給出一些更為詳盡的信息:    users 使用這個路由的用戶數。     age 顯示這個路由最後使用時的時間。     used 自從建立這個路由以來,它被查詢的次數。     7.9.ip route flush -- 擦除路由表    縮寫:flush、f    簡介    使用這個命令,可以很方便地刪除符合某些條件的路由。    參數    這個命令的參數和ip route show命令的參數相同,只不過被操作的路由表不會被顯示出來。它和ip route show命令唯一的區別是它們的缺省操作,ip route show會顯示出路由表main的所有條目,而ip route flush只會給出幫助信息,不對路由表進行任何操作。至於這個區別的原因,恐怕不必多做解釋了吧?    統計選項    如果在這個命令中使用了-statistics選項,它就會顯示一些冗余信息。這些信息包括:被刪除的路由數和刪除過程中遍歷路由表的次數。如果這個選項使用了兩次,ip還會輸出被刪除路由的詳細信息。    示例    第一個例子是刪除路由表main中的所有網關路由(例如:在路由監控程序掛掉之後):    netadm@amber:~ # ip -4 ro flush scope global type unicast     第二個例子是清除所有被克隆出來的IPv6路由:    netadm@amber:~ # ip -6 -s -s ro flush cache3ffe:2400::220:afff:fef4:c5d1 via 3ffe:2400::220:afff:fef4:c5d1 dev eth0 metric 0 cache used 2 age 12sec mtu 1500 rtt 3003ffe:2400::280:adff:feb7:8034 via 3ffe:2400::280:adff:feb7:8034 dev eth0 metric 0 cache used 2 age 15sec mtu 1500 rtt 3003ffe:2400::280:c8ff:fe59:5bcc via 3ffe:2400::280:c8ff:fe59:5bcc dev eth0 metric 0 cache users 1 used 1 age 23sec mtu 1500 rtt 3003ffe:2400:0:1:2a0:ccff:fe66:1878 via 3ffe:2400:0:1:2a0:ccff:fe66:1878 dev eth1 metric 0 cache used 2 age 20sec mtu 1500 rtt 3003ffe:2400:0:1:a00:20ff:fe71:fb30 via 3ffe:2400:0:1:a00:20ff:fe71:fb30 dev eth1 metric 0 cache used 2 age 33sec mtu 1500 rtt 300ff02::1 via ff02::1 dev eth1 metric 0 cache users 1 used 1 age 45sec mtu 1500 rtt 300*** Round 1, deleting 6 entries ****** Flush is complete after 1 round ***netadm@amber:~ # ip -6 -s -s ro flush cacheNothing to flush.netadm@amber:~ #     第三個例子是在gated程序掛掉之後,清除所有的BGP路由:    netadm@amber:~ # ip ro ls proto gated/bgp wc 1408 9856 78730netadm@amber:~ # ip -s ro f proto gated/bgp*** Round 1, deleting 1408 entries ****** Flush is complete after 1 round ***netadm@amber:~ # ip ro f proto gated/bgpNothing to flush.netadm@amber:~ # ip ro ls proto gated/bgpnetadm@amber:~ #     7.10.ip route get -- 獲得單個路由    縮寫:get、g    簡介    使用這個命令可以獲得到達目的地址的一個路由以及它的確切內容。    參數    to ADDRESS(default) 目標地址     from ADDRESS 源地址     tos TOS或者dsfield TOS 服務類型     iif NAME 數據包進來的設備     oif NAME 數據包出去的設備     connected ip route get命令至少要有參數to ADDRESS。使用connected參數,如果沒有給出源地址(from ADDRESS),ip就會重新在路由表中查詢能夠到達目的地址的源地址,給出獲得的第一個源地址到目的地址的路由。如果使用了策略路由,會有所不同。     ip route get命令和ip route show命令執行的操作是不同的。ip route show命令只是顯示現有的路由,而ip route get命令在必要時會派生出新的路由。    輸出格式    這個命令的輸出格式和ip route ls相同。    示例    搜索到193.233.7.82的路由kuznet@amber:~ $ ip route get 193.233.7.82193.233.7.82 dev eth0 src 193.233.7.65 realms inr.ac cache mtu 1500 rtt 300kuznet@amber:~ $搜索目的地址是193.233.7.82,來自193.233.7.82,從eth0設備到達的路由(這條命令會產生一條非常有意思的路由,這是一條到193.233.7.82的回環路由)kuznet@amber:~ $ ip r g 193.233.7.82 from 193.233.7.82 iif eth0193.233.7.82 from 193.233.7.82 dev eth0 src 193.233.7.65 realms inr.ac/inr.ac cache mtu 1500 rtt 300 iif eth0kuznet@amber:~ $獲得一個多播路由,數據包來自主機193.233.7.82,從eth0設備進入,目的地址是多播組地址224.2.127.254(需要運行多播路由監控程序pimd)。這個命令產生的路由與上面的不大相同,它包含常規部分和多播部分。常規部分用於把數據包投遞到本地ip監控程序。這裡,本地地址不是多播組的成員,因此這個路由沒有local標記,只用於轉發數據包。這個路由的輸出設備是回環設備。多播部分包含額外的輸出接口。kuznet@amber:~ $ ip r g 224.2.127.254 from 193.233.7.82 iif eth0multicast 224.2.127.254 from 193.233.7.82 dev lo src 193.233.7.65 realms inr.ac/cosmos cache iif eth0 Oifs: eth1 pimregkuznet@amber:~ $     下面我們舉一個復雜一些的例子。我們首先為一個目標地址添加一個無效的網關路由,而實際上和這個地址是直連的。    netadm@alisa:~ # ip route add 193.233.7.98 via 193.233.7.254netadm@alisa:~ # ip route get 193.233.7.98193.233.7.98 via 193.233.7.254 dev eth0 src 193.233.7.90 cache mtu 1500 rtt 3072netadm@alisa:~ #     然後,我們ping一下193.233.7.98:    netadm@alisa:~ # ping -n 193.233.7.98PING 193.233.7.98 (193.233.7.98) from 193.233.7.90 : 56 data bytesFrom 193.233.7.254: Redirect Host(New nexthop: 193.233.7.98)64 bytes from 193.233.7.98: icmp_seq=0 ttl=255 time=3.5 msFrom 193.233.7.254: Redirect Host(New nexthop: 193.233.7.98)64 bytes from 193.233.7.98: icmp_seq=1 ttl=255 time=2.2 ms64 bytes from 193.233.7.98: icmp_seq=2 ttl=255 time=0.4 ms64 bytes from 193.233.7.98: icmp_seq=3 ttl=255 time=0.4 ms64 bytes from 193.233.7.98: icmp_seq=4 ttl=255 time=0.4 ms^C--- 193.233.7.98 ping statistics ---5 packets transmitted, 5 packets received, 0% packet lossround-trip min/avg/max = 0.4/1.3/3.5 MSNetadm@alisa:~ #     輸出結果可以看出,路由器193.233.7.254知道有更好的路由,因此送回一個ICMP重定向信息。然後,我們再看看路由表的情況:    netadm@alisa:~ # ip route get 193.233.7.98193.233.7.98 dev eth0 src 193.233.7.90 cache mtu 1500 rtt 3072netadm@alisa:~ #  




Copyright © Linux教程網 All Rights Reserved