Linux 核心網路功能時間軸

最後更新: 2026-08-28 14:02:12 +0800 +0800
原文以英文撰寫。您正在閱讀AI翻譯版本。

Linux 網路功能透過主線版本的漸進式發布演進,而不是透過獨立的子系統版本發布。以下里程碑標示了首次包含各項功能的穩定核心版本;後續核心可能會增加協定涵蓋範圍、驅動程式、卸載功能或使用者空間介面。

網路功能速覽 #

FeatureKernelRelease DateMaintainer PageQuick Fact
Netfilter and iptables2.4.0January 4, 2001netfilter.orgNetfilter 引入了可擴充的封包處理掛鉤,而 iptables 向使用者空間提供了過濾、NAT 和封包修改規則。
NAPI2.6.0December 17, 2003NAPI 將中斷通知與輪詢結合,因此降低了介面以高速率接收封包時的中斷負擔。
CUBIC TCP congestion control2.6.13August 28, 2005CUBIC 根據自上一次壅塞事件以來的時間三次函數選擇壅塞視窗。Linux 2.6.19 後來將其設為預設的 TCP 壅塞控制演算法。
Network namespaces2.6.24January 24, 2008初始支援隔離了網路裝置、協定堆疊、路由表、防火牆規則和通訊端。後續版本擴大了裝置和協定的涵蓋範圍。
Generic Receive Offload (GRO)2.6.29March 23, 2009GRO 在上層處理之前聚合相關封包,因此不需要 NIC 特定的接收卸載即可攤銷每個封包的成本。
Receive Packet Steering and Receive Flow Steering2.6.35August 1, 2010RPS 在軟體中將接收處理分散到多個 CPU,而 RFS 增加了流局部性,使封包處理可以跟隨消費資料的應用程式。
TCP Fast Open client support3.6September 30, 2012當用戶端擁有有效 Cookie 時,TFO 可以在建立連線的 SYN 中攜帶應用程式資料。Linux 3.7 增加了伺服器端支援。
nftables3.13January 20, 2014nftables projectnftables 增加了可程式化的封包分類引擎和 Netlink API,旨在取代彼此獨立的 iptables、ip6tables、arptables 和 ebtables 介面。
Extended BPF3.18December 7, 2014eBPF projectbpf()系統呼叫和 eBPF 虛擬機器為驗證型、JIT 編譯型程式提供了基礎,這些程式用於通訊端過濾器、流量控制、追蹤以及後來的 XDP。
Virtual Routing and Forwarding (VRF)4.3November 2, 2015VRF 裝置允許介面共用一個網路命名空間,同時使用獨立的路由表,因此無需建立另一個命名空間即可實現路由隔離。
eXpress Data Path (XDP)4.8October 2, 2016XDP projectXDP 在核心配置通訊端緩衝區之前執行 eBPF 程式,從而支援提早丟棄、重新導向和負載平衡封包。
BBR congestion control4.9December 11, 2016Google BBRBBR 對瓶頸頻寬和往返傳播時間建模,而不是將封包遺失視為主要的壅塞訊號。
Kernel TLS transmit offload4.13September 3, 2017kTLS 將傳送資料的 TLS 記錄加密和成框移入核心。Linux 4.17 增加了接收支援。
AF_XDP sockets4.18August 12, 2018XDP projectAF_XDP 透過共用記憶體環將 XDP 程式連接到使用者空間,並根據驅動程式支援複製和零複製操作。
Multipath TCP5.6March 29, 2020MPTCP upstream project初始的上游 MPTCP 支援允許一個邏輯傳輸連線在不同路徑上使用多個 TCP 子流。
WireGuard5.6March 29, 2020WireGuardWireGuard 增加了核心中的加密第三層通道,協定和密碼學介面都較為精簡。
IPv6 BIG TCP5.19July 31, 2022BIG TCP 允許主機協定堆疊內部使用更大的非 GSO 封包,從而降低高速鏈路上的每封包負擔。Linux 6.3 增加了 IPv4 支援。

發布日期遵循Linux 核心 Git 歷史中的主線標籤。功能版本透過KernelNewbies 版本摘要和核心網路文件進行交叉核對。

