跳至內容

systemd-networkd

出自 Arch Linux 中文维基

本文或本章節的語言、語法或風格需要改進。參考:幫助:風格

原因:解釋重複,結構鬆散(在Talk:Systemd-networkd討論)

systemd-networkd 是一個管理網絡配置的系統守護進程。它會在網絡設備出現時檢測和配置它們;它還可以創建虛擬網絡設備。這個服務非常適合於為 systemd-nspawn 管理的容器或者虛擬機創建複雜的網絡配置。如果只是簡單網絡的配置,它也同樣能勝任。

基本用法

[編輯 | 編輯原始碼]

systemd 是默認 Arch 安裝的一部分,包含操作有線網絡所需的所有文件。無線適配器可以通過其他服務(比如 wpa_supplicant 或者 iwd)來配置,本文後面的部分也會介紹相關內容。

必需的服務和設置

[編輯 | 編輯原始碼]

啟動/啟用 systemd-networkd.service 以使用 systemd-networkd

注意:必須確認沒有其他服務正在管理網絡。不同的網絡管理服務會互相衝突。通過 systemctl --type=service 可以得到正在運行的服務的列表,請停止其他網絡管理服務。

配置 systemd-resolved 是可選的,它為本地應用程式提供網絡名稱解析服務。是否使用它可以考慮下面幾條:

  • 如果 .network 文件中指定了 DNS 條目,則 systemd-resolved 服務是必需的
  • 想自動從DHCP伺服器或IPv6路由器推薦獲取 DNS 伺服器地址(通過在[Network]中設置(DHCP=和/或IPv6AcceptRA=,並在對應的[DHCPv4][DHCPv6][IPv6AcceptRA]中設置UseDNS=yes(默認值)來實現,參見systemd.network(5)
  • 請搞明白 resolv.confsystemd-resolved 如何互相影響,以便正確配置要使用的 DNS 伺服器。更多相關信息可以參見 systemd-resolved
  • 注意:即使沒有啟用 systemd-networkdsystemd-resolved 也能夠提供服務。

systemd-networkd-wait-online

[編輯 | 編輯原始碼]

啟用 systemd-networkd.service 的同時,也會啟用 systemd-networkd-wait-online.service。這是一個一次性類型的 systemd 服務,用於等待網絡完成配置。該服務具有 WantedBy=network-online.target,因此只有當 network-online.target 被啟用或被其他單元拉入時才會啟動。另請參閱 當網絡啟動後執行服務

默認情況下,systemd-networkd-wait-online.service 會等待所有由 systemd-networkd 管理的鏈路完成配置(或失敗),並且至少有一個鏈路在線。

詳情請參閱 systemd-networkd-wait-online(8)

多個網絡接口不一定會持續連接

[編輯 | 編輯原始碼]

若系統具有多個網絡接口,但這些接口並不一定會時時保持連接(例如擁有雙口以太網卡,但只插了一根線),啟動 systemd-networkd-wait-online.service 時會在默認 2 分鐘超時後失敗,從而導致開機流程出現不必要的延遲。

若希望更改為等待「任一」接口而不是「全部」接口上線,可以編輯該服務,並在 ExecStart 行加入 --any 參數:

/etc/systemd/system/systemd-networkd-wait-online.service.d/wait-for-only-one-interface.conf
[Service]
ExecStart=
ExecStart=/usr/lib/systemd/systemd-networkd-wait-online --any

或者,也可以使用 systemd-networkd-wait-online@.service 來指定特定接口。例如,若只需等待 enp1s0 上線,請停用 systemd-networkd-wait-online.service,並啟用 systemd-networkd-wait-online@enp1s0.service

提示:若已知某些接口可能不會隨時上線,可在 .network 配置文件的 [Link] 區塊中加入 RequiredForOnline=no。詳情請參見 systemd.network(5) § [LINK]_SECTION_OPTIONS

等待直到網絡接口取得可路由地址

[編輯 | 編輯原始碼]

根據 systemd-networkd-wait-online.service(8) 的說明,"online 表示鏈路的操作狀態至少為 degraded"(關於 degraded 與其他操作狀態的定義,請參閱 networkctl(1))。

若希望 systemd-networkd-wait-online.service 在網絡接口取得可路由的 IP 地址後才結束(以避免依賴網絡的其他服務啟動過早),可在 .network 配置文件中的 [Link] 區段加入:

[Link]
RequiredForOnline=routable

配置樣例

[編輯 | 編輯原始碼]

在本節中,所有配置都存儲為在 /etc/systemd/network/ 目錄下 形如 foo.network 的文件。有關選項的完整列表和處理順序可以參考 #配置文件systemd.network(5)

Systemd/udev 會自動為所有本地以太網、WLAN 和 WWAN 接口分配可預測且穩定的網絡接口名。使用 networkctl list 以列出系統上所有設備。

在修改了配置文件之後,restart systemd-networkd.service 以使得它們生效。

注意:
  • 配置文件中指定的選項區分大小寫。
  • 在下面的示例中,enp1s0 是有線適配器,wlp2s0 是無線適配器。他們的名字在不同系統上可能會有不同的名字。也可以使用通配符,例如,Name=en*
  • 如果想要禁用 IPv6 的話,參考 IPv6#systemd-networkd
  • [Network] 段設置 DHCP=yes 來同時接收 IPv4 IPv6 DHCP 請求。

使用 DHCP 的有線適配器

[編輯 | 編輯原始碼]
/etc/systemd/network/20-wired.network
[Match]
Name=enp1s0

[Link]
RequiredForOnline=routable

[Network]
DHCP=yes

使用靜態 IP 的有線適配器

[編輯 | 編輯原始碼]
/etc/systemd/network/20-wired.network
[Match]
Name=enp1s0

[Network]
Address=10.1.10.9/24
Gateway=10.1.10.1
DNS=10.1.10.1
#DNS=8.8.8.8

Address= 能夠被使用多次來指定多個 IPv4 或者 IPv6 地址。 參見 #network 文件或者 systemd.network(5) 了解更多配置項。

無線適配器

[編輯 | 編輯原始碼]

為了能夠使用 systemd-networkd 連接一個無線網絡,需要一個被其他應用,比如 wpa_supplicantiwd,配置好的無線適配器。

/etc/systemd/network/25-wireless.network
[Match]
Name=wlp2s0

[Link]
RequiredForOnline=routable

[Network]
DHCP=yes
IgnoreCarrierLoss=3s

如果無線適配器有一個靜態地址,它的配置(除了接口的名字)跟有線適配器是一樣的。

同一台機器上的有線和無線適配器

[編輯 | 編輯原始碼]

這些設置將為有線和無線連接自動獲取 DHCP IP, 並使用 metric 讓內核動態地決定使用的連結。這樣,網絡在有線連接斷開時就不會有明顯的中斷。內核的 route metric (與 ip 配置一致) 會在具有多個設備時決定使用哪個傳出數據包。如果某個連接斷開,其他的接口就會自動接管,而不會出現網絡中斷(正在進行的傳輸可能會出現問題,不過那是另一層的問題了。)

注意:Metric 選項用於靜態路由,而 RouteMetric 選項則用於不使用靜態路由的配置。詳情請參見 systemd.network(5)
/etc/systemd/network/20-wired.network
[Match]
Name=enp1s0

[Network]
DHCP=yes

[DHCPv4]
RouteMetric=100

[IPv6AcceptRA]
RouteMetric=100
/etc/systemd/network/25-wireless.network
[Match]
Name=wlp2s0

[Network]
DHCP=yes

[DHCPv4]
RouteMetric=600

[IPv6AcceptRA]
RouteMetric=600

網絡接口重命名

[編輯 | 編輯原始碼]

作為更改設備名稱的替代方案,systemd 使用.link文件用於接口重命名。常見的例子是基於 MAC 地址給一個 USB 接口以太網適配器設置一個可預見的接口名稱。這類設備依其連接到不同 USB 接口而具有不同的接口名稱。

/etc/systemd/network/10-ethusb0.link
[Match]
MACAddress=12:34:56:78:90:ab

[Link]
Description=USB to Ethernet Adapter
Name=ethusb0
注意:任何由用戶提供的.link文件名必須是依字典順序先於默認配置文件名99-default.link才能生效。例如,必須是10-ethusb0.link而不能是 ethusb0.link


配置文件

[編輯 | 編輯原始碼]

配置文件位於 /usr/lib/systemd/network,非持久化的運行時網絡配置目錄位於 /run/systemd/network ,本地管理網絡配置位於 /etc/systemd/network/etc/systemd/network 中的配置文件具有最高優先級。

配置文件有三類。它們均使用類似於 systemd 單元文件的格式。

  • .network 文件,為匹配的設備提供一個網絡配置
  • .netdev 文件,為匹配的環境創建一個虛擬網絡設備
  • .link 文件,當網絡設備出現時,udev 將查找第一個匹配.link文件

它們均遵循下列規則:

  • 如果位於[Match]小節的全部條件相匹配,配置項將被激活
  • 一個空的[Match]小節意味著配置項適用任何情況(相當於*通配符)
  • 所有配置文件將按字典順序集中保存和處理,不管它們在目錄中的實際順序如何。
  • 同名文件將彼此替換
提示:
  • 要永久覆蓋 /usr/lib/systemd/network 中系統提供的文件(即升級之後仍覆蓋),請在 /etc/systemd/network 中放置一個具有相同名稱的文件並將其符號連結到 /dev/null
  • 星號(*)通配符可以在 VALUE 中使用(例如 en* 將匹配任何以太網設備), 布爾值可以簡單地寫為 yesno
  • 根據這個線索的討論,最佳實踐是 to setup specific container network settings inside the container with networkd configuration files.
  • Systemd 使用1, true, yes, on作為邏輯「真」值,0, false, no, off作為邏輯「假」值

network 文件

[編輯 | 編輯原始碼]

這類文件用於設置網絡配置變量,尤其適用於伺服器和容器。

.network文件含有下列小節:[Match][Link][Network][Address][Route]以及[DHCP]。下列為每小節的通用配置。詳情及範例請參閱systemd.network(5)

[Match] 小節

[編輯 | 編輯原始碼]
參數 說明 可接受的值 默認值
Name= 匹配設備名稱,例如 en*。可使用 ! 反向匹配。 以空格分隔的設備名稱,支持通配符與邏輯否定(!
MACAddress= 匹配 MAC 地址,例如 MACAddress=01:23:45:67:89:ab 00-11-22-33-44-55 AABB.CCDD.EEFF 使用冒號、連字符或點號分隔的十六進制 MAC 地址
Host= 匹配主機名稱或 machine ID。 含通配符的主機名稱字符串,machine-id(5)
Virtualization= 檢查是否運行於虛擬環境中。Virtualization=false 僅匹配實體機器;Virtualization=true 則匹配任何容器或虛擬機。亦可檢查特定虛擬化類型或實現,或用戶命名空間(private-users)。 布爾值、邏輯否定(!)、類型(vm, container)、實現(參見 systemd-detect-virt(1))、private-users

[Link] 小節

[編輯 | 編輯原始碼]
參數 說明 可接受的值 默認值
MACAddress= 指定設備的硬體地址。可用於 MAC 地址偽造 使用冒號、連字符或點號分隔的十六進制 MAC 地址
MTUBytes= 指定設備的最大傳輸單元(MTU)大小(單位:字節)。若啟用 IPv6 且設置值小於 1280(IPv6 最小 MTU),系統會自動調整為此值。設置較大的 MTU(例如使用 jumbo frames)可大幅提升傳輸性能。 整數,可加上單位 K、M、G(以 1024 為底)
Multicast= 是否允許使用 多播 布爾值

[Network] 小節

[編輯 | 編輯原始碼]
參數 說明 可接受的值 默認值
DHCP= 控制 DHCPv4 或 DHCPv6 客戶端支持。 布爾值、ipv4, ipv6 no
DHCPServer= 啟用時將啟動 DHCPv4 伺服器。 布爾值 no
MulticastDNS= 啟用 多播 DNS 支持。若設為 resolve,僅啟用名稱解析功能,不註冊主機或廣播服務。 布爾值、resolve false
DNSSEC= 控制是否啟用 DNSSEC 驗證支持。設為 allow-downgrade 時,在不支持 DNSSEC 的網絡中將自動停用以提高兼容性。 布爾值、allow-downgrade false
DNS= 設置靜態 DNS 地址。可指定多個值。 inet_pton(3)
Domains= 指定此連接使用哪些域名解析,systemd.network(5) § [NETWORK] SECTION OPTIONS 域名,可加上波浪號(~)表示僅供解析使用
IPv4Forwarding=IPv6Forwarding= 啟用時,此接口接收的(IPv4 / IPv6)包可根據路由錶轉發至其他接口。對應內核的 net.ipv4/6.conf.INTERFACE.forwarding sysctl 選項。詳見 Internet sharing#Enable packet forwarding 布爾值 no
IPMasquerade= 啟用時,此接口轉發的包會被偽裝為來自本機。此選項的設置可能會同時啟用 IPv4ForwardingIPv6Forwarding ipv4, ipv6, both, no no
IPv6PrivacyExtensions= 設置是否使用會定期變更的無狀態臨時地址(參見 RFC:4941)。prefer-public 表示啟用臨時地址,但偏好使用公開地址;kernel 則保留內核默認值。 布爾值、prefer-public, kernel no

[Address] 小節

[編輯 | 編輯原始碼]
參數 說明 可接受的值 默認值
Address= 可多次指定此鍵以設置多個 IP 地址。若未使用 DHCP,則此參數為必要項。若指定為 0.0.0.0(IPv4)或 ::(IPv6),系統會自動從全局未使用段中分配一個適當大小的地址範圍。 靜態 IPv4 或 IPv6 地址及其前綴長度(見 inet_pton(3)

[Route] 小節

[編輯 | 編輯原始碼]
  • Gateway= 此選項為「必要項」,除非使用直接路由或 DHCP。
  • Destination= 路由的目的地前綴,可加上斜線與前綴長度。
  • Metric= 路由的優先權。
  • Type= 路由的類型。
  • Table= 路由所使用的路由表 ID。
  • GatewayOnLink= 若設為 yes,則內核不再檢查網關是否可由本機直接連接(例如:是否連接至本地網絡)。可用於解決部分路由問題。

Destination 未在 [Route] 區段中指定,則該區段將視為默認路由。

提示:Address=Gateway= 直接寫入 [Network] 區段,可作為簡寫方式,適用於 [Address] 僅包含 Address[Route] 僅包含 Gateway 的情況。

[RoutingPolicyRule]

[編輯 | 編輯原始碼]

標準路由算法通常僅根據目標地址選擇包應發送的網關。但在複雜網絡中,這樣的判斷不一定足夠。

[RoutingPolicyRule] 區段允許你根據指定條件應用額外的路由規則,只應用至符合條件的包。

以下是部分可用的匹配條件:

  • TypeOfService=:匹配包的服務類型,值為 0 到 255 間的整數。
  • From=:源地址前綴。
  • To=:目的地地址前綴。
  • FirewallMark=:iptables 設置的防火牆標記值。
  • IncomingInterface=:包進入的接口。
  • OutgoingInterface=:包離開的接口。

其他可用選項:

  • Type=:Routing Policy Database(路由策略資料庫)的規則類型。
  • Table=:當包匹配此規則時要使用的路由表。
  • Priority=:此規則的優先級。規則會依優先級由小至大排序並應用。
  • InvertRule=:若設為 true,則此規則會反轉,即應用於**不符合**任何匹配條件的包。
  • SuppressPrefixLength=:若包的前綴長度小於等於指定值,則此規則不應用。

[DHCPv4]

[編輯 | 編輯原始碼]
參數 說明 可接受的值 默認值
UseDNS= 控制是否使用 DHCP 伺服器廣播的 DNS 伺服器信息。 布爾值 true
Anonymize= 若設為 true,則根據 RFC:7844(DHCP 客戶端匿名配置檔)限制發送可識別用戶的選項。 布爾值 false
UseDomains= 控制是否使用 DHCP 伺服器提供的域名作為 DNS 搜索域。若設為 route,僅用於 DNS 路由查詢,不用作搜索。可解決搭配 systemd-resolved 使用時的本地域名解析問題。 布爾值、route false
IPv6OnlyMode= 若設為 true,DHCP 客戶端會通知伺服器其支持僅 IPv6 運行(參見 RFC:8925)。若伺服器響應該選項,則客戶端會中止 DHCPv4 請求,不會獲取 IPv4 地址,並改為設置為 IPv6-only 模式。 布爾值 true(若啟用 IPv6 時)

[DHCPServer]

[編輯 | 編輯原始碼]

這是一個 DHCP 伺服器的示例配置,與 hostapd 搭配使用可建立無線熱點。IPMasquerade 會新增 NAT 所需的防火牆規則,並隱含 IPv4Forwarding=yes,以啟用 包轉發 功能。

/etc/systemd/network/wlan0.network
[Match]
Name=wlan0

[Network]
Address=10.1.1.1/24
DHCPServer=true
IPMasquerade=ipv4

[DHCPServer]
PoolOffset=100
PoolSize=20
EmitDNS=yes
DNS=9.9.9.9

netdev 文件

[編輯 | 編輯原始碼]

這一章節正在考慮移除。

原因:systemd.netdev(5) 手冊頁內容重複。 (在 Talk:Systemd-networkd 討論)


這些文件用於創建虛擬網絡設備。它們包含兩個區段:[Match][NetDev]。以下列出每個區段常用的設置鍵值。更多信息與示例請參閱 systemd.netdev(5)

這類文件將創建虛擬網絡設備。包含兩個小節:[Match][NetDev]。下列為每小節的通用配置。詳情及範例請參閱systemd.netdev(5)

[Match] 小節

[編輯 | 編輯原始碼]
  • Host= 主機名
  • Virtualization= 檢查是否運行於虛擬機中

[NetDev] 小節

[編輯 | 編輯原始碼]

最通用的配置為:

  • Name= 接口名稱。必須提供
  • Kind= 例如:bridge, bond, vlan, veth, sit,等等。必須提供
[編輯 | 編輯原始碼]

這些文件是自定義 udev 規則的替代方案,會在設備出現時由 udev 自動應用。它們包含兩個區段:[Match][Link]。以下列出各區段常用的設置鍵值。更多信息與示例請參閱 systemd.link(5)

提示:使用 # udevadm test-builtin net_setup_link /sys/path/to/network/device 來診斷 .link 文件的問題。

[Match] 小節

[編輯 | 編輯原始碼]
  • MACAddress= MAC 地址
  • Host= 主機名
  • Virtualization=
  • Type= 設備類型,例如 vlan

[Link] 小節

[編輯 | 編輯原始碼]
  • MACAddressPolicy= 持久 (persistent) 或隨機 (random) 地址,或
  • MACAddress= 指定的地址
注意:系統內建的 /usr/lib/systemd/network/99-default.link 文件對大部分基本情況已足夠使用。


容器下的應用

[編輯 | 編輯原始碼]

此服務由 systemd 提供。你會想要在主機及容器上 enablestart systemd-networkd.service

為了方便調試,強烈建議安裝 bridge-utilsnet-toolsiproute2 軟體包。

如果你使用 systemd-nspawn,可能需要修改 systemd-nspawn@.service,並在 ExecStart 行加入啟動選項。請參考 systemd-nspawn(1) 了解所有可用選項。

注意:若想利用 DHCP 自動配置 DNS,需要啟用 systemd-resolved,並將 /run/systemd/resolve/resolv.conf 符號連結到 /etc/resolv.conf。詳細信息請參考 systemd-resolved.service(8)

在開始配置容器網絡前,建議:

  • 停用所有 netctl(主機與容器)、dhcpcd(主機與容器)、systemd-networkd(僅容器)、及 systemd-nspawn@.service(僅主機)服務,避免衝突並方便調試。
  • 若容器要訪問網際網路,確認已啟用 數據包轉發。確保你的 .network 文件中未意外關閉轉發,因為如果沒有設置 IPForward=1systemd-networkd 會在該接口關閉轉發,即使全局已啟用。
  • 確認沒有任何 iptables 規則阻擋流量。
  • 啟動 daemon 後,使用 systemd 的 networkctl 指令查看網絡接口狀態。

以下設定中,

  • 我們將限制 ip a 指令只顯示相關接口
  • 假設「主機」是你啟動的主要作業系統,「容器」是你的來賓虛擬機
  • 所有接口名稱及 IP 地址皆為示範用途

基本 DHCP 網絡

[編輯 | 編輯原始碼]

此設定會為主機與容器啟用 DHCP IP。兩系統會共用相同 IP,因共用同一接口。

/etc/systemd/network/MyDhcp.network
[Match]
Name=en*

[Network]
DHCP=ipv4

接著在容器啟用並啟動 systemd-networkd.service

當然你可以用實際網卡名稱替換 en*,可用 ip link 指令查詢。

  • 主機與容器上執行:
$ ip a
2: enp7s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 14:da:e9:b5:7a:88 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.72/24 brd 192.168.1.255 scope global enp7s0
       valid_lft forever preferred_lft forever
    inet6 fe80::16da:e9ff:feb5:7a88/64 scope link 
       valid_lft forever preferred_lft forever

默認會使用 DHCP 伺服器返回的 hostname 作為臨時主機名。

若要更改,請在 [DHCPv4] 區段加入 UseHostname=false

/etc/systemd/network/MyDhcp.network
[DHCPv4]
UseHostname=false

若不想自行設定 /etc/resolv.conf 的 DNS,想用 DHCP 配置,需 enable systemd-resolved.service 並建立符號連結:

# ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf

詳情參見 systemd-resolved.service(8)

注意:若透過 /usr/bin/arch-chroot 進入系統分區,需在 chroot 外的掛載分區上建立符號連結,因為 arch-chroot 會將文件連結到實際運行環境。

DHCP 用於兩個獨立 IP

[編輯 | 編輯原始碼]

橋接埠

[編輯 | 編輯原始碼]

先建立虛擬橋接接口,讓 systemd 建立名為 br0 的以太網橋接設備。

/etc/systemd/network/MyBridge.netdev
[NetDev]
Name=br0
Kind=bridge

重新 Restart systemd-networkd.service,讓 systemd 建立橋接。

主機與容器上:

$ ip a
3: br0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default 
    link/ether ae:bd:35:ea:0c:c9 brd ff:ff:ff:ff:ff:ff

此時 br0 接口已顯示但狀態為 DOWN。

綁定以太網卡到橋接埠

[編輯 | 編輯原始碼]

接著將符合名稱 en* 的接口加入橋接 br0

/etc/systemd/network/bind.network
[Match]
Name=en*

[Network]
Bridge=br0

以太網卡本身不得配置 DHCP 或 IP,橋接需要無 IP 的接口,請修改原有 /etc/systemd/network/MyEth.network 移除 IP 配置。

橋接網絡

[編輯 | 編輯原始碼]

橋接建立且已綁定以太網卡後,需為橋接接口指定 IP 配置。以下範例為 DHCP。

/etc/systemd/network/mybridge.network
[Match]
Name=br0

[Network]
DHCP=ipv4

添加選項以引導容器

[編輯 | 編輯原始碼]

若要讓主機和容器取得不同 IP,需要將容器網絡與主機「斷開」。加入啟動參數 --network-bridge=br0

# systemd-nspawn --network-bridge=br0 -bD /path_to/my_container

成果

[編輯 | 編輯原始碼]
  • 宿主機上
$ ip a
3: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 14:da:e9:b5:7a:88 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.87/24 brd 192.168.1.255 scope global br0
       valid_lft forever preferred_lft forever
    inet6 fe80::16da:e9ff:feb5:7a88/64 scope link 
       valid_lft forever preferred_lft forever
6: vb-MyContainer: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UP group default qlen 1000
    link/ether d2:7c:97:97:37:25 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::d07c:97ff:fe97:3725/64 scope link 
       valid_lft forever preferred_lft forever
  • 容器中
$ ip a
2: host0: <BROADCAST,MULTICAST,ALLMULTI,AUTOMEDIA,NOTRAILERS,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 5e:96:85:83:a8:5d brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.73/24 brd 192.168.1.255 scope global host0
       valid_lft forever preferred_lft forever
    inet6 fe80::5c96:85ff:fe83:a85d/64 scope link 
       valid_lft forever preferred_lft forever

注意

[編輯 | 編輯原始碼]
  • 主機的 br0 與容器的 host0 現有各自的 IP
  • 新增兩個接口:主機的 vb-MyContainer 及容器的 host0。這是因為使用了 --network-bridge=br0,該選項暗示了 --network-veth,在主機與容器間建立虛擬以太網橋接連接。
  • 容器的 DHCP IP 是由系統 /usr/lib/systemd/network/80-container-host0.network 提供。
  • 主機上執行:
$ brctl show
bridge name	bridge id		STP enabled	interfaces
br0		8000.14dae9b57a88	no		enp7s0
							vb-MyContainer

此輸出證明橋接有兩個綁定接口。

  • 宿主機上的路由表:
$ ip route
default via 192.168.1.254 dev br0 
192.168.1.0/24 dev br0  proto kernel  scope link  src 192.168.1.87
  • 容器中的路由表:
$ ip route
default via 192.168.1.254 dev host0 
192.168.1.0/24 dev host0  proto kernel  scope link  src 192.168.1.73

以上顯示 br0host0 已啟用並擁有 IP 與默認網關 192.168.1.254。網關地址由 systemd-networkd 自動獲取。

$ cat /run/systemd/resolve/resolv.conf
nameserver 192.168.1.254

靜態 IP 網絡

[編輯 | 編輯原始碼]

為每個設備設置靜態 IP 有利於部署 FTP、HTTP、SSH 等服務。只要系統中的 /usr/lib/systemd/network/99-default.link 包含 MACAddressPolicy=persistent(默認啟用),每台設備重啟後都會保留相同的 MAC 地址,方便將服務路由到目標設備。

配置步驟如下:

主機端

配置與 #DHCP 用於兩個獨立 IP 類似。先創建虛擬橋接接口並綁定實體網卡,通過以下兩個文件實現:

/etc/systemd/network/MyBridge.netdev /etc/systemd/network/MyEth.network

然後為虛擬橋接接口設置 IP 和 DNS,示例如下:

/etc/systemd/network/MyBridge.network
[Match]
Name=br0

[Network]
DNS=192.168.1.254
Address=192.168.1.87/24
Gateway=192.168.1.254

容器端

先移除系統默認提供的 DHCP 配置文件 /usr/lib/systemd/network/80-container-host0.network,以永久方式(例如 systemd 更新後仍然生效)在容器中執行:

  1. ln -sf /dev/null /etc/systemd/network/80-container-host0.network

若只想在主機端使用靜態 IP,容器仍通過 DHCP 獲取 IP,則可以保留此文件。

然後為默認接口 host0 設置靜態 IP,並在容器中 enable and start systemd-networkd.service,示例如下:

/etc/systemd/network/MyVeth.network
[Match]
Name=host0

[Network]
DNS=192.168.1.254
Address=192.168.1.94/24
Gateway=192.168.1.254

提示與技巧

[編輯 | 編輯原始碼]

交互界面及桌面集成

[編輯 | 編輯原始碼]

systemd-networkd 並不提供圖形交互式管理界面。但仍有一些工具可以用於顯示或修改當前網絡狀態、接收通知或處理無線網絡配置:

  • networkctl 提供了一個命令行接口,用於查詢或修改網絡接口狀態。值得注意的是,若只想修改接口的某些行為,需要先 編輯 一項或多項位於 /etc/systemd/network/ 中的配置文件。
  • networkd 配置了 wpa_supplicant 時,wpa_cliwpa_gui 可用於動態關聯與配置 WLAN 接口。
  • networkd-dispatcherAUR 服務允許在網絡接口狀態變化時執行腳本,功能類似於 NetworkManager-dispatcher
  • networkd-notify-gitAUR 會在接口狀態發生變化時生成簡單通知消息。
  • 作為 DNS 解析器,systemd-resolved 可以通過 resolvectl status 命令可視化當前 DNS 伺服器信息。

基於 SSID(位置)配置靜態 IP 或 DHCP

[編輯 | 編輯原始碼]

常見場景中,家庭無線使用 DHCP,而公司無線則使用靜態 IP。這種混合設置可通過如下方式配置:

注意:文件名中的數字決定了處理順序。用戶可以在 [Match] 區段按 SSID、BSSID 或兩者同時匹配。
/etc/systemd/network/24-wireless-office.network
# 專門用於辦公 Wi‑Fi 的配置
[Match]
Name=wlp2s0
SSID=office_ap_name
#BSSID=aa:bb:cc:dd:ee:ff

[Network]
Address=10.1.10.9/24
Gateway=10.1.10.1
DNS=10.1.10.1
#DNS=8.8.8.8
/etc/systemd/network/25-wireless-dhcp.network
# 對其他任何 Wi‑Fi 網絡使用 DHCP
[Match]
Name=wlp2s0

[Link]
RequiredForOnline=routable

[Network]
DHCP=yes

有線與無線接口綁定

[編輯 | 編輯原始碼]

參見 Wireless bonding

綁定(bonding)允許通過多個接口共享連接,例如當有線接口斷開時,無線仍保持連接,網絡不中斷。

創建一個 bond 接口,此處使用的模式為 active‑backup,即如果主接口斷開,則切換到備份接口:

/etc/systemd/network/30-bond0.netdev
[NetDev]
Name=bond0
Kind=bond

[Bond]
Mode=active-backup
PrimaryReselectPolicy=always
MIIMonitorSec=1s

將有線接口設為主接口:

/etc/systemd/network/30-ethernet-bond0.network
[Match]
Name=enp0s25

[Network]
Bond=bond0
PrimarySlave=true

將無線接口設為備份接口:

/etc/systemd/network/30-wifi-bond0.network
[Match]
Name=wlan0

[Network]
Bond=bond0
注意:[Match] 區段使用 MAC 地址時,建議使用 PermanentMACAddress 而非 MACAddress,詳見 upstream 討論

像配置普通接口一樣配置 bond 接口:

/etc/systemd/network/30-bond0.network
[Match]
Name=bond0

[Link]
RequiredForOnline=routable

[Network]
BindCarrier=enp0s25 wlan0
DHCP=yes

現在,如果有線網絡斷開,系統將自動切換到無線連接,保持聯網狀態:

$ networkctl
IDX LINK    TYPE     OPERATIONAL      SETUP     
  1 lo      loopback carrier          unmanaged 
  2 enp0s25 ether    no-carrier       configured
  3 bond0   bond     degraded-carrier configured
  5 wlan0   wlan     enslaved         configured

4 links listed.

加快 TCP 慢啟動過程

[編輯 | 編輯原始碼]

在帶寬較高(如 >10 Mbit/s)且延遲中等的連接(如家庭寬帶)上,TCP 默認的慢啟動算法偏保守,會導致下載初期速度較慢,需要數秒才能達到滿速。在使用 pacman 更新包時尤其明顯,每個包下載都從較慢速率起步,常在加速完成前就結束。

通過調整以下參數,可以讓 TCP 連接以更大窗口啟動,從而避免慢啟動階段造成的性能損失[1]。雖然在低速連接或設置過高的情況下會因丟包而降低性能,但在帶寬充足的環境下可顯著提升體驗。

使用前後請務必進行基準測試,以確認網絡實際獲得提升;若下載已經沒有慢啟動問題,則無需調整。測試時,應對高低速伺服器都做測試,避免提升高速連接卻犧牲低速訪問。

編輯對應連接的 `.network` 文件以調整:

/etc/systemd/network/eth0.network
[Match]
Name=eth0

#[Network]
#Gateway=...  <-- 如果已存在,則刪除並在下面 Route 中指定

[Route]
# 此選項適用於 DHCP 提供的網關,如手動指定網關,也應寫在這裡。
Gateway=_dhcp4

# 以下為默認值 10,單位為 MSS (1460 字節) 的倍數
InitialCongestionWindow=10
InitialAdvertisedReceiveWindow=10

默認值 10 適合 <10 Mbit/s;若你是 100 Mbit/s 連接,建議使用 30。手冊 systemd.network(5) § [ROUTE] SECTION OPTIONS 表示 100 屬於過高。

若啟用 sysctl 設置 net.ipv4.tcp_slow_start_after_idle,當連接空閒一段時間後,TCP 將回到上述初始值;若禁用,則保留協商後的更大窗口。無論設置如何,每個 **新 TCP 連接** 都從上述 Initial* 值開始。

sysctl 參數 net.ipv4.tcp_congestion_control 決定擁塞期間窗口的動態調整,與 Initial* 設置無直接關係。Initial* 僅控制每條 TCP 新連接的初始窗口,後續仍由擁塞算法調整。提高初始值可以減少協商延遲,但若設置不當,會適得其反。

防止多個默認路由衝突

[編輯 | 編輯原始碼]

systemd-networkd 未按接口類型設置默認路由度量,使用多個網絡設備時,需手動設置度量值。例如,下列 `ip route` 輸出顯示多個默認路由:

ip route
default via 10.30.1.1 dev eno2 proto dhcp src 10.30.1.15 metric 1024
default via 192.168.1.254 dev eno1 proto dhcp src 172.18.105.104 metric 1024

由於度量值一致,系統會產生競爭條件。根據接口啟用順序選擇默認路由,例如 eno2 先啟用則被優先選中,可能導致 eno1 可用時卻被忽略。

為避免此問題,應為各接口設置不同的 RouteMetric= 值。參考 #有線與無線接口綁定 區段的示例。

如某設備不應成為默認路由源,可在其 .network 中使用 UseRoutes=false 選項,忽略 DHCP 提供的路由條目。該配置對於僅連接至另一台設備時特別有用。

在已有接口上配置第二個靜態 IP 及其獨立 MAC

[編輯 | 編輯原始碼]

若希望系統在路由器中識別為兩個不同設備,可為某接口創建擁有獨立 IP 和 MAC 的虛擬接口。

在物理接口上添加一個 macvlan 虛擬接口並指定唯一 MAC:

/etc/systemd/network/25-eth210.netdev
[NetDev]
Name=eth210
Kind=macvlan
MACAddress=00:11:22:33:44:55

[MACVLAN]
Mode=bridge

然後為該虛擬接口創建配置文件,使用相同子網和網關,但 IP 避開 DHCP 分配範圍:

/etc/systemd/network/25-eth210.network
[Match]
Name=eth210

[Network]
Address=192.168.132.210/24
Gateway=192.168.132.1

[Route]
Destination=192.168.132.0/24
Metric=2

該虛擬 macvlan 接口的路由度量定為 2,因此除非特別指定,否則系統會優先通過主接口(度量值為默認 1)訪問網絡。

最後,請在主接口的 `.network` 文件的 `[Network]` 段中添加 MACVLAN=eth210

為了讓路由器「認識」這個新 MAC 地址並接受它,可作為 root 運行 arping -I eth210 192.168.132.1。配置路由器後,你可以測試虛擬接口的網際網路連通性,例如運行:curl --interface 192.168.132.210 ifconfig.me應會返回你的公網 IP。

故障排查

[編輯 | 編輯原始碼]

啟動時「掛載」服務失敗

[編輯 | 編輯原始碼]

如果你運行的是 SambaNFS 等服務,而它們在網絡尚未啟動時就嘗試啟動而失敗,可以考慮 enable systemd-networkd-wait-online.service。不過這通常不是必要的,因為大多數網絡服務即使網絡尚未完全配置,也能正常啟動。

systemd-resolve 不搜索本地域

[編輯 | 編輯原始碼]

systemd-resolved 在僅提供主機名時,可能不會自動搜索本地域,即使相應的 .network 文件中設定了 UseDomains=yesDomains=[domain-list],並且在 resolv.conf 中正確生成了 search [domain-list]

你可以通過運行 networkctl statusresolvectl status 來確認搜索域是否被正確讀取。

可能的解決方案:

禁用 LLMNR,讓 systemd-resolved 立即繼續嘗試 DNS 後綴。

簡化 /etc/nsswitch.confhosts 條目(例如移除 [!UNAVAIL=return])。

使用完整限定域名(FQDN)。

使用 /etc/hosts 解析主機名。

放棄使用 systemd 的 resolve,改用 glibc 的 DNS 解析方式。

第二台電腦無法使用橋接網絡

[編輯 | 編輯原始碼]

如果第一台電腦有兩個 LAN 接口,第二台電腦只有一個 LAN 並連接到第一台電腦,那麼為了讓第二台電腦能夠通過橋接接口訪問所有網絡,需要執行以下命令:

# sysctl net.bridge.bridge-nf-filter-pppoe-tagged=0
# sysctl net.bridge.bridge-nf-filter-vlan-tagged=0
# sysctl net.bridge.bridge-nf-call-ip6tables=0
# sysctl net.bridge.bridge-nf-call-iptables=0
# sysctl net.bridge.bridge-nf-call-arptables=0


參閱

[編輯 | 編輯原始碼]