Linux命令示例記錄-20230313【持續更新中】

来源:https://www.cnblogs.com/shihanyi/archive/2023/03/13/17211611.html
-Advertisement-
Play Games

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

對象 link由網路設備,對應的命令顯示以及設備的狀態變化組成。
命令 set和show(或者list)

縮寫: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

縮寫: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

RXTX分別是接收和發送統計信息的開頭。得到的統計信息包括:

  • 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

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 什麼是Git? Git是一個版本控制系統,用於跟蹤電腦文件的變化。Git是一個跟蹤電腦文件變化的版本控制系統,用於幫助協調一個項目中幾個人的工作,同時跟蹤一段時間的進展。換句話說,我們可以說它是一個促進軟體開發中源代碼管理的工具。 Git和SVN的區別 Git是分散式版本控制系統,SVN是集中式 ...
  • 廣發基金外包面試題 說說Spring AOP 說說stream流的常用API 線程池的參數 MCVV,什麼是普通讀和快照讀 redis分片模式是什麼,redis事務,分片模式下事務會生效嗎 說說rocket mq分散式事務是怎麼做的 為什麼要劃分session,怎麼解決耦合問題 說說是怎麼解決分散式 ...
  • 最近接到一個新的需求,需要上傳2G左右的視頻文件,用測試環境的OSS試了一下,上傳需要十幾分鐘,再考慮到公司的資源問題,果斷放棄該方案。 一提到大文件上傳,我最先想到的就是各種網盤了,現在大家都喜歡將自己收藏的「小電影」上傳到網盤進行保存。網盤一般都支持斷點續傳和文件秒傳功能,減少了網路波動和網路... ...
  • 1. 垃圾回收器 1.1. 對象可以在被需要時創建,不再使用時由JVM自動回收 1.2. GC是查找不再使用的對象,然後回收這些對象相關記憶體的過程 1.2.1. 找到不使用的對象、回收其記憶體、壓縮堆記憶體 1.3. 優化垃圾回收器比跟蹤指針引起的bug要容易得多(且耗時更少) 1.4. VM必須定期搜 ...
  • 簡介 Dapper是介於Entity framework與ADO的折中選擇。既滿足手寫查詢的高性能需求,又簡化了資料庫對象映射為記憶體對象的繁雜工作。Dapper.Contrib是對Dapper的進一步封裝,使對象的基本增刪改查等操作進一步簡化。 為什麼使用Dapper.Contrib 如果僅僅使用D ...
  • 在運行期間,我們可以使用 `Emit` 來組織一段 IL 代碼,進而動態生成一個方法,甚至是一個程式集(包括類型、方法或屬性等等)。這個過程我們稱之為動態編織。這一項技術應用比較廣泛,比如數據映射(Dapper)、動態代理(AOP)等等,目的是提升大量反射而產生的性能問題。 ...
  • Blazor Server,即運行在伺服器上的 Blazor 應用程式,它的優點是應用程式在首次運行時,客戶端不需要下載運行時。但它的代碼是在伺服器上執行的,然後通過 SignalR 通信來更新客戶端的 UI,所以它要求必須建立 Web Socket 連接。 用於 Blazor 應用的 Signal ...
  • 前言 假設你正在玩一款線上多人游戲,在游戲中,有多個角色需要進行不同的操作,例如攻擊、移動、釋放技能等等。 接下來,我們用玩游戲的例子,來解釋進程和和線程的概念,以及進程和線程的區別。 進程的基本概念 我們可以將整個游戲看作一個進程,它是操作系統中資源分配的基本單位,擁有自己的地址空間、記憶體、CPU ...
一周排行
    -Advertisement-
    Play Games
  • 前言 在我們開發過程中基本上不可或缺的用到一些敏感機密數據,比如SQL伺服器的連接串或者是OAuth2的Secret等,這些敏感數據在代碼中是不太安全的,我們不應該在源代碼中存儲密碼和其他的敏感數據,一種推薦的方式是通過Asp.Net Core的機密管理器。 機密管理器 在 ASP.NET Core ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 順序棧的介面程式 目錄順序棧的介面程式頭文件創建順序棧入棧出棧利用棧將10進位轉16進位數驗證 頭文件 #include <stdio.h> #include <stdbool.h> #include <stdlib.h> 創建順序棧 // 指的是順序棧中的元素的數據類型,用戶可以根據需要進行修改 ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • C總結與剖析:關鍵字篇 -- <<C語言深度解剖>> 目錄C總結與剖析:關鍵字篇 -- <<C語言深度解剖>>程式的本質:二進位文件變數1.變數:記憶體上的某個位置開闢的空間2.變數的初始化3.為什麼要有變數4.局部變數與全局變數5.變數的大小由類型決定6.任何一個變數,記憶體賦值都是從低地址開始往高地 ...
  • 如果讓你來做一個有狀態流式應用的故障恢復,你會如何來做呢? 單機和多機會遇到什麼不同的問題? Flink Checkpoint 是做什麼用的?原理是什麼? ...
  • C++ 多級繼承 多級繼承是一種面向對象編程(OOP)特性,允許一個類從多個基類繼承屬性和方法。它使代碼更易於組織和維護,並促進代碼重用。 多級繼承的語法 在 C++ 中,使用 : 符號來指定繼承關係。多級繼承的語法如下: class DerivedClass : public BaseClass1 ...
  • 前言 什麼是SpringCloud? Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的開發便利性簡化了分散式系統的開發,比如服務註冊、服務發現、網關、路由、鏈路追蹤等。Spring Cloud 並不是重覆造輪子,而是將市面上開發得比較好的模塊集成進去,進行封裝,從 ...
  • class_template 類模板和函數模板的定義和使用類似,我們已經進行了介紹。有時,有兩個或多個類,其功能是相同的,僅僅是數據類型不同。類模板用於實現類所需數據的類型參數化 template<class NameType, class AgeType> class Person { publi ...
  • 目錄system v IPC簡介共用記憶體需要用到的函數介面shmget函數--獲取對象IDshmat函數--獲得映射空間shmctl函數--釋放資源共用記憶體實現思路註意 system v IPC簡介 消息隊列、共用記憶體和信號量統稱為system v IPC(進程間通信機制),V是羅馬數字5,是UNI ...