核心與使用者空間邊界 #

Linux 不提供add_route()或create_veth()之類的系統呼叫。相反地,使用者空間選擇核心控制介面,並透過通用系統呼叫存取它。尤其需要注意,Netlink 是一組通訊端協定,而不是系統呼叫。

SyscallsControl InterfaceNetwork Configuration RoleCurrent Guidance
socket(), bind(), sendmsg(), and recvmsg()Netlink程序開啟一個AF_NETLINK通訊端,並與某個 Netlink 家族交換結構化訊息。NETLINK_ROUTE設定連結、位址、路由、鄰居、流量控制及相關物件。Generic Netlink 和子系統協定涵蓋 nftables、nl80211、ethtool、devlink、WireGuard 等設施。對系統級網路設定,優先使用相關的 Netlink 家族。訊息屬性、確認、分段回覆和 API 演進都需要謹慎處理,因此應使用受維護的函式庫或工具。
ioctl()Socket and device ioctlsSIOCSIFFLAGS、SIOCSIFADDR和SIOCSIFMTU等要求設定介面。私有裝置 ioctl、舊版 ethtool ABI 和 Wireless Extensions ABI 也使用相同的系統呼叫。為了相容性保留 ioctl 支援,但當子系統提供 Netlink API 時應使用該 API。ioctl 命令具有固定的要求結構,因此難以安全擴充。
setsockopt() and getsockopt()Socket options通訊端選項設定單一通訊端的行為,例如標記、緩衝區大小、裝置繫結、多播成員關係、TCP 參數和附加的過濾器。舊版 iptables 也透過協定特定的通訊端選項上傳和讀取規則。對屬於單一通訊端的設定繼續使用通訊端選項。對新的防火牆整合,應透過 Netlink 使用 nftables,而不是舊版 iptables 通訊端選項 ABI。
bpf()eBPF object APIbpf()載入程式、建立和更新對映、查詢物件,並建立受支援的 BPF 連結。網路程式可以執行在通訊端、流量控制、cgroup、XDP 和其他掛鉤上。部分附加路徑仍使用 Netlink 或通訊端選項。使用 libbpf,而不是直接發出原始的bpf()命令。當掛鉤支援 BPF 連結時應優先使用,因為連結為附加關係提供明確的生命週期;必要時使用該掛鉤既有的 Netlink API。
openat(), read(), and write()procfs and sysfs/proc/sys/net下的檔案公開網路 sysctl,而/proc/net和/sys/class/net下的部分檔案公開狀態或範圍有限的控制項。這些呼叫操作的是虛擬檔案,但資料由核心提供或消費。對主機或命名空間調節項使用有文件記錄的 sysctl。如果存在結構化的 Netlink 傾印,不要解析 procfs,因為 procfs 格式主要是文字介面,可能省略屬性。
clone(), clone3(), unshare(), and setns()Network namespacesCLONE_NEWNET建立網路命名空間,或將執行轉移到命名空間設定路徑;setns()加入現有命名空間。設定命令接著作用於呼叫執行緒的命名空間所選擇的網路堆疊。先建立命名空間,再透過 Netlink 進行設定。將命名空間切換視為執行緒範圍的狀態,並避免從不受控制的多執行緒程序中並行修改它。

大多數管理操作要求在管理目標網路命名空間的使用者命名空間中擁有CAP_NET_ADMIN。根據程式類型、附加點和核心版本,eBPF 操作還可能需要CAP_BPF、CAP_PERFMON或其他能力。

