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

前言

最近想學習一下 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: 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: 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: 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: mtu 65536 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:002: eth0: 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: 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。