1. ip命令 1.1. 摘要 ip是iproute2軟體包裡面的一個強大的網路配置工具,它能夠替代一些傳統的網路管理工具。例如:ifconfig、route等。這個手冊將分章節介紹ip命令及其選項。 1.2. ip命令的語法 ip命令的用法如下: [root@node01 ~]# ip Usage ...
1. ip命令
1.1. 摘要
ip是iproute2軟體包裡面的一個強大的網路配置工具,它能夠替代一些傳統的網路管理工具。例如:ifconfig、route等。這個手冊將分章節介紹ip命令及其選項。
1.2. ip命令的語法
ip命令的用法如下:
[root@node01 ~]# ip
Usage: ip [ OPTIONS ] OBJECT { COMMAND | help }
ip [ -force ] -batch filename
where OBJECT := { link | address | addrlabel | route | rule | neigh | ntable |
tunnel | tuntap | maddress | mroute | mrule | monitor | xfrm |
netns | l2tp | fou | macsec | tcp_metrics | token | netconf | ila |
vrf }
OPTIONS := { -V[ersion] | -s[tatistics] | -d[etails] | -r[esolve] |
-h[uman-readable] | -iec |
-f[amily] { inet | inet6 | ipx | dnet | mpls | bridge | link } |
-4 | -6 | -I | -D | -B | -0 |
-l[oops] { maximum-addr-flush-attempts } | -br[ief] |
-o[neline] | -t[imestamp] | -ts[hort] | -b[atch] [filename] |
-rc[vbuf] [size] | -n[etns] name | -a[ll] | -c[olor]}
其中,OPTIONS是一些修改ip行為或者改變其輸出的選項。所有的選項都是以
-字元開頭,分為長、短兩種形式。目前,ip支持如下選項:
- -V,-Version 列印ip的版本並退出。
- -s,-stats,-statistics 輸出更為詳盡的信息。如果這個選項出現兩次或者多次,輸出的信息將更為詳盡。
- -f,-family 這個選項後面接協議種類,包括:inet、inet6或者link,強調使用的協議種類。如果沒有足夠的信息告訴ip使用的協議種類,ip就會使用預設值inet或者any。link比較特殊,它表示不涉及任何網路協議。
- -4 是-family inet的簡寫。
- -6 是-family inet6的簡寫。
- -0 是-family link的簡寫。
- -o,-oneline 對每行記錄都使用單行輸出,回行用字元代替。如果你需要使用wc、grep等工具處理ip的輸出,會用到這個選項。
- -r,-resolve 查詢功能變數名稱解析系統,用獲得的主機名代替主機IP地址。
OBJECT是你要管理或者獲取信息的對象。目前ip認識的對象包括:
- link 網路設備
- address 一個設備的協議(IP或者IPV6)地址
- neighbour ARP或者NDISC緩衝區條目
- route 路由表條目
- rule 路由策略資料庫中的規則
- maddress 多播地址
- mroute 多播路由緩衝區條目
- tunnel IP上的通道
另外,所有的對象名都可以簡寫,例如:address可以簡寫為addr,甚至是a
。
COMMAND設置針對指定對象執行的操作,它和對象的類型有關。一般情況下,ip支持對象的增加(add)、刪除(delete)和展示(show或者list)。有些對象不支持所有這些操作,或者有其它的一些命令。對於所有的對象,用戶可以使用help命令獲得幫助。這個命令會列出這個對象支持的命令和參數的語法。如果沒有指定對象的操作命令,ip會使用預設的命令。一般情況下,預設命令是list,如果對象不能列出,就會執行help命令。
ARGUMENTS是命令的一些參數,它們倚賴於對象和命令。ip支持兩種類型的參數:flag和parameter。flag由一個關鍵片語成;parameter由一個關鍵詞加一個數值組成。為了方便,每個命令都有一個可以忽略的預設參數。例如,參數dev是ip link命令的預設參數,因此ip link ls eth0等於ip link ls dev eth0。我們將在後面的章節詳細介紹每個命令的使用,命令的預設參數將使用default標出。
幾乎所有的關鍵詞都可以簡寫為前幾個字母。在交互工作時,簡寫的方式非常方便,但是我們不建議在腳本中使用簡寫形式。另外,在講述過程中,所有的“官
方”簡寫方式都會在文章中列出。
1.3. ip的錯誤信息
由於以下原因,ip可能會操作失敗:
命令行語法錯誤:一個未知的關鍵詞(an unknown keyword);錯誤的IP地址格式(incorrectly formated IP address)。在這種情況下,ip會列印出錯誤信息然後退出,在錯誤信息中會包含失敗的原因。有時ip也會列印幫助信息。
參數不能通過一致性校驗。
由於用戶沒有提供足夠的信息,造成ip無法從參數中編譯出內核請求。內核返回某些系統調用的錯誤。ip使用perror(3)輸出錯誤信息,因此輸出的錯誤信息包含一段註釋以及系統調用號。內核返回RTNETLINK請求錯誤。這類錯誤信息以"RTNETLIK answers"開頭。
ip的所有操作都是原子操作。例如,如果ip執行失敗,它不會系統的任何東西,ip link command例外,它會修改某些設備參數。
我們無法列出所有的錯誤信息,尤其是語法錯誤。不過,錯誤信息的意思都非常明確。下麵,我們列舉一些經常出現的錯誤信息:
內核不支持netlink(netlink用於在內核模塊和用戶之間傳遞信息),會出現以下錯
誤信息:
Cannot open netlink socket: Invalid value
內核不支持RTNETLINK,會出現以下錯誤信息:
Cannot talk to rtnetlink: Connect refused
Cannot send dump request: Connect refused
如果在編譯內核時沒有配置CONFIG_IP_MULTIPLE_TABLES選項。在使用ip規則時會出現和下麵的信息類似的錯誤信息:
kuznet@kaise $ ip rule list
RTNETLINK error: Invalid argument
dump terminated
1.3.1. ip link--配置網路設備
對象 link由網路設備,對應的命令顯示以及設備的狀態變化組成。
命令 set和show(或者list)
1.3.2. ip link set--改變設備的屬性
縮寫:set、s
參數:
- dev NAME(default) 指定進行操作的網路設備
- up/down 起動/關閉設備。
-
- 例如:
ip link set dev eth0 up
- 例如:
- arp on/off 改變網路設備的NOARP選項。
-
- 如果設備處於UP狀態,不允許進行這個操作。不過,內核和ip都不會對在這種情況下的這個操作進行檢查。在設備處於運行狀態下改變這個選項會造成無法預料的後果。
- multicast on/off 改變網路設備的MULTICAST選項。
- dynamic on/off 改變網路設備的DYNAMIC選項。
- name NAME 把設備的名字改為NAME(例如:eth0)。如果設備處於運行狀態或者已經配置了地址,建議不要進行這個操作。
- txqueuelen NUMBER或者txqlen NUMBER 改變設備傳輸隊列的長度。
-
- 例如:
ip link set dev eth0 txqueuelen 100
- 例如:
- mtu NUMBER 改變網路設備MTU(最大傳輸單元)的值。
-
- 例如:
ip link set dev eth0 mtu 1500
- 例如:
- address LLADDRESS 修改網路設備的MAC地址。
-
- 例如:
ip link set dev eth0 address 00:01:4f:00:15:f1
- 例如:
- broadcat LLADDRESS或者brd LLADDRESS 修改數據鏈路層廣播地址。
-
- 註意:對於大多數的網路設備(例如:乙太網),修改鏈路層廣播地址會對網路造成破壞。因此,如果對此沒有很深的理解,最好不要使用這個操作。
- peer LLADDRESS 當使用點對點連接時,使用這個操作可以修改對端的數據鏈路層地址。
-
- 註意:ip不能修改PROMISC或者ALLMULTI選項。這兩個選項已經比較陳舊,而且也不應該隨便修改。
-
- 註意:如果同時修改多個參數,任何一個修改失敗,ip都會立即取消操作。這種情況可能使系統進入無法預料的狀態。為了避免出現這種情況,儘量不要使用ip link set同時修改多個參數,例如:
ip link set dev eth0 mtu 1500 txqueuelen 100
。
- 註意:如果同時修改多個參數,任何一個修改失敗,ip都會立即取消操作。這種情況可能使系統進入無法預料的狀態。為了避免出現這種情況,儘量不要使用ip link set同時修改多個參數,例如:
1.3.3. ip link show--顯示設備屬性
縮寫:show、list、lst、sh、ls、l
參數
dev NAME(default) NAME指定網路設備名稱,例如:eth0。如果省略了這個參數,所有的設備屬性就都會被列出。
up 只顯示處於活動狀態網路介面的信息。
輸出格式
[root@node01 ~]# ip link ls eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1442 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
link/ether 00:16:3e:56:05:bb brd ff:ff:ff:ff:ff:ff
[root@node01 ~]# ip link ls virbr0
4: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default qlen 1000
link/ether 52:54:00:46:c5:28 brd ff:ff:ff:ff:ff:ff
[root@node01 ~]#
在顯示的信息中,每個引號之前的數字是一個介面索引,用於識別網路介面。這個數字後面是網路介面的名字(例如:eth0、dummy等),它也和網路介面一一對應。不過,在某些情況下,例如:驅動模塊被卸載,對應的介面名就會從列表中消失,而其它新創建的介面就會使用相同的名字。系統管理員可以ip link set name修改介面的名字。
介面名可以是別的,或者是@NONE。這意味著這個設備被綁定到其它的設備,例如數據包被髮送到這個設備,由這個設備封裝,並從master設備發出。如果設備名字是NONE,就表示master設備是未知的。
接著,我們看到的是mtu(Maximal Transfer Unit,最大傳輸單元)。它決定這個介面單個數據包能夠傳輸多少數據。
qdisc(queuing discipline)顯示這個網路介面使用的排隊演算法。noqueue表示不對數據包進行排隊;noop表示這個網路介面出於黑洞模式,也就是所有進入本網路設備的數據會直接被丟棄。qlen是網路介面傳輸隊列的預設長度。
網路介面可以有如下標誌:
- UP 這個設備處於運行狀態,可以接收、發送數據包。
- LOOPBACK 這個介面不能用於和其它的主機通訊,所有發送到這個介面的數據包都會返回,而且這種介面只能接收反彈回來的數據包。
- BROADCAST 這個設備具有把數據包發送到所有主機的能力。乙太網連接是一個很典型的例子。
- POINTTOPOINT 兩個節點之間是直接連接的。某個接點發出的所有數據包都會發到對端節點,接收到的所有數據包也都是從對端節點發過來的。
- MULTICAST 這個標誌表示設備具有多播能力,能夠把數據包發送到某些相鄰的網路節點。實際上,廣播是多播的一個特例,它的多播組包括連接上的所有節點。
從定義上,POINTTOPOINT和BROADCAST連接都屬於多播。
如果網路介面的標誌不屬於LOOPBACK、BROADCAST和POINTTOPOINT的任何一個,就假定是NMBA(Non-Broadcast Multi-Access)類型。這是最為普遍的一個標誌。
- PROMISC 設備處於混雜模式,接收連接上的所有數據,不管目的地址是否是自己。通常,這種模式主要用於網橋和網路監視。
- ALLMULTI 設備接收連接上的所有多播數據包,多播路由器(muliticast router)使用這種模式。
- NOARP 這個標誌和其它的標誌不同,它的含義和涉及的網路協議有關。它一般表示這個設備無需地址解析,軟體或者硬體不必藉助於系統協議棧的幫助就知道如何把數據包投遞到目的地。
- DYNAMIC 這個標誌表示這個網路介面是動態建立和撤消的。
- SLAVE 表示這個介面被綁定到其它的網路介面。
除此之外,還有其它一些標誌。這些標誌或者已經過時(例如:NOTRAILERS),或者還沒有實現(如:DEBUG),或者只是特定於某些設備(例如:MASTER、AUTOMEDIA、PORTSEL)。因此,在此我們不作討論。
對於PROMISC和ALLMULTI標誌,ifconfig和ip顯示的值是不同的。ip link ls
命令顯示的是設備的真正狀態,而ifconfig顯示的是自己設置的虛擬設備狀態。
顯示信息的第二行包含和鏈路層地址(MAC地址)相關的信息。其中,第一個詞(ether、sit)定義介面的硬體類型。而介面的硬體類型又決定MAC地址的格式和語法。預設的格式是硬體的MAC地址和廣播地址(如果是點對點連接方式,就是對端的地址),地址是用冒號隔開的16進位數字。不過,默寫類型的連接有其特定的地址格式,例如:IP通道的地址格式是用點分開的IP地址。
- NBMA(Non-Broadcast Multi-Access)連接沒有明確定義的廣播地址和對端地址。不過,這個域包含一些有用的信息,例如:倚賴於ARP伺服器的廣播地址。
使用這個命令不會顯示多播地址,需要使用ip maddr ls命令。詳情請參考第9節ip maddr ls。
統計信息
使用-statistics選項,ip命令會列印出網路介面的統計信息,例如:
worker:/etc/sysconfig/network # ip -s link ls eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
link/ether 00:16:3e:c2:49:da brd ff:ff:ff:ff:ff:ff
RX: bytes packets errors dropped overrun mcast
1342786 17496 0 1147 0 0
TX: bytes packets errors dropped carrier collsns
587396 6368 0 0 0 0
altname enp0s16
altname ens16
RX和TX分別是接收和發送統計信息的開頭。得到的統計信息包括:
- bytes 網路介面發送或者收到的位元組數。如果位元組數超過數據類型能夠表示的最大數值,就會造成回捲。因此,你如果想連續監視這個指標,需要一個用戶空間的監控進程周期性地保存這個數據。
- packets 網路介面收到或者發送的數據包個數。
- errors 發生錯誤的次數。
- dropped 由於系統資源限制,而丟棄數據包的數量。
- overrun 由於發生堵塞,收到的數據包被丟棄的數量。如果介面發生堵塞,就意味著內核或者你的機器太慢,無法處理收到的數據。
- mcast 收到的多播數據包數量,只有很少的設備支持這個選項。
- carrier 連接介質出現故障的次數,例如:網線接觸不好。
- collsns 乙太網類型介質發生衝突的事件次數。
- compressed 壓縮數據包的總數。這個指標只適用於使用VJ頭壓縮的網路介面。
如果-s選項出現兩次或者更多次,ip會輸出更為詳細的錯誤信息統計。
worker:/etc/sysconfig/network # ip -s -s link ls eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
link/ether 00:16:3e:c2:49:da brd ff:ff:ff:ff:ff:ff
RX: bytes packets errors dropped overrun mcast
1372546 17902 0 1175 0 0
RX errors: length crc frame fifo missed
0 0 0 0 0
TX: bytes packets errors dropped carrier collsns
601100 6543 0 0 0 0
TX errors: aborted fifo window heartbeat transns
0 0 0 0 2
altname enp0s16
altname ens16
worker:/etc/sysconfig/network #
這些錯誤的名字是純以太化的,對於其它種類的設備,這些域可能有不同的解釋。
1.4. ip address--協議地址管理
縮寫 address、addr、a
對象 這裡的地址是綁定到網路設備上的協議(IP或者IPv6)地址。每個網路設備至少應該有一個協議地址。而且,一個網路設備可以綁定多個協議地址。
ip addr命令能夠顯示網路設備的協議地址及其性質,添加新的地址,刪除舊的地址。
1.4.1. 命令 add、delete、flush和show(或者list)
1.4.2. ip address add--添加一個新的協議地址
縮寫:add、a
參數
- dev NAME 被操作的設備名
- local ADDRESS(default) 介面的地址,地址格式和協議有關。IPv4地址使用.進行分隔,而IPv6地址使用冒號分隔。ADDRESS可以跟著一個斜杠和表示掩碼位數的十進位數字。
- peer ADDRESS 點對點介面對端的地址。ADDRESS也可以跟著一個斜杠和表示掩碼位數的十進位數字。
- broadcast ADDRESS 介面的廣播地址。為了方便,可以使用+和-(註1)代替廣播地址。例如:
ip addr add local 192.168.1.1/24 brd + dev eth0
ip addr add local 192.168.1.1/28 brd - dev eth0
- label NAME 為每個地址設置一個字元串作為標簽。為了和Linux-2.0的網路別名相容,這個字元串必須以設備名開頭,接著一個冒號,例如:
#ip addr add local 192.168.4.1/28 brd + label eth0:1 dev eth0
- scope SCOPE_VALUE(註2) 設置地址的有效範圍,它用於內核為數據包設置源地址。有效的範圍在/etc/iproute2/tr_scopes文件列出,系統預先設定了一些範圍值:
-
- global 這個地址全局有效。
-
- site 這個地址是局部連接,也就是只有目標地址是這個設備地址時,才有效。
-
- site (只適用於IPv6)地址在站點內部有效。
-
- host 地址在主機內部有效。
註1:使用-,ip addr ls顯示的是網路地址;使用+,ip addr ls顯示的是廣播地址。
註2:有關scope,在附錄A中有更為詳細的解釋。
示例
在迴環設備上添加一個迴環地址:
worker:/etc/sysconfig/network # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:16:3e:c2:49:da brd ff:ff:ff:ff:ff:ff
altname enp0s16
altname ens16
inet 10.160.xxx.xxx/26 brd 10.160.xxx.xxx scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::216:3eff:fec2:49da/64 scope link
valid_lft forever preferred_lft forever
worker:/etc/sysconfig/network # ip addr add 127.0.0.2/8 dev lo brd + scope host
worker:/etc/sysconfig/network # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet 127.0.0.2/8 brd 127.255.255.255 scope host secondary lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:16:3e:c2:49:da brd ff:ff:ff:ff:ff:ff
altname enp0s16
altname ens16
inet 10.160.xxx.xxx/26 brd 10.160.xxx.xxx scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::216:3eff:fec2:49da/64 scope link
valid_lft forever preferred_lft forever
worker:/etc/sysconfig/network #
在乙太網介面eth0上增加一個地址10.0.0.1,掩碼長度為24位(155.155.155.0),標準廣播地址,標簽為eth0:Alias:
#ip addr add 10.0.0.1/24 brd + dev eth0 label eth0:Alias
1.4.3. ip address delete--刪除一個協議地址
縮寫:delete、del、d
參數
這個命令的參數和ip addr add命令的參數一致。其中,只有設備名是必需的
參數,其它都是可選的。如果沒有給定除設備名之外的其它參數,ip就會刪除這個
設備的第一個地址。
示例
刪除迴環設備的一個迴環地址。不過,最好不要作這種嘗試。
worker:/etc/sysconfig/network # ip addr del 127.0.0.2/8 dev lo
worker:/etc/sysconfig/network # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:16:3e:c2:49:da brd ff:ff:ff:ff:ff:ff
altname enp0s16
altname ens16
inet 10.160.xxx.xxx/26 brd 10.160.xxx.xxx scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::216:3eff:fec2:49da/64 scope link
valid_lft forever preferred_lft forever
worker:/etc/sysconfig/network #
以下shell代碼可以取消設備上的所有IP地址。
while ip -f inet add del dev eth0;do
:nothing
done
另外,可以使用ip addr flush
命令取消IP地址
1.4.4. ip address show--顯示協議地址
縮寫:show、list、lst、sh、ls、l
參數
- dev NAME(default) 設備的名字
- scope SCOPE_VAL 只列出這個範圍的地址
- to PREFIX 只列出和PREFIX匹配的地址,例如:
ip addr ls to 192.168.1.1
- label PATTERN 只列出標簽匹配PATTERN的地址,PATTERN是一個shell風格的正則表達式。
- dynamic和permanent 這兩個參數只適用於IPv6。使用dynamic,ip就只列出動態地址;使用permanent,ip就只列出固定地址。
- tentative 這個參數只適用於IPv6,只列出沒有通過重覆地址檢測[參考2]的地址
。 - deprecated 這個參數只適用於IPv6,只列出deprecated[參考2]地址。
- primary和secondary 只列出主(primary)或從(secondary)地址。
輸出格式
worker:~ # ip address list eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:16:3e:c2:49:da brd ff:ff:ff:ff:ff:ff
altname enp0s16
altname ens16
inet 10.160.xxx.xxx/26 brd 10.160.xxx.xxx scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::216:3eff:fec2:49da/64 scope link
valid_lft forever preferred_lft forever
worker:~ #
worker:~ # ip link list eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
link/ether 00:16:3e:c2:49:da brd ff:ff:ff:ff:ff:ff
altname enp0s16
altname ens16
worker:~ #
輸出的頭兩行和ip link ls的輸出是相同的。
接著是IP和IPv6地址、廣播地址以及其它的地址屬性:範圍(scope)、標誌(flag)和標簽(label)。地址標誌由內核設置,系統管理員不能修改。目前,內核定義了以下標誌:
- secondary 為輸出的數據包選擇預設源地址時,內核不使用這個地址。如果一個設備已經有了一個地址,又給它設置了同一網段的不同地址,第二個地址就成為從(secondary)地址。例如:eth0已經有一個地址192.168.1.108/24,如果又給它一個地址192.168.1.3/24,192.168.1.3/24的就會被內核標記為從地址。
- dynamic 這個地址是通過無狀態的自動配置建立的(stateless
- autoconfiguration)[參考2]。如果地址仍然有效,在輸出中,還包括兩個時間信息。preferred_lft期滿後,地址就會變成deprecated狀態;valiid_lft期滿後,地址將失效。
- deprecated 這個地址是不允許的,也就是說,地址雖然有效,但是不能使用它建立新的連接。
- tentative 由於重覆地址監測[參考2]還沒有完成或者監測失敗,這個地址不能使用。
1.4.5. ip address flush--清除協議地址
縮寫:flush、f
簡介
這個命令可以清除按照某種條件選擇的協議地址。
參數
這個命令的參數和ip address show相同。唯一的區別是,如果不給定參數它什麼都不會做。
警告
這個命令(和後面討論的所有flush命令)非常危險。如果出現錯誤,將無法恢復,它會清除被操作的地址。
statistics選項
如果在ip addr flush命令中使用了-statistics選項,命令將輸出更為詳盡的信息。輸出的信息包括刪除地址的數目和清理地址列表的圈數。如果使用了兩次-s選項,ip addr flush會按照上節敘述的格式輸出所有被刪除的地址。
示例
刪除屬於私網10.0.0.0/8的所有地址:
worker:~ # ip -s -s address flush to 192/8
Nothing to flush.
worker:~ # ip -s -s a f to 10/8
2: dummy inet 10.7.7.7/16 brd 10.7.255.255 scope global dummy
3: eth0 inet 10.10.7.7/16 brd 10.10.255.255 scope global eth0
4: eth1 inet 10.8.7.7/16 brd 10.8.255.255 scope global eth1
*** Round 1,deleting 3 addresses ***
*** Flush is complete after 1 round ***
worker:~ #
取消所有乙太網卡的IP地址
worker:~ # ip -4 addr flush label "eth0"
最後一個例子是對IPv6地址的操作。在啟動了轉發或者關閉了自動配置之後,你需要取消通過無狀態地址自動配置獲得的主機地址:
worker:~ # ip -6 addr flush dynamic
1.5. ip neighbour--neighbour/arp表管理命令
縮寫 neighbour、neighbor、neigh、n
對象 鄰接(neighbour)對象實現同一網段協議地址和鏈路層地址的綁定。在內核中,這些條目被組織到表中。IPv4的相鄰表也被叫做ARP表。
ip neighbour命令支持對條目及其屬性的顯示、添加和刪除。
命令 add、change、replace、delete、fulsh、show(或者list)
附錄B將詳細描述如何使用ip管理代理ARP/NDISC。
ip neighbour add -- 添加一個新的鄰接條目
ip neighbour change--修改一個現有的條目
ip neighbour replace--替換一個已有的條目
縮寫:add、a;change、chg;replace、repl
簡介:這三個命令用來建立一個鄰接表的條目或者更新現有的鄰接表條目。
參數
-
to ADDRESS(default) 相鄰的協議地址。可以是IPv4或者IPv6。
-
dev NAME 和相鄰節點連接的設備。
-
lladdr LLADDRESS 鄰居的鏈路層地址。LLADDRESS可以為空。
-
nud NUD_STATE 鄰接條目的狀態。nud是Neighbour Unreachability Detection的縮寫。可能的狀態包括:
-
- permanent--鄰接條目永遠有效並且只能由管理員刪除。
-
- noarp--鄰接條目有效,不必對其有效性進行確認。在其生命期期滿時會被刪除。
-
reachable--在超時時間之內,這個鄰接條目是有效的。
-
stale--這個鄰接條目是有效的,但是比較可疑。如果條目是有效的,ip neigh不會改變鄰接狀態,也不會修改其地址。
示例
在設備eth0上,為地址10.0.0.3添加一個permanent ARP條目:
worker:~ # ip neighbour add 10.0.0.3 lladdr 0:0:0:0:0:1 dev eth0 nud permanent
ip neigh add 10.0.0.3 lladdr 0:0:0:0:0:1 dev eth0 nud perm
把狀態改為reachable
ip neigh chg 10.0.0.3 dev eth0 nud reachable
1.5.1. ip neighbour delete--刪除一個鄰接條目
縮寫:delete、del、d
簡介
這個命令用來刪除一個鄰接條目
參數
這個命令的參數和ip neigh add命令的相同,只不過lladdr和nud將被忽略。
示例
刪除設備eth0上的一個ARP條目10.0.0.3
ip neigh del 10.0.0.3 dev eth0
執行了刪除命令之後,被刪除的條目不會馬上消失,它會在系統的下次垃圾收集時被刪除。如果被操作的條目正在使用,將不能被刪除。
警告
如果試圖刪除或者手工修改一個由內核建立的noarp條目,會導致一些不可預知的行為。
1.5.2. ip neighbour show--顯示網路鄰居的信息
縮寫:show、list、sh、ls
簡介
這個命令用於顯示網路鄰居信息。
參數
- to ADDRESS(default) 指定要顯示的地址
- dev NAME 只顯示設備NAME的鄰居
- unused 只顯示當前沒有使用的鄰居
- nud NUD_STATE 只列出處於NUD_STATE狀態的鄰接條目。NUD_STATE的值下麵將會介
紹。nud all表示所有的狀態。這個選項可以使用多次。如果缺少這個選項,ip會
列出除none和noarp狀態的所有條目。
輸出格式
worker:~ # ip neighbour show
10.160.xxx.xxx dev eth0 lladdr 48:f8:db:d2:46:02 STALE
10.160.xxx.xxx dev eth0 lladdr 00:00:5e:00:01:04 REACHABLE
fe80::216:3eff:fed3:4e33 dev eth0 lladdr 00:16:3e:d3:4e:33 router STALE
fe80::216:3eff:fe47:ad29 dev eth0 lladdr 00:16:3e:47:ad:29 router STALE
worker:~ # ip neighbour show dev eth0
10.160.xxx.xxx lladdr 48:f8:db:d2:46:02 STALE
10.160.xxx.xxx lladdr 00:00:5e:00:01:04 REACHABLE
fe80::216:3eff:fed3:4e33 lladdr 00:16:3e:d3:4e:33 router STALE
fe80::216:3eff:fe47:ad29 lladdr 00:16:3e:47:ad:29 router STALE
worker:~ # ip neighbour ls
10.160.xxx.xxx dev eth0 lladdr 48:f8:db:d2:46:02 STALE
10.160.xxx.xxx dev eth0 lladdr 00:00:5e:00:01:04 REACHABLE
fe80::216:3eff:fed3:4e33 dev eth0 lladdr 00:16:3e:d3:4e:33 router STALE
fe80::216:3eff:fe47:ad29 dev eth0 lladdr 00:16:3e:47:ad:29 router STALE
worker:~ #
每行的第一部分是網路鄰居的協議地址。第二部分是設備名。省下的部分是這個鄰接條目的信息。
lladdr是這個設備的鏈路層地址。
nud是條目代表連接的狀態。下麵是狀態的完整列表和簡單描述:
- none 網路鄰居的狀態為空。
- incomplete 這個鄰居正在被解析。
- reachable 網路鄰居有效並且可達。
- stale 鄰居有效,但是可能不可達。因此,內核將在首次傳輸時進行檢查。
- delay 一個數據包已經發到處於stale的網路鄰居,內核在等待應答信息。
- probe delay計時器過期,還沒有收到確認信息。內核開始使用ARP/NDISC消息包探測這個網路鄰居。
- failed 解析失敗。
- noarp 網路鄰居有效,不必檢查。
- permanent 這是一個noarp條目,只有系統管理員可以從鄰接表中把它刪除。
在這些狀態中,除了none、faliled和incomplete.
IPVv6網路鄰居可以有一個叫做router的標誌,它表示這個節點是一個IPv6路由器。
- -statistics
-statistics選項可以顯示很多有用的信息。例如:
worker:~ # ip -s n ls 10.160.xxx.xxx
10.160.xxx.xxx dev eth0 lladdr 00:16:3e:8a:8b:9e ref 1 used 2/2/2 probes 4 REACHABLE
worker:~ #
輸出信息裡面多了ref和用斜缸分開的三個時間。ref表示有多少用戶使用這個條目;三個時間分別是使用時間、確認時間和刷新時間。因此,上面輸出中的時間表示:
條目12秒之前剛剛使用過;
13秒之前被確認;
20秒之前被更新。
1.5.3. ip neighbour flush--清除鄰接條目
縮寫:flush、f
簡介
這個命令用來清除符合某個條件的鄰接表條目。
參數
這個命令的參數和ip neigh sh相同。不同之處是,如果沒有參數,它什麼也不會做。而且,預設情況下,被刪除的條目不包括處於permanent和noarp狀態的條目。
-statistics
使用了-statistics選項,這個命令的輸出將更為詳盡。它會輸出刪除的條目數和清除鄰接表遍歷的次數。如果使用了兩個-s選項,命令的輸出將包括被刪除條目的信息。
示例
worker:~ # ip -s -s neighbour flush 10.160.xxx.xxx
10.160.xxx.xxx dev eth0 lladdr 00:16:3e:8a:8b:9e used 101/101/75 probes 4 STALE
*** Round 1, deleting 1 entries ***
*** Flush is complete after 1 round ***
worker:~ #
1.6. 路由表管理
縮寫:route、ro、r
對象
路由條目保存在內核的路由表中,它們包含尋找到其它網路節點的路徑信息。路由表條目都包括一對網路地址/掩碼長度以及可選的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}來標記每個路由。
1.6.1. 路由屬性
路由條目提供IP數據包投遞所需的路由信息、數據(例如:輸出設備、下一跳的路由器)和一些可選屬性(例如:路徑的最大傳輸單元MTU或者源地址等)。這些屬性將在後面的章節詳細介紹。
1.6.2. 路由類型
路由的設置以及其它的可選屬性都依賴於路由類型。最重要的路由類型是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 使用多播路由。在普通的路由表中,這種路由並不存在。
1.6.3. 路由表
從Linux-2.2開始,內核把路由歸納到許多路由表中,這些表都進行了編號,編號數字的範圍是1到255。另外,為了方便,還可以在/etc/iproute2/rt_tables中為路由表命名。預設情況下,所有的路由都會被插入到表main(編號254)中。在進行路由查詢時,內核只使用路由表main。
實際上,還有另外一個路由表也一直存在,這個表是不可見的,而且極為重要。這就是表local。這個表保存本地和廣播路由。內核會自動維護這個路由表,通常系統管理員沒有必要對它進行修改,甚至不必看到。
在使用策略路由(policy routing)時,我們將使用多個路由。在這種情況下,表識別符有很多參數,因此需要使用{prefix,tos,preference}的形式唯一地識別每個路由。
1.6.4. 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.65
ip route add 10.0.0/24 via 193.233.7.65
修改到網路10.0.0/24的直接路由,使其經過設備dummy
ip 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
1.6.5. 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
1.6.6. 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 79010
kuznet@amber:~ $
計算路由緩存裡面的條數,由於被緩存路由的屬性可能大於一行,以此需要使用
-o選項
uznet@amber:~ $ ip -o route list cloned |wc
159 2543 18707
kuznet@amber:~ $
輸出格式
通常,在這個命令輸出的信息中,每個路由紀錄占一行。不過,有時某些紀錄可能會超過一行,例如被克隆出來的路由或者包含一些額外的信息。如果在命令中使用了-o選項,在每個紀錄中,會使用代替回車作為回行標記。例如:
[root@node01 ~]# ip route show 192.168.2.1/24
192.168.2.0/24 dev eth0 proto kernel scope link src 192.168.2.161
[root@node01 ~]#
如果是列出被克隆的條目,輸出信息將是另外的形式。例如:
kuznet@amber:~ $ ip route list 193.233.7.82 tab cache
193.233.7.82 from 193.233.7.82 dev eth0 src 193.233.7.65 realms inr.ac/inr.ac
cache <src-direct,redirect> mtu 1500 rtt 300 iif eth0
193.233.7.82 dev eth0 src 193.233.7.65 realms inr.ac
cache mtu 1500 rtt 300
kuznet@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 自從建立這個路由以來,它被查詢的次數。
1.6.7. 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 cache
3ffe:2400::220:afff:fef4:c5d1 via 3ffe:2400::220:afff:fef4:c5d1
dev eth0 metric 0
cache used 2 age 12sec mtu 1500 rtt 300
3ffe:2400::280:adff:feb7:8034 via 3ffe:2400::280:adff:feb7:8034
dev eth0 metric 0
cache used 2 age 15sec mtu 1500 rtt 300
3ffe: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 300
3ffe: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 300
3ffe: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 300
ff02::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 cache
Nothing to flush.
netadm@amber:~ #
# 第三個例子是在gated程式掛掉之後,清除所有的BGP路由:
netadm@amber:~ # ip ro ls proto gated/bgp |wc
1408 9856 78730
netadm@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/bgp
Nothing to flush.
netadm@amber:~ # ip ro ls proto gated/bgp
netadm@amber:~ #
1.6.8. 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.82
193.233.7.82 dev eth0 src 193.233.7.65 realms inr.ac
cache mtu 1500 rtt 300
kuznet@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 eth0
193.233.7.82 from 193.233.7.82 dev eth0 src 193.233.7.65
realms inr.ac/inr.ac
cache <src-direct,redirect> mtu 1500 rtt 300 iif eth0
kuznet@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 eth0
multicast 224.2.127.254 from 193.233.7.82 dev lo
src 193.233.7.65 realms inr.ac/cosmos
cache <mc> iif eth0 Oifs: eth1 pimreg
kuznet@amber:~ $
下麵我們舉一個複雜一些的例子。我們首先為一個目標地址添加一個無效的網關路由,而實際上和這個地址是直連的。
netadm@alisa:~ # ip route add 193.233.7.98 via 193.233.7.254
netadm@alisa:~ # ip route get 193.233.7.98
193.233.7.98 via 193.233.7.254 dev eth0 src 193.233.7.90
cache mtu 1500 rtt 3072
netadm@alisa:~ #
然後,我們ping一下193.233.7.98:
netadm@alisa:~ # ping -n 193.233.7.98
PING 193.233.7.98 (193.233.7.98) from 193.233.7.90 : 56 data bytes
From 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 ms
From 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 ms
64 bytes from 193.233.7.98: icmp_seq=2 ttl=255 time=0.4 ms
64 bytes from 193.233.7.98: icmp_seq=3 ttl=255 time=0.4 ms
64 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 loss
round-trip min/avg/max = 0.4/1.3/3.5 ms
netadm@alisa:~ #
輸出結果可以看出,路由器193.233.7.254知道有更好的路由,因此送回一個ICMP重定向信息。然後,我們再看看路由表的情況:
netadm@alisa:~ # ip route get 193.233.7.98
193.233.7.98 dev eth0 src 193.233.7.90
cache <redirected> mtu 1500 rtt 3072
netadm@alisa:~ #
1.7. ip route -- 路由策略資料庫管理命令
縮寫:rule、ru
對象
路由策略資料庫的規則用於控制選擇路由的演算法。
Internet上採用的路由演算法一般是基於數據包目的地址的。理論上,也可以由TOS域決定,不過這沒有實際應用。要瞭解經典路由演算法的詳細情況請參考RFC-1812。
而在某些情況下,我們不只是需要通過數據包的目的地址決定路由,可能還需要通過其他一些域:源地址、IP協議、傳輸層埠甚至數據包的負載。這就叫做:策略路由(policy routing)。
註意:策略路由(policy routing)不等於路由策略(rouing policy)。
在這種情況下,傳統的基於目的地址的路由表就無法滿足要求了,需要使用路由策略資料庫(routing policy database,RPDB)代替,通過它選擇執行某些路由。
這些規則可以由很多不同的狀態,而且它們沒有天生的次序,要由系統管理員決定。RPDB可以匹配以下的域:
- 數據包的源地址;
- 數據包的目的地址;
- 服務類型(Type of Service);
- 進入的網路介面;
匹配IP協議和傳輸層埠也是可能的,不過這要依靠iptables或者ipchains通過fwmark為某些數據包做標記,並重定向。
每個路由策略由一個選擇符(selector)和一個操作(action)組成。系統按照順序搜索路由策略資料庫,把選擇符和{源地址、目的地址、進入介面、tos、fwmark}等關鍵詞進行匹配,如果匹配成功,就執行action定義的操作。操作或者成功返回,或者失敗並且中止對路由策略。否則,系統繼續查詢路由策略資料庫。
操作如何定義?最原始的操作是選擇下一跳(nexthop)和輸出設備(output device)。Cisco IOS使用這種方式,我們姑且把這叫做匹配並設置(match & set)。而Linux的方式則更為靈活,Linux允許的操作包括:基於目的地址的路由表查詢以及按照最長匹配的原則從路由表中選擇路由。因此,匹配並設置(match & set)的方式只是一個最簡單的特例而已。
在系統啟動時,內核會為路由策略資料庫配置三條預設的規則:
優先順序 | 選擇符 | 操作 | 解釋 |
---|---|---|---|
0 | 匹配任何條件 | 查詢路由表local(ID 255) | 路由表local是一個特殊的路由表,包含對於本地和廣播地址的高優先順序控制路由。rule 0非常特殊,不能被刪除或者覆蓋。 |
32766 | 匹配任何條件 | 查詢路由表main(ID 254) | 路由表main(ID 254)是一個通常的表,包含所有的無策略路由。系統管理員可以刪除或者使用另外的規則覆蓋這條規則。 |
32767 | 匹配任何條件 | 查詢路由表default(ID 253) | 路由表default(ID 253)是一個空表,它是為一些後續處理保留的。對於前面的預設策略沒有匹配到的數據包,系統使用這個策略進行處理。這個規則也可以刪除。 |
不要混淆路由表和策略:規則指向路由表,多個規則可以引用一個路由表,而且某些路由表可以沒有策略指向它。如果系統管理員刪除了指向某個路由表的所有規則,這個表就沒有用了,但是仍然存在,直到裡面的所有路由都被刪除,它才會消失。
1.7.1. 規則類型
路由策略規則資料庫可以包括如下類型的規則:
- unicast 返回從被引用的路由表中發現的路由
- blackhole 丟棄數據包,不做任何反應
- unreachable 產生網路不可達(Network is unreachable)的ICMP錯誤信息
- prohibit 產生通訊被禁止(Communication is administratively prohibited)的ICMP錯誤信息
- nat 把數據報的源地址轉換為其它的值。詳情請參考附錄C
1.7.2. 命令
add、delete、show(或者list)
1.7.3. ip rule add -- 插入新的規則
ip rule delete -- 刪除規則
縮寫:add、a;delete、del、d
參數
- type TYPE(default) 這個規則的類型。有效的類型上一節已經介紹過了。
- from PREFIX 匹配的源地址
- iif NAME 選擇數據包進入的設備。如果介面是迴環設備,這個規則就只匹配源於本機的數據包。這意味著,你可以為本機發出的數據包和要轉發的數據包分別建立路由表,使兩者完全隔離。
- tos TOS或者dsfield TOS 選擇匹配的TOS值
- fwmark MARK 選擇要匹配的fwmark值
- priority PREFERENCE 設置這個規則的優先順序。每個規則的優先順序都應該明確設置為一個唯一的數值。實際上,由於歷史的原因,ip roule add命令無需任何優先順序的值,也不必是唯一的。如果用戶沒有在命令中提供優先順序的值,內核會自動選擇。如果用戶提供的優先順序值已經存在,內核也不會拒絕這次請求,而是在相同優先順序的規則前面插入新的規則。
- table TABLEID 如果規則選擇符匹配,就被查詢的路由表識別符。
- realms FROM/TO 如果規則匹配和路由表查詢成功,選擇的realms值。
- nat ADDRESS 設置要進行網路地址轉換的IP地址段。ADDRESS或者是進行網路地址轉換ip地址段,或者是一個本機地址,甚至可以是0。
警告
使用上面兩個命令對路由策略資料庫進行的任何修改都不會馬上生效。只有使用ip route flush cach命令刷新路由緩存之後才會生效。
示例
通過路由表inr.ruhep路由來自源地址為192.203.80/24的數據包
ip ru add from 192.203.80/24 table inr.ruhep prio 220
把源地址為193.233.7.83的數據報的源地址轉換為192.203.80.144,並通過表1進行路由
ip ru add from 193.233.7.83 nat 192.203.80.144 table 1 prio 320
刪除無用的預設規則
ip ru del prio 32767
1.7.4. ip rule show -- 列出路由規則
縮寫:show、list、sh、ls、l
參數
好消息,這個命令沒有參數。
輸出格式
kuznet@amber:~ $ ip ru ls
0: from all lookup local
200: from 192.203.80.0/24 to 193.233.7.0/24 lookup main
210: from 192.203.80.0/24 to 192.203.80.0/24 lookup main
220: from 192.203.80.0/24 lookup inr.ruhep realms inr.ruhep/radio-msu
300: from 193.233.7.83 to 193.233.7.0/24 lookup main
310: from 193.233.7.83 to 192.203.80.0/24 lookup main
320: from 193.233.7.83 lookup inr.ruhep map-to 192.203.80.144
32766: from all lookup main
kuznet@amber:~ $
- 每行第一部分的數字是規則的優先順序,接著是選擇符。
- 關鍵詞lookup後面接著路由表識別符。
- 如果規則要進行網路地址轉換,還需要一個關鍵詞map-to設置轉換以後的地址。
上面的示例非常簡單,192.203.80.0/24和193.233.7.0/2