建議介面的變化 #

  1. 早期 Linux 使用 ioctl、通訊端選項和虛擬檔案。 ifconfig、route和arp等程式發出網路裝置和路由 ioctl。/proc/sys/net提供全域調節項,而透過舊版 iptables 設定的各代防火牆使用協定特定的通訊端選項。
  2. Rtnetlink 成為可擴充的網路控制平面。 Linux 2.2 透過NETLINK_ROUTE公開連結、多個位址、路由、鄰居和流量控制物件。因此,iproute2 工具(ip、bridge和tc)取代了面向 ioctl 的 net-tools 命令,用於新的設定。
  3. 子系統特定的 Netlink 家族取代了固定的私有 ABI。 Generic Netlink 及相關協定允許命令和類型-長度-值屬性在不變更系統呼叫的情況下演進。nl80211 取代 Wireless Extensions,nftables 取代舊版 iptables 規則 ABI,而較新的 ethtool 操作使用 Netlink 而不是裝置 ioctl。
  4. eBPF 增加了可程式化的資料平面邊界。 bpf()系統呼叫管理程式和對映,但設定仍依附加點劃分:rtnetlink 設定流量控制和既有的 XDP 附加,通訊端選項附加傳統通訊端過濾器,而 BPF 連結為受支援的掛鉤提供檔案描述元生命週期管理。
  5. 新的控制平面偏好描述完整的 Netlink API。 目前的核心網路開發透過機器可讀規格記錄 Netlink 家族。應用程式應使用這些 API,要求確認和擴充確認,並僅在不存在受支援的結構化替代介面時使用 ioctl 或文字檔案解析。

如需相應 UAPI 的詳細資料,請參閱核心的Netlink 介紹、rtnetlink(7)、netdevice(7)和bpf(2)文件。

rtnetlink 中的rt表示routing,但該介面已發展為核心的一般網路控制協定。程序開啟socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE)並傳送RTM_*訊息。每則訊息包含struct nlmsghdr、物件特定的固定標頭,以及對齊的類型-長度-值屬性。

Rtnetlink 支援三種互動模式:

  • Do request: 建立、取代、變更或刪除一個物件,並接收確認。
  • Dump request: 列舉某個物件類別,例如所有連結或所有路由。核心會回傳以NLMSG_DONE結束的多部分回應。
  • Multicast notification: 訂閱連結、位址、路由、鄰居、規則、流量控制及其他變更的群組。通知使用與回覆相同的物件訊息,因此程式可以維護本機快取。

受管理物件 #

