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.conf 和 systemd-resolved 如何互相影響,以便正確配置要使用的 DNS 伺服器。更多相關信息可以參見 systemd-resolved
- 注意:即使沒有啟用 systemd-networkd, systemd-resolved 也能夠提供服務。
啟用 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 請求。
/etc/systemd/network/20-wired.network
[Match] Name=enp1s0 [Link] RequiredForOnline=routable [Network] DHCP=yes
/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_supplicant 或 iwd,配置好的無線適配器。
/etc/systemd/network/25-wireless.network
[Match] Name=wlp2s0 [Link] RequiredForOnline=routable [Network] DHCP=yes IgnoreCarrierLoss=3s
如果無線適配器有一個靜態地址,它的配置(除了接口的名字)跟有線適配器是一樣的。
這些設置將為有線和無線連接自動獲取 DHCP IP, 並使用 metric 讓內核動態地決定使用的連結。這樣,網絡在有線連接斷開時就不會有明顯的中斷。內核的 route metric (與 ip 配置一致) 會在具有多個設備時決定使用哪個傳出數據包。如果某個連接斷開,其他的接口就會自動接管,而不會出現網絡中斷(正在進行的傳輸可能會出現問題,不過那是另一層的問題了。)
/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
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*將匹配任何以太網設備), 布爾值可以簡單地寫為yes或no。 - 根據這個線索的討論,最佳實踐是 to setup specific container network settings inside the container with networkd configuration files.
- Systemd 使用
1, true, yes, on作為邏輯「真」值,0, false, no, off作為邏輯「假」值
這類文件用於設置網絡配置變量,尤其適用於伺服器和容器。
.network文件含有下列小節:[Match]、[Link]、[Network]、[Address]、[Route]以及[DHCP]。下列為每小節的通用配置。詳情及範例請參閱systemd.network(5)。
| 參數 | 說明 | 可接受的值 | 默認值 |
|---|---|---|---|
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
|
| 參數 | 說明 | 可接受的值 | 默認值 |
|---|---|---|---|
MACAddress= |
指定設備的硬體地址。可用於 MAC 地址偽造。 | 使用冒號、連字符或點號分隔的十六進制 MAC 地址 | |
MTUBytes= |
指定設備的最大傳輸單元(MTU)大小(單位:字節)。若啟用 IPv6 且設置值小於 1280(IPv6 最小 MTU),系統會自動調整為此值。設置較大的 MTU(例如使用 jumbo frames)可大幅提升傳輸性能。 | 整數,可加上單位 K、M、G(以 1024 為底) | |
Multicast= |
是否允許使用 多播。 | 布爾值 |
| 參數 | 說明 | 可接受的值 | 默認值 |
|---|---|---|---|
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= |
啟用時,此接口轉發的包會被偽裝為來自本機。此選項的設置可能會同時啟用 IPv4Forwarding 或 IPv6Forwarding。 |
ipv4, ipv6, both, no
|
no
|
IPv6PrivacyExtensions= |
設置是否使用會定期變更的無狀態臨時地址(參見 RFC:4941)。prefer-public 表示啟用臨時地址,但偏好使用公開地址;kernel 則保留內核默認值。 |
布爾值、prefer-public, kernel
|
no
|
| 參數 | 說明 | 可接受的值 | 默認值 |
|---|---|---|---|
Address= |
可多次指定此鍵以設置多個 IP 地址。若未使用 DHCP,則此參數為必要項。若指定為 0.0.0.0(IPv4)或 ::(IPv6),系統會自動從全局未使用段中分配一個適當大小的地址範圍。 |
靜態 IPv4 或 IPv6 地址及其前綴長度(見 inet_pton(3)) |
-
Gateway=此選項為「必要項」,除非使用直接路由或 DHCP。 -
Destination=路由的目的地前綴,可加上斜線與前綴長度。 -
Metric=路由的優先權。 -
Type=路由的類型。 -
Table=路由所使用的路由表 ID。 -
GatewayOnLink=若設為yes,則內核不再檢查網關是否可由本機直接連接(例如:是否連接至本地網絡)。可用於解決部分路由問題。
若 Destination 未在 [Route] 區段中指定,則該區段將視為默認路由。
Address= 與 Gateway= 直接寫入 [Network] 區段,可作為簡寫方式,適用於 [Address] 僅包含 Address、[Route] 僅包含 Gateway 的情況。標準路由算法通常僅根據目標地址選擇包應發送的網關。但在複雜網絡中,這樣的判斷不一定足夠。
[RoutingPolicyRule] 區段允許你根據指定條件應用額外的路由規則,只應用至符合條件的包。
以下是部分可用的匹配條件:
-
TypeOfService=:匹配包的服務類型,值為 0 到 255 間的整數。 -
From=:源地址前綴。 -
To=:目的地地址前綴。 -
FirewallMark=:iptables 設置的防火牆標記值。 -
IncomingInterface=:包進入的接口。 -
OutgoingInterface=:包離開的接口。
其他可用選項:
-
Type=:Routing Policy Database(路由策略資料庫)的規則類型。 -
Table=:當包匹配此規則時要使用的路由表。 -
Priority=:此規則的優先級。規則會依優先級由小至大排序並應用。 -
InvertRule=:若設為true,則此規則會反轉,即應用於**不符合**任何匹配條件的包。 -
SuppressPrefixLength=:若包的前綴長度小於等於指定值,則此規則不應用。
| 參數 | 說明 | 可接受的值 | 默認值 |
|---|---|---|---|
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 時)
|
這是一個 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
這些文件用於創建虛擬網絡設備。它們包含兩個區段:[Match] 與 [NetDev]。以下列出每個區段常用的設置鍵值。更多信息與示例請參閱 systemd.netdev(5)。
這類文件將創建虛擬網絡設備。包含兩個小節:[Match] 和 [NetDev]。下列為每小節的通用配置。詳情及範例請參閱systemd.netdev(5)。
-
Host=主機名 -
Virtualization=檢查是否運行於虛擬機中
最通用的配置為:
-
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 文件的問題。-
MACAddress=MAC 地址 -
Host=主機名 Virtualization=-
Type=設備類型,例如 vlan
-
MACAddressPolicy=持久 (persistent) 或隨機 (random) 地址,或 -
MACAddress=指定的地址
/usr/lib/systemd/network/99-default.link 文件對大部分基本情況已足夠使用。
此服務由 systemd包 提供。你會想要在主機及容器上 enable 並 start systemd-networkd.service。
為了方便調試,強烈建議安裝 bridge-utils包、net-tools包 與 iproute2包 軟體包。
如果你使用 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=1,systemd-networkd會在該接口關閉轉發,即使全局已啟用。 - 確認沒有任何 iptables 規則阻擋流量。
- 啟動 daemon 後,使用 systemd 的
networkctl指令查看網絡接口狀態。
以下設定中,
- 我們將限制
ip a指令只顯示相關接口 - 假設「主機」是你啟動的主要作業系統,「容器」是你的來賓虛擬機
- 所有接口名稱及 IP 地址皆為示範用途
此設定會為主機與容器啟用 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 會將文件連結到實際運行環境。先建立虛擬橋接接口,讓 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
以上顯示 br0 與 host0 已啟用並擁有 IP 與默認網關 192.168.1.254。網關地址由 systemd-networkd 自動獲取。
$ cat /run/systemd/resolve/resolv.conf
nameserver 192.168.1.254
為每個設備設置靜態 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包 更新後仍然生效)在容器中執行:
- 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_cli 和 wpa_gui 可用於動態關聯與配置 WLAN 接口。
- networkd-dispatcherAUR 服務允許在網絡接口狀態變化時執行腳本,功能類似於 NetworkManager-dispatcher。
- networkd-notify-gitAUR 會在接口狀態發生變化時生成簡單通知消息。
- 作為 DNS 解析器,systemd-resolved 可以通過
resolvectl status命令可視化當前 DNS 伺服器信息。
常見場景中,家庭無線使用 DHCP,而公司無線則使用靜態 IP。這種混合設置可通過如下方式配置:
/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
像配置普通接口一樣配置 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.
在帶寬較高(如 >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 的虛擬接口。
在物理接口上添加一個 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。
如果你運行的是 Samba 或 NFS 等服務,而它們在網絡尚未啟動時就嘗試啟動而失敗,可以考慮 enable systemd-networkd-wait-online.service。不過這通常不是必要的,因為大多數網絡服務即使網絡尚未完全配置,也能正常啟動。
systemd-resolved 在僅提供主機名時,可能不會自動搜索本地域,即使相應的 .network 文件中設定了 UseDomains=yes 或 Domains=[domain-list],並且在 resolv.conf 中正確生成了 search [domain-list]。
你可以通過運行 networkctl status 或 resolvectl status 來確認搜索域是否被正確讀取。
可能的解決方案:
禁用 LLMNR,讓 systemd-resolved 立即繼續嘗試 DNS 後綴。
簡化 /etc/nsswitch.conf 中 hosts 條目(例如移除 [!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
- systemd.networkd man page
- Tom Gundersen, main systemd-networkd developer, G+ home page
- Tom Gundersen posts on Core OS blog
- How to set up systemd-networkd with wpa_supplicant (WonderWoofy's walkthrough on Arch forums)