iproute2 是用來檢查與設定 Linux 核心網路堆疊的標準使用者空間工具套件。此套件 涵蓋連結、位址、路由、鄰居、隧道、流量控制、socket、硬體卸載及數種專用網路 子系統。多數命令透過 Netlink 訊息與核心交換資料;它們並不實作轉送封包的資料 平面。
專案會為每個 Linux 核心版本發布一個對應版本。相符版本會提供同一代核心介面, 不過,只要不要求核心不支援的功能,較新版 iproute2 也能搭配較舊的核心運作。
Linux 使用者空間網路管理史 #
Linux 網路管理採分層方式發展。低階公用程式修改執行中的核心狀態,而設定框架與 daemon 則決定應保留哪些狀態,以及何時套用。
| 時期 | 軟體 | 角色與歷史意義 |
|---|---|---|
| 1990 年代初期 | 衍生自 BSD 的命令與 net-tools | ifconfig、route、arp 與 netstat 等個別命令,成為 Linux 管理連結、IPv4 位址、路由、鄰居項目與統計資料的慣用介面。其介面高度依賴網路 ioctl 與 /proc,因此無法表示許多後來加入的核心功能。 |
| 1990 年代起 | 發行版網路指令碼與 ifupdown | Debian 的 /etc/network/interfaces 及發行版特有的網路指令碼等檔案,在低階命令之上加入持久設定。ifup 與 ifdown 描述介面生命週期,但它們是協調工具而非核心 API。 |
| 1990 年代末期起 | iproute2 | Alexey Kuznetsov 在核心的進階路由、流量控制及 RTnetlink 工作發展期間建立了 iproute2。ip 整合 ifconfig、route、arp 與 iptunnel 所呈現的物件模型;ss 與 tc 則涵蓋 socket 檢查與流量控制。Netlink 可擴充且以訊息為基礎的介面,讓此套件得以跟進新的核心功能。 |
| 2004 年起 | NetworkManager | NetworkManager 引入長時間執行的連線管理程式,用於動態有線、Wi-Fi、行動網路及 VPN 連線。連線設定檔表示期望狀態,而 nmcli、nmtui 與圖形化用戶端則控制 daemon。 |
| 2014 年起 | systemd-networkd | systemd 210 加入宣告式網路管理程式,著重於開機階段及持續管理的連結。.link、.netdev 與 .network 檔案定義命名、虛擬裝置、位址、路由及相關政策;networkctl 提供執行期檢查與控制。 |
| 2016 年起 | Netplan 與其他設定前端 | Netplan 加入 YAML 設定層,為 NetworkManager 或 systemd-networkd 產生設定。此類前端會標準化政策,但不會取代所選的網路管理 daemon,也不會取代其下的核心介面。 |
各世代會並存,因為它們解決不同問題。ip addr add 會立即變更執行中的核心,而
NetworkManager、systemd-networkd 或 ifupdown 擁有持久政策,之後可能取代該項
變更。除了診斷或刻意建立暫時狀態外,管理員應避免使用臨時的 ip 命令修改由
daemon 管理的介面。
封包篩選也有不同的發展脈絡:iptables 與 nft 設定的是 Netfilter,而不是
iproute2 管理的路由與連結物件。
ip 物件模型
#
ip 採用 ip [options] object command 格式。主要物件對應至核心網路概念:
| 物件 | 用途 |
|---|---|
link | 檢查或設定網路裝置及鏈路層屬性 |
address | 管理 IPv4 與 IPv6 位址 |
route | 管理單播、多播及特殊路由 |
rule | 管理路由政策資料庫規則 |
neighbour | 管理 ARP 與 IPv6 鄰居探索項目 |
netns | 建立具名網路命名空間,並在其中執行操作 |
tunnel, l2tp, macsec | 設定隧道與安全連結類型 |
xfrm | 管理 IPsec 狀態與政策 |
nexthop | 管理可重複使用的下一跳物件與群組 |
mptcp | 管理 Multipath TCP 端點與限制 |
monitor | 串流輸出 RTnetlink 狀態變更 |
物件清單持續增加,因為 ip 是整合於單一執行檔背後的一組前端。ip help 列出
頂層物件,ip object help 則說明已安裝版本支援的命令。
iproute2 7.1.0 安裝的執行檔 #
上游版本封存檔包含原始碼,而非預先建置的二進位檔。下表列出
iproute2 7.1.0
上游 make install 規則安裝的所有命令名稱;撰寫本文時,此版本為最新版本。
發行版套件可能會拆分、省略、重新定位或修補這些命令。
| 命令 | 用途 | 建置或安裝附註 |
|---|---|---|
ip | 檢查與設定連結、位址、鄰居、路由、規則、命名空間、隧道及相關網路物件 | 核心命令 |
rtmon | 記錄 RTnetlink 的連結、位址、路由與鄰居事件,以供日後檢查 | 核心命令;ip monitor 提供部分重疊的互動功能 |
routel | 以欄式格式輸出路由表 | 安裝的 Python 指令碼 |
tc | 設定流量控制的佇列規則、類別、篩選器與動作 | 核心命令 |
bridge | 管理 bridge 連結、轉送資料庫、VLAN、多播資料庫與 bridge 連接埠狀態 | 核心命令 |
ss | 檢查 socket、協定狀態、擁有者、佇列、記憶體與診斷資料 | netstat socket 報告功能的後繼工具 |
nstat | 回報核心 SNMP 與協定計數器,包括相較於前一次呼叫的變化 | 核心統計命令 |
ifstat | 回報各介面的封包與位元組計數器 | 核心統計命令 |
rtacct | 從核心路由計量資料回報按 routing realm 分組的流量計數器 | 核心統計命令 |
lnstat | 定期回報透過 /proc/net/stat 匯出的指定計數器 | 一般統計命令 |
rtstat | 透過 lnstat 的相容模式回報路由快取統計資料 | 指向 lnstat 的符號連結 |
ctstat | 透過 lnstat 的相容模式回報連線追蹤統計資料 | 指向 lnstat 的符號連結 |
arpd | 維護使用者空間 ARP 快取,並從持久資料庫回應核心鄰居要求 | 僅在 Berkeley DB 相容標頭與函式庫可用時建置 |
genl | 查詢及呼叫 Generic Netlink family | 核心命令;主要用於協定開發與診斷 |
tipc | 設定與檢查 Transparent Inter-Process Communication bearer、連結、節點、socket 與命名空間 | libmnl 可用時建置 |
devlink | 設定與診斷裝置層級的網路資源、連接埠、韌體參數、健康狀態回報器、trap 與硬體速率 | libmnl 可用時建置 |
rdma | 檢查與設定 RDMA 裝置、連結、資源、系統設定及統計資料 | libmnl 可用時建置 |
dcb | 檢查與設定 Data Center Bridging 緩衝區、優先級、Priority Flow Control、ETS 及應用程式對應 | libmnl 可用時建置 |
vdpa | 管理 vDPA 管理裝置與虛擬資料路徑加速器裝置 | libmnl 可用時建置 |
netshaper | 檢查與設定透過 Netlink 公開的硬體傳輸整形物件 | libmnl 可用時建置 |
dpll | 檢查、設定與監控用於網路時脈同步的數位鎖相迴路裝置與 pin | libmnl 可用時建置 |
原始碼樹狀結構中也有名為 maketable、normal、pareto 與 paretonormal 的程式,
但建置程序只使用它們產生 tc 分布表。安裝目標會複製其產生的資料,而非這些主機
工具,因此它們不是發布版命令。
選擇正確的層級 #
- 使用 iproute2 進行即時檢查、診斷、實驗,以及高階管理程式未提供的低階設定。
- 當狀態必須在重新開機後保留,並一致回應裝置生命週期事件時,請使用
NetworkManager、
systemd-networkd、ifupdown或發行版設定層。 - 使用
nft進行封包篩選與網路位址轉譯,因為這些操作屬於 Netfilter。 - 應讓 iproute2 文件與已安裝版本相符,因為使用者空間只能編碼建置時已知的功能, 而執行中的核心也只能接受其已實作的功能。
評論
在 GitHub 上閱讀或評論(發表評論需要登入)