ObjectPrincipal MessagesOperations and State
Network linksRTM_NEWLINK, RTM_SETLINK, RTM_DELLINK, RTM_GETLINK建立和移除已註冊連結類型支援的虛擬裝置,包括 veth 對、橋接器、bond、VLAN 裝置、VRF、macvlan/macvtap、VXLAN、Geneve 和 dummy 裝置。變更管理狀態、MTU、名稱、MAC 位址、佇列數量、群組、別名、主從關係、命名空間位置和協定特定的連結選項。查詢載波狀態、運作狀態、佇列設定、實體識別碼、VF 設定、統計資料和 XDP 附加資訊。
Link propertiesRTM_NEWLINKPROP, RTM_DELLINKPROP, RTM_GETLINKPROP新增、移除和列出輔助連結屬性,主要是替代介面名稱。
Protocol addressesRTM_NEWADDR, RTM_DELADDR, RTM_GETADDR新增、取代、刪除和列舉 IPv4、IPv6 以及受支援的非 IP 位址。屬性描述本機和對等位址、前綴長度、範圍、廣播或任播位址、旗標、標籤、偏好存留期和有效存留期。
Address-selection labelsRTM_NEWADDRLABEL, RTM_DELADDRLABEL, RTM_GETADDRLABEL獨立於介面位址管理 IPv6 來源位址和目的位址選擇標籤。
RoutesRTM_NEWROUTE, RTM_DELROUTE, RTM_GETROUTE在多個表中管理單播、本機、廣播、多播、blackhole、unreachable、prohibit 和 throw 路由。路由可以選擇輸入和輸出介面、閘道、偏好來源、度量值、MTU、壅塞控制參數、到期時間、realm、標記、多路徑下一跳或輕量級通道封裝。RTM_GETROUTE同時支援表傾印和針對給定流量鍵的路由查詢。
Policy-routing rulesRTM_NEWRULE, RTM_DELRULE, RTM_GETRULE根據優先順序以及來源、目的地、輸入或輸出介面、防火牆標記、UID 範圍、IP 協定、連接埠、DSCP、流量標籤或第三層主裝置等選取器選擇路由表或動作。動作包括表查找、goto、blackhole、unreachable 和 prohibit。
Nexthop objectsRTM_NEWNEXTHOP, RTM_DELNEXTHOP, RTM_GETNEXTHOP建立可重複使用的下一跳和下一跳群組(包括彈性群組),而不是將每條路徑嵌入每條路由。物件攜帶閘道、裝置、群組成員關係、權重、保護旗標和封裝狀態。
Resilient nexthop bucketsRTM_NEWNEXTHOPBUCKET, RTM_DELNEXTHOPBUCKET, RTM_GETNEXTHOPBUCKET檢查並在支援時控制彈性下一跳群組使用的儲存桶到下一跳的對映,從而讓成員關係變更影響較少的流量。
NeighboursRTM_NEWNEIGH, RTM_DELNEIGH, RTM_GETNEIGH管理和檢查 ARP、IPv6 NDP 及相關鄰居快取項目。狀態包括協定位址、鏈路層位址、介面、可達性狀態、路由器和代理旗標、探測資料、卸載狀態和快取時間戳記。橋接器轉送資料庫項目也使用帶有橋接器特定屬性的鄰居訊息。
Neighbour tablesRTM_NEWNEIGHTBL, RTM_SETNEIGHTBL, RTM_GETNEIGHTBL讀取表統計資料,並調整鄰居探索的垃圾回收閾值、可達時間、重傳時間、探測次數、佇列限制、過期時間和代理行為。
Traffic-control queueing disciplinesRTM_NEWQDISC, RTM_DELQDISC, RTM_GETQDISC附加、設定、取代、檢查和移除根、ingress、egress 及子 qdisc。範例包括fq、fq_codel、htb、tbf、netem、cake、clsact以及驅動程式支援時的硬體卸載 qdisc。
Traffic classesRTM_NEWTCLASS, RTM_DELTCLASS, RTM_GETTCLASS管理有類別 qdisc 下的類別階層,包括速率、上限、優先順序、父控制代碼和實作特定參數。
Traffic-control filters and chainsRTM_NEWTFILTER, RTM_DELTFILTER, RTM_GETTFILTER, RTM_NEWCHAIN, RTM_DELCHAIN, RTM_GETCHAIN分類封包並選擇類別或動作。過濾器包括 flower、u32、route、matchall 和 BPF;鏈將區塊劃分為有序的階段。屬性可以要求硬體卸載,並報告卸載是否成功。
Traffic-control actionsRTM_NEWACTION, RTM_DELACTION, RTM_GETACTION建立和檢查可重複使用的動作,例如 drop、redirect、mirror、police、tunnel-key 操作、VLAN 操作、封包編輯、連線追蹤、取樣和 BPF 執行。
Bridge multicast databaseRTM_NEWMDB, RTM_DELMDB, RTM_GETMDB管理橋接器和 switchdev 多播轉送項目,包括群組、連接埠、VLAN、來源特定多播狀態、路由器連接埠狀態、計時器和硬體卸載資訊。
Bridge VLAN stateRTM_NEWVLAN, RTM_DELVLAN, RTM_GETVLAN管理橋接器連接埠上的 VLAN 成員關係和每個 VLAN 的橋接器選項。它不同於建立 VLAN 網路裝置,後者使用帶有vlan鏈路類型的RTM_NEWLINK。
Network-namespace identifiersRTM_NEWNSID, RTM_DELNSID, RTM_GETNSID為對等網路命名空間指派並解析命名空間本機的數字 ID。當物件參照另一個命名空間時,rtnetlink 屬性使用這些 ID。
Per-interface protocol configurationRTM_NEWNETCONF, RTM_DELNETCONF, RTM_GETNETCONF讀取並接收選定 IPv4、IPv6 和 MPLS 介面設定的變更,包括轉送、反向路徑過濾、多播轉送、代理鄰居行為以及連結中斷時對路由的處理。涵蓋範圍比/proc/sys/net窄。
Data Center BridgingRTM_GETDCB, RTM_SETDCB與支援的驅動程式交換資料中心橋接設定,例如優先順序、優先順序群組、Priority Flow Control、應用程式優先順序和 DCB 能力。
Prefix and IPv6 ND informationRTM_NEWPREFIX, RTM_NEWNDUSEROPT傳遞從 IPv6 路由器通告學習到的資訊,包括前綴和使用者選項。這些訊息類別主要回報核心觀察到的狀態,而不是作為一般設定器。
Multicast and anycast address reportsRTM_GETMULTICAST, RTM_GETANYCAST and corresponding notification types列舉或回報實作這些操作的位址系列之多播和任播位址狀態。支援情況取決於位址系列。
Link and offload statisticsRTM_NEWSTATS, RTM_GETSTATS, RTM_SETSTATS取得標準連結計數器、每連結擴充統計資料和選定的卸載統計資料。設定器支援範圍僅限於目標子系統實作的屬性。
Cache and tunnel reportsRTM_NEWCACHEREPORT, RTM_NEWTUNNEL, RTM_DELTUNNEL, RTM_GETTUNNEL回報位址系列快取事件,並管理或回報位址系列實作的通道狀態。可用性和接受的屬性取決於協定模組。

