棄用 ifconfig 吧,你值得收藏的 IpRoute2 簡明指南

Linksla發表於2022-11-28

前言

最近想學習一下 iproute2 的用法,Google 搜尋後發現了這篇排名靠前的文章。本文是自己基於對原文理解的意譯,如有問題,歡迎大家指出。

介紹

在管理 Linux 伺服器和排查網路問題時,熟悉一些基本的網路工具是很有幫助的。這些工具中的一部分最初是為了檢視網路狀態而編寫的,但其中也包含了一些可以用來管理和配置網路連線的底層工具。
一直以來,這些互不相關的網路工具被打包在一起釋出,它們被統稱為  net-tools 。雖然  net-tools  工具包提供了相當完善的功能,但是包內工具的開發卻是相互獨立的,它們的使用方式也各不相同。
由於  net-tools  包內工具的使用方式大相徑庭,並且包內的部分工具也已經停止維護,因此使用名為  iproute2  的新工具包來替換原來  net-tools iproute2  包內的各個工具被統一開發維護,並且他們之間的使用方式也非常相似。另外,這些工具也可以很好地互相配合一起使用。
在本篇文章中,我們將會討論如何使用  iproute2  來對你的網路進行配置、維護和資訊檢視。我們將會使用 Ubuntu 12.04 VPS 來進行演示,不過大多數其它現代 Linux 發行版都提供了相同的功能。
雖然查詢指令可以在非特權模式(非 root)下執行,不過在修改網路配置時,大多數情況下還是需要 root 許可權的。

如何檢視網路介面、地址、路由

iproute2 工具包最基礎的功能就是管理本機的網路介面。

一般來說,本機的網路介面通常會被命名成像是  eth0 eth1 lo  這樣的名稱。在過去,常常使用  net-tools  包提供的  ifconfig  命令來配置網路介面。而使用  iproute2  時,通常可以使用子命令  ip addr  和  ip link  來完成相同的功能。

使用 ifconfig 時,你可以透過輸入不帶引數的如下命令來檢視本機當前所有網路介面的狀態:

ifconfig
eth0     Link encap:Ethernet  HWaddr 54:be:f7:08:c2:1b           inet addr:192.168.56.126  Bcast:192.168.56.255  Mask:255.255.255.0         inet6 addr: fe80::56be:f7ff:fe08:c21b/64 Scope:Link         UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1         RX packets:114273 errors:0 dropped:0 overruns:0 frame:0         TX packets:58866 errors:0 dropped:0 overruns:0 carrier:0         collisions:0 txqueuelen:1000          RX bytes:73490903 (73.4 MB)  TX bytes:14294252 (14.2 MB)         Interrupt:20 Memory:f7f00000-f7f20000 lo       Link encap:Local Loopback           inet addr:127.0.0.1  Mask:255.0.0.0         inet6 addr: ::1/128 Scope:Host         UP LOOPBACK RUNNING  MTU:65536  Metric:1         RX packets:3942 errors:0 dropped:0 overruns:0 frame:0         TX packets:3942 errors:0 dropped:0 overruns:0 carrier:0         collisions:0 txqueuelen:0          RX bytes:668121 (668.1 KB)  TX bytes:668121 (668.1 KB)

如果想要檢視某個特定網路介面的資訊,你可以將網路介面名稱作為引數傳給 ifconfig:

ifconfig eth0
eth0      Link encap:Ethernet  HWaddr 54:be:f7:08:c2:1b            inet addr:192.168.56.126  Bcast:192.168.56.255  Mask:255.255.255.0          inet6 addr: fe80::56be:f7ff:fe08:c21b/64 Scope:Link          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1          RX packets:114273 errors:0 dropped:0 overruns:0 frame:0          TX packets:58866 errors:0 dropped:0 overruns:0 carrier:0          collisions:0 txqueuelen:1000           RX bytes:73490903 (73.4 MB)  TX bytes:14294252 (14.2 MB)          Interrupt:20 Memory:f7f00000-f7f20000

使用 iproute2 包提供的子命令,我們可以實現相同的功能。

如果想要檢視每個網路介面被配置的地址,可以輸入不帶引數的 ip addr 命令:

ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN     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 forever2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000    link/ether 54:be:f7:08:c2:1b brd ff:ff:ff:ff:ff:ff    inet 192.168.56.126/24 brd 192.168.56.255 scope global eth0       valid_lft forever preferred_lft forever    inet6 fe80::56be:f7ff:fe08:c21b/64 scope link        valid_lft forever preferred_lft forever

如果想要檢視某個特定網路介面的地址資訊,你可以使用如下格式的命令:

ip addr show eth0

    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000    link/ether 54:be:f7:08:c2:1b brd ff:ff:ff:ff:ff:ff    inet 192.168.56.126/24 brd 192.168.56.255 scope global eth0       valid_lft forever preferred_lft forever    inet6 fe80::56be:f7ff:fe08:c21b/64 scope link        valid_lft forever preferred_lft forever

    事實上, ip addr  只是  ip addr show  命令的別名。

    如果你只關心網路介面本身,而不在意它們被配置的地址,那麼你可以使用 ip link 子命令:

    ip link
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN     link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:002: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000    link/ether 04:01:13:8a:a2:01 brd ff:ff:ff:ff:ff:ff

    如果想要檢視某個特定網路介面的資訊,那麼你可以新增關鍵字 show 和對應網路介面的名字:

    ip link show eth0

    如果想要獲得網路介面如何通訊的統計資料,那麼你可以給  link  子命令傳入  -s  選項:

    ip -s link show eth0
    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000    link/ether 04:01:13:8a:a2:01 brd ff:ff:ff:ff:ff:ff    RX: bytes  packets  errors  dropped overrun mcast       853144     14672    0       0       0       0          TX: bytes  packets  errors  dropped carrier collsns     91257      537      0       0       0       0

    那麼我們如何找到我們的路由表呢?路由表包含了到達其他網路地址的路徑資訊,我們可以透過輸入以下內容來列印當前的路由表:

    ip route show
    default via 107.170.58.1 dev eth0  metric 100107.170.58.0/24 dev eth0  proto kernel  scope link  src 107.170.58.162

    這條命令的輸出內容告訴我們,通往更大網際網路的預設路由是透過 eth0 介面到達地址為 107.170.58.1 的閘道器。透過 eth0 介面可以訪問地址為 107.170.58.1 的閘道器,並且 eth0 介面自身的 ip 地址是 107.170.58.162。

    如何配置網路介面和地址

    既然你已經熟悉瞭如何獲取網路介面資訊和與它們關聯的地址資訊,那麼下一步就應該是瞭解如何修改網路介面的狀態了。

    首先需要了解如何配置介面本身。你仍然可以使用 ip link 子命令,不過這次你需要傳入  set  而不是  show  來修改配置。

    例如,我們可以透過使用以下命令來開啟或關閉網路介面:

    ip link set eth1 upip link set eth1 down

    注意:當心不要意外關閉了你正連線的 VPS 的網路介面!

    你也可以使用 ip link 子命令來配置網路介面的屬性。比如,如果你想開啟或關閉網路介面的多播標誌,你可以輸入:

    ip link set eth1 multicast onip link set eth1 multicast off

    你也可以輸入如下的命令來修改 MTU 和分組佇列的長度:

      ip link set eth1 mtu 1500ip link set eth1 txqueuelen 1000

      如果你正配置的網路介面是關閉(down)狀態,那麼你可以修改網路介面的名稱和與之關聯的 arp 標誌:

      ip link set eth1 name eth10ip link set eth1 arp on

      如果要修改網路介面的地址,那麼我們可以再次使用 ip addr 子命令。

      透過輸入以下命令我們可以為網路介面新增一個地址:

      ip addr add IPADDRESS/NETPREFIX brd + dev INTERFACE

      該命令的  brd +  部分會自動設定廣播地址。每個網路介面都可以新增多個地址而不會出現任何問題。

      我們也可以執行相反的操作來刪除網路地址。要刪除指定網路介面的某個地址,可以使用如下命令:

        ip addr del IPADDRESS/NETPREFIX dev INTERFACE

        你也可以省略輸入地址,這樣與該網路介面關聯的第一個被列出的地址將被刪除。

        透過使用 ip route [add | change | replace | delete ] 語法,你也可以刪除路由規則。但我們不會在這裡介紹,因為大多數人不會定期對此進行調整。

        IpRoute2 的其他功能

        IPRoute2 還具有一些其他功能,不過我們將不會在本教程中進行深入討論。相反,我們將討論這些是什麼,以及在什麼情況下你可能會發現它們有用。
        IP 路由規則(rule)的概念很難談論,因為它非常依賴於具體的情況。基本上,你可以基於多個欄位(包括目標地址,源地址,路由協議,資料包大小等)來決定如何路由流量。
        我們使用 ip rule 子命令使用此功能。基本查詢命令遵循和其他子命令一樣的語法:

        ip rule show

          0:  from all lookup local 32766:  from all lookup main 32767:  from all lookup default
          這三條路由規則是核心配置的預設規則。第一行可以匹配任何流量,用於路由高優先順序的流量。第二行是處理常規路由的主要規則。最後一行是空規則,如果上面的規則與資料包不匹配,則使用該行進行後處理(post-processing)。
          由 IPRoute2 配置的路由規則被儲存在路由策略資料庫(routing policy database)中。透過與規則集合進行匹配來選擇該資料庫中的路由策略。我們可以使用適當的操作來新增或刪除規則。但是,你不應該在不知道自己在做什麼的情況下執行這些操作。
          可以透過  man  檢視 ip rule 的手冊來進行進一步的學習。

          man ip         # search for "ip rule"

          我們將簡要討論的另一件事是透過這些工具來處理 arp 資訊。處理這些資訊的子命令被稱作 ip neigh。

          ip neigh
          107.170.58.1 dev eth0 lladdr 00:00:5e:00:01:68 DELAY

          預設情況下,這裡至少應列出你的閘道器。ARP(Address Resolution Protocol)是地址解析協議的縮寫,它可以透過 IP 地址來獲取 MAC 地址。
          基本上,每當需要轉發 IP 分組時,你的主機就會在本地網路上廣播 ARP 請求,向網路中的其他主機詢問誰擁有這個 IP 地址。擁有這個 IP 地址的主機將把自己的 MAC 地址回覆給詢問者,然後詢問者就知道該把 IP 分組發給誰了。詢問者會把 IP 地址到 MAC 地址的對映快取到本地(一般持續 15 分鐘),這樣後續的分組在需要轉發時就不需要再次透過 ARP 請求詢問了。

          結語

          現在,你應該對如何使用 iproute2 包中的工具有了一個很好的瞭解了。

          儘管許多指南和教程仍然引用舊的 net-tools 工具包,部分原因是有經驗的系統管理員過去經常使用舊的工具包,但本指南中討論的命令將在未來幾年內逐步替代 net-tools 工具。

          重要的是,現在你必須熟悉這些命令,然後才能在已切換到這些命令的系統上解決網路問題(Arch Linux 早在 2011 年就已經完全切換到了新工具)。新工具用法更加一致,你可以指望在所有命令中都可以使用類似的用法。你使用這些命令的次數越多,它們對你而言就越自然。

          By Justin Ellingwood.


          來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70013542/viewspace-2925436/,如需轉載,請註明出處,否則將追究法律責任。

          相關文章