
Auf einem Debian-Stretch-System mit mehreren Schnittstellen muss ich die Standardroute über eine bestimmte Schnittstelle definieren ens3
. Diese Schnittstelle erhält ihre IP-Adresse 10.33.34.2
über DHCP.
Ich habe folgende Anleitung an meine Bedürfnisse angepasst:
5.3. Die moderne Netzwerkkonfiguration ohne GUI
So habe ich eine Datei /etc/systemd/network/route.network
mit folgendem Inhalt erstellt
[Match]
Name=ens3
[Network]
Gateway=10.33.34.1
Allerdings wird die Standardroute beim Start nicht richtig eingestellt.
Ich habe das Debuggen aktiviert systemd-networkd
gemäßWie debuggt man systemd-networkd?
Nach dem Neustart systemd-networkd
sehe ich Folgendes in den Protokollen:
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)
Es scheint, dass networkd versucht, die Route festzulegen, bevor die IP-Adresse per DHCP zugewiesen wird.
Wie kann ich mit systemd die Standardroute auf eine bestimmte Schnittstelle einstellen?
== Bearbeiten ==
Ich habe mich geirrt, als ich annahm, dass systemd-networkd die Schnittstellen hochfährt. Wenn ich das System neu starte, sehe ich
$ 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)
Daher /etc/systemd/network/route.network
hat die Konfiguration beim Booten keine Auswirkungen. Derzeit frage ich mich, welcher Dienst dafür verantwortlich ist, alle Netzwerkgeräte hochzufahren.
== Bearbeiten 2 ==
Dieser Artikel von Steven Ivesonbietet einen guten Einblick, wie Netzwerkgeräte gestartet werden systemd-udevd
und wie die Schnittstellenkonfiguration geändert wird.
Durch Testen und weitere Lektüre würde ich mein Problem noch einmal umschreiben: Die verschiedenen Schnittstellen werden in zufälliger Reihenfolge aufgerufen. Jede erhält eine korrekte DHCP-Konfiguration. Die erste Schnittstelle, die aufgerufen wird, legt die Standardroute fest und 10.33.34.1
wird daher nicht immer als Standardroute verwendet.
Antwort1
WennalleSchnittstellen empfangen gültige DHCP-Angebote mit einer Standardroute, dann kommen Sie nicht darum herum, dhclient
diese so zu konfigurieren, dass sie ignoriert werden – das ist nichts, was Sie mit , oder irgendetwas anderem tun können, systemd
das udev
mit dem Init-System verbunden ist.
Eine Möglichkeit hierzu istHier: Sie erstellen (natürlich können Sie auch einen Editor verwenden) ein Shell-Skriptfragment in einem der "Hook"-Verzeichnisse von 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
Dadurch wird nur die Option mit der Standardroute für akzeptiert ens3
. Keine Probleme mit dem Timing, keine Probleme beim Herausfinden, welche systemd
Dateien verwendet werden sollen, und die Route ist nur gültig, wenn ens3
aktiv ist und das DHCP-Angebot erhalten hat.
Antwort2
Bei Debian Stretch werden die Schnittstellen nach udev benannt und die Grundkonfiguration erfolgt in /etc/network/interfaces
. Wie in Bearbeitung 2 angegeben, werden die verschiedenen Schnittstellen in zufälliger Reihenfolge aufgerufen. Jede erhält eine korrekte DHCP-Konfiguration. Die erste aufgerufene Schnittstelle legt die Standardroute fest. Wir müssen nur die Standardroute für die gewünschte Schnittstelle akzeptieren. Dies kann seinerreicht durch einen Hakenzumdhcpclient
Fügen Sie ein neues Hook-Skript hinzu /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
Wobei dies ens8|ens9
erweitert werden kann, um alle Schnittstellen aufzulisten, für die die Standardroute nicht akzeptiert werden kann.