使用 dhcp 設定的多個介面在 Debian Stretch 上設定預設路由

使用 dhcp 設定的多個介面在 Debian Stretch 上設定預設路由

在具有多個介面的 Debian Stretch 系統上,我需要透過特定介面定義預設路由ens3。此介面10.33.34.2透過 dhcp 接收其 IP 位址。

我根據自己的需求調整了以下指南:

5.3.無需 GUI 的現代網路配置

/etc/systemd/network/route.network因此,我創建了一個包含以下內容的文件

[Match]
Name=ens3

[Network]
Gateway=10.33.34.1

但是,啟動時預設路由設定不正確。

systemd-networkd根據以下內容啟用了調試如何調試systemd-networkd?

重新啟動後systemd-networkd,我在日誌中看到以下內容:

Aug 21 13:43:13 vpn systemd-networkd[15671]: ens3: Setting routes
Aug 21 13:43:13 vpn systemd-networkd[15671]: ens3: Could not set route: Network is unreachable
Aug 21 13:43:13 vpn systemd-networkd[15671]: ens3: Routes set
Aug 21 13:43:13 vpn dhclient[15709]: Listening on LPF/ens3/52:54:00:3f:f1:d0
Aug 21 13:43:13 vpn dhclient[15709]: Sending on LPF/ens3/52:54:00:3f:f1:d0
Aug 21 13:43:13 vpn dhclient[15709]: Sending on Socket/fallback
Aug 21 13:43:13 vpn dhclient[15709]: DHCPDISCOVER on ens3 to 255.255.255.255 port 67 interval 8
Aug 21 13:43:13 vpn dhclient[15709]: DHCPREQUEST of 10.33.34.2 on ens3 to 255.255.255.255 port 67
Aug 21 13:43:13 vpn dhclient[15709]: DHCPOFFER of 10.33.34.2 from 10.33.34.1
Aug 21 13:43:13 vpn dhclient[15709]: DHCPACK of 10.33.34.2 from 10.33.34.1
Aug 21 13:43:13 vpn systemd-networkd[15671]: ens3: Adding address: 10.33.34.2/24 (valid forever)

看來networkd會在透過dhcp分配IP位址之前嘗試設定路由。

如何使用 systemd 取得設定到特定介面的預設路由?

==編輯==

我錯誤地假設 systemd-networkd 會啟動介面。如果我重新啟動系統,我會看到

$ sudo service systemd-networkd status
● systemd-networkd.service - Network Service
   Loaded: loaded (/lib/systemd/system/systemd-networkd.service; disabled; vendor pres
  Drop-In: /etc/systemd/system/systemd-networkd.service.d
           └─10-debug.conf
   Active: inactive (dead)
     Docs: man:systemd-networkd.service(8)

因此,啟動時配置/etc/systemd/network/route.network不會生效。目前,我想知道什麼服務負責啟動所有網路設備。

==編輯2==

本文作者:史蒂文艾維森提供了有關網路設備如何啟動systemd-udevd以及如何修改介面配置的良好見解。

透過測試和進一步閱讀,我還將重申我的問題:多個介面以隨機順序啟動。每個都獲得正確的 dhcp 配置。要啟動的第一個介面將設定預設路由,因此10.33.34.1不會始終用作預設路由

答案1

如果全部如果介面透過預設路由接收有效的 DHCP 提供,那麼就無法透過設定dhclient來忽略這些資訊——這不是您可以使用systemdudev或連接 init 系統的任何其他東西執行的操作。

描述了一種方法這裡:您在 的「hook」目錄之一中建立(當然,您也可以使用編輯器)一個 shell 腳本片段dhclient

cat << EOF > /etc/dhcp/dhclient-enter-hooks.d/restrict-default-route
## Only the DHCP server talking to ens3 is allowed to give us a default
## route.  Other interfaces only get local-segment configuration.
case ${interface} in
  ens3)
    ;;
  *)
    unset new_routers
    ;;
esac
EOF

它將只接受routers具有預設路由的選項ens3。計時沒有問題,確定要使用哪些文件也沒有問題,並且路由僅在啟動並收到 DHCP 提議systemd時才有效。ens3

答案2

對於 Debian Stretch,介面由 udev 命名,基本配置發生在/etc/network/interfaces.如編輯 2 所述,多個介面以隨機順序顯示。每個都獲得正確的 dhcp 配置。第一個開啟的介面將設定預設路由。我們只需接受所需介面的預設路由。這可以是透過鉤子實現dhcpclient

新增一個新的鉤子腳本/etc/dhcp/dhclient-enter-hooks.d/nodefaultroute

#!/bin/sh
## Prevent DHCP server on eth0 from forcing a default route on us

case ${interface} in
  ens8|ens9)
     printf "executing ip route delete default via $new_routers\n" 
     ip route delete default via $new_routers
  ;;
     *)
  ;;
esac

可以擴充Whereens8|ens9以列出所有不能接受預設路由的介面。

相關內容