
在具有多個介面的 Debian Stretch 系統上,我需要透過特定介面定義預設路由ens3
。此介面10.33.34.2
透過 dhcp 接收其 IP 位址。
我根據自己的需求調整了以下指南:
/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
來忽略這些資訊——這不是您可以使用systemd
、udev
或連接 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
以列出所有不能接受預設路由的介面。