RTM_NEW*不一定表示「僅建立」。旗標決定變更語義:

FlagMeaning
NLM_F_CREATE如果物件不存在,則建立該物件。
NLM_F_EXCL如果物件已存在,則失敗。
NLM_F_REPLACE取代現有物件。
NLM_F_APPEND如果受支援,則將物件加入有序集合的末端。
NLM_F_ACK回傳成功或NLMSG_ERROR確認。
NLM_F_DUMP要求多部分列舉;等同於`NLM_F_ROOT

應用程式也應啟用NETLINK_EXT_ACK。擴充確認可以識別被拒絕的屬性、包含可讀的核心訊息,並回報原則限制。成功確認表示核心已處理該訊息;它不代表一系列獨立的 rtnetlink 要求具有交易性。

命名空間與一致性模型 #

rtnetlink 通訊端在其所屬的網路命名空間中運作。因此,大多數要求只能查看和修改該命名空間中的連結、路由、規則、鄰居和流量控制物件。連結屬性可以將裝置移到另一個命名空間,而命名空間 ID 訊息可以建立對等命名空間的參照。

變更要求通常需要在擁有目標網路命名空間的使用者命名空間中具備CAP_NET_ADMIN。當讀取要求暴露敏感的裝置或協定資訊時,也可能受到限制。

傾印不是原子快照。在多部分傾印進行期間,物件可能會變更;當接收緩衝區溢位時,多播通知可能遺失。狀態同步器應:

  1. 開啟通訊端並將其繫結到必要的多播群組。
  2. 使用唯一的序號要求傾印。
  3. 根據序號和傳送者連接埠 ID 比對單播回覆。
  4. 處理傾印期間到達的通知。
  5. 偵測ENOBUFS、中斷的傾印和格式錯誤的屬性。
  6. 當無法證明同步完成時,丟棄快取並重複傾印。

範圍界線 #

Rtnetlink 控制網路拓撲、定址、轉送、鄰居和流量控制,但它並不是每個網路子系統的介面:

FacilityControl Interface
nftables and connection trackingNETLINK_NETFILTER families
Wi-Fi configurationGeneric Netlink 上的nl80211
Modern NIC settingsGeneric Netlink 上的ethtool
devlink devices, ports, resources, and health reportersGeneric Netlink 上的devlink
WireGuard peer and key configurationGeneric Netlink 上的wireguard
MPTCP path-manager configurationGeneric Netlink 上的mptcp_pm
Per-socket TCP, UDP, multicast, and device-binding optionssetsockopt()
Network sysctls not represented by netconf messages/proc/sys/net
eBPF program and map lifecyclebpf();附加也可能使用 rtnetlink

權威的操作清單定義於include/uapi/linux/rtnetlink.h。核心也為連結、位址、路由、規則、鄰居和流量控制發布了機器可讀規格。較高階的程式應使用受維護的函式庫或 iproute2,而不是手動重現 UAPI 結構配置和屬性驗證。

使用者空間網路工具 #

Linux 沒有單一的使用者空間網路堆疊。命令列工具、原則守護程式、設定轉譯器、路由守護程式和容器外掛程式會存取不同的核心控制介面。因此,較高階的命令可能控制的是守護程式,而不是直接聯絡核心。

SoftwarePrimary RolePath to the Kernel
iproute2ip管理連結、位址、路由、規則、鄰居和網路命名空間;bridge管理橋接器狀態;tc管理流量控制;ss檢查通訊端。這些程式直接使用 iproute2 的內部 Netlink 支援。大多數設定透過 rtnetlink 完成;通訊端檢查使用診斷用 Netlink 家族。iproute2 是一組可執行檔,而不是其他網路管理器所需的守護程式。
NetworkManager維護乙太網路、Wi-Fi、行動寬頻、VPN、IP 設定和 DNS 整合的連線設定檔與原則。nmcli、nmtui、桌面小程式和應用程式都是用戶端。nmcli使用 libnm,透過 D-Bus 呼叫 NetworkManager 守護程式。守護程式的 Linux 平台層會直接開啟 Netlink 通訊端,執行一般連結、位址、路由、規則和流量控制操作;它不會透過ip可執行檔傳送這些操作。選用的輔助程式處理 Wi-Fi 驗證、PPP、DHCP、DNS 和防火牆整合等設施。
systemd-networkd套用宣告式的.network、.netdev和.link設定,執行 DHCP 和路由器探索用戶端,並維護網路狀態。networkctl是其檢查和控制 CLI。systemd-networkd使用 systemd 內部的 Netlink 實作設定核心。對受管理設定而言,networkctl使用 networkd API 和狀態,而不是呼叫 iproute2。
Netplan將發行版層級的 YAML 轉換為後端設定,並協調套用該設定。Netplan 選擇 NetworkManager 或 systemd-networkd 作為轉譯器。持續執行核心設定的是選取的守護程式,而不是 Netplan 的 YAML 剖析器。
nftablesnft建立防火牆、NAT、封包分類以及集合或對映規則。libnftables 向應用程式公開相同的引擎。nft使用 libnftables 和 libnftnl,透過NETLINK_NETFILTER與 nftables 子系統交換批次訊息;它不使用 rtnetlink 或 iproute2。
firewalld維護動態防火牆區域、服務、原則以及獨立的執行階段和永久設定。firewall-cmd是其主要 CLI。firewall-cmd透過 D-Bus 呼叫 firewalld 守護程式。守護程式通常透過 nftables 後端套用規則,而不是要求 NetworkManager 或 iproute2 安裝規則。
ethtool讀取和變更驅動程式與 NIC 屬性,例如連結模式、通道、環、合併、卸載、RSS、統計資料和韌體資料。較新的操作使用 ethtool Generic Netlink 家族。較舊或尚未轉換的操作使用SIOCETHTOOL ioctl,因此所選路徑取決於命令和核心支援。
iw檢查和設定 802.11 實體裝置、虛擬介面、頻道、站台、掃描、省電和法規狀態。iw向nl80211 Generic Netlink 家族傳送命令。它不會呼叫ip,但產生介面的普通連結和 IP 層設定仍由ip負責。
wpa_supplicant and iwd執行 Wi-Fi 掃描、驗證、關聯、漫遊和金鑰管理。每個守護程式都透過nl80211控制 cfg80211/mac80211。NetworkManager 可以透過 D-Bus 控制任一守護程式;接著由 Wi-Fi 守護程式與核心通訊。
conntrack-tools列出、修改、監視和複製 Netfilter 連線追蹤狀態。conntrack和conntrackd使用NETLINK_NETFILTER上的 ctnetlink,獨立於 rtnetlink 運作。
bpftool載入和檢查 eBPF 程式、對映、連結、BTF、cgroup 以及選定的網路附加。大多數物件生命週期操作使用 libbpf 和bpf()系統呼叫。部分網路操作也會檢查或修改由 rtnetlink 管理的 XDP 和流量控制狀態。
FRRouting and BIRD實作 BGP、OSPF、IS-IS 和 RIP 等路由協定,並將學習到的路由與核心 FIB 協調。FRRouting 協定守護程式將路由提交給其zebra守護程式,由後者透過 rtnetlink 設定核心。BIRD 在 Linux 上透過路由通訊端或 Netlink 執行自己的核心協定同步。兩者在穩定狀態下安裝路由都不需要ip可執行檔。
Open vSwitch為虛擬化、容器、覆蓋網路和軟體定義網路實作可程式化的虛擬交換。ovs-vsctl修改 OVS 資料庫;ovs-vswitchd消費該設定,並透過 OVS Generic Netlink 家族控制 Linux OVS 資料路徑。輔助連結和通道設定也可能涉及 rtnetlink。
CNI plugins當相容的執行階段呼叫外掛程式時,設定容器網路命名空間。常見外掛程式會建立 veth 對、橋接器、路由、原則和覆蓋網路。外掛程式以短生命週期程式執行,通常直接使用 Go Netlink 函式庫。外掛程式還可能額外呼叫或連結防火牆、eBPF、IPAM 或資料儲存元件;CNI 規定的是呼叫和結果格式,而不是單一核心後端。
net-tools提供舊版的ifconfig、route、arp和netstat命令。這些工具主要使用網路裝置和路由 ioctl,並解析 procfs。對於新的自動化,iproute2 和結構化 Netlink 介面已取代它們。

控制與依賴路徑 #

箭頭描述執行時控制流程,而不是套件所有權。NETLINK_ROUTE、NETLINK_NETFILTER和nl80211是透過AF_NETLINK通訊端存取的核心協定。

flowchart LR
    subgraph clients[Clients and Configuration]
        nmcli["nmcli / GUI"]
        networkctl
        netplan[Netplan]
        firewallcmd[firewall-cmd]
    end

    subgraph controllers[Daemons and Direct Utilities]
        nm[NetworkManager]
        networkd[systemd-networkd]
        wifi["wpa_supplicant / iwd"]
        firewalld
        iproute["ip / bridge / tc"]
        nft
        iw
        ethtool
        bpftool
    end

    subgraph apis[Kernel Control Interfaces]
        rtnl["NETLINK_ROUTE<br/>(rtnetlink)"]
        nfnl[NETLINK_NETFILTER]
        nl80211["nl80211<br/>(Generic Netlink)"]
        ethtoolapi["ethtool Generic Netlink<br/>or device ioctl"]
        bpfapi["bpf() syscall"]
    end

    kernel[Linux Network Kernel]

    nmcli -->|"libnm + D-Bus"| nm
    networkctl -->|"daemon IPC"| networkd
    netplan -.->|"generates configuration"| nm
    netplan -.->|"generates configuration"| networkd
    firewallcmd -->|D-Bus| firewalld

    nm -->|"internal Netlink"| rtnl
    nm -->|D-Bus| wifi
    networkd -->|sd-netlink| rtnl
    iproute -->|"internal libnetlink"| rtnl
    firewalld -->|"nftables backend"| nfnl
    nft -->|"libnftables + libnftnl"| nfnl
    wifi --> nl80211
    iw --> nl80211
    ethtool --> ethtoolapi
    bpftool -->|libbpf| bpfapi

    rtnl --> kernel
    nfnl --> kernel
    nl80211 --> kernel
    ethtoolapi --> kernel
    bpfapi --> kernel

此圖直接回答常見的nmcli依賴問題:

  1. nmcli透過libnm建構要求。
  2. libnm 透過D-Bus將要求傳送給NetworkManager 守護程式。
  3. NetworkManager 透過自身的 Netlink 實作套用一般核心網路狀態。
  4. iproute2 是相同核心 API 的獨立管理用戶端,不是 NetworkManager 與核心之間的中介層。

在 shell 自動化中,從程式呼叫ip、nft或其他 CLI 仍然有用,但長時間執行的管理器通常使用函式庫,或直接實作核心協定。直接存取可以避免解析命令輸出,並讓管理器訂閱非同步狀態通知。

評論

在 GitHub 上閱讀或評論(發表評論需要登入)