systemd-networkd - Arch Linux 中文维基

跳至內容

# systemd-networkd

出自 Arch Linux 中文维基

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

原因：解釋重複，結構鬆散（在Talk:Systemd-networkd討論）

翻譯狀態：

- 本文（或部分內容）譯自 Systemd-networkd，最近一次同步於 2025-07-06，若英文版本有所更改，則您可以幫助同步與翻譯更改的內容。
- 您可以在 ArchWiki 的對應頁面找到本文翻譯的原始修訂歷史。
- 本文可能與英文原文存在出入。

相關文章

- systemd
- systemd-resolved
- systemd-nspawn
- Network bridge
- Network configuration
- Wireless network configuration
- Category:Network configuration

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-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_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 配置一致) 會在具有多個設備時決定使用哪個傳出數據包。如果某個連接斷開，其他的接口就會自動接管，而不會出現網絡中斷（正在進行的傳輸可能會出現問題，不過那是另一層的問題了。）

注意：`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*` 將匹配任何以太網設備）， 布爾值可以簡單地寫為 `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 文件

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

.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=` | 啟用時，此接口轉發的包會被偽裝為來自本機。此選項的設置可能會同時啟用 `IPv4Forwarding` 或 `IPv6Forwarding`。 | `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，等等。必須提供

### link 文件

這些文件是自定義 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包 提供。你會想要在主機及容器上 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 網絡

此設定會為主機與容器啟用 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

以上顯示 `br0` 與 `host0` 已啟用並擁有 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_cli 和 wpa_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。

## 故障排查

### 啟動時「掛載」服務失敗

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

### systemd-resolve 不搜索本地域

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)

分類：​

- 使用「模板:風格」標記的頁面或章節
- 網絡管理器
- 虛擬化
- 使用「模板:Remove」標記的章節

systemd-networkd
新增話題