Legen Sie die Standardroute auf Debian Stretch mit mehreren per DHCP konfigurierten Schnittstellen fest

Legen Sie die Standardroute auf Debian Stretch mit mehreren per DHCP konfigurierten Schnittstellen fest

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.networkmit 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-networkdgemäßWie debuggt man systemd-networkd?

Nach dem Neustart systemd-networkdsehe 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.networkhat 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-udevdund 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.1wird daher nicht immer als Standardroute verwendet.

Antwort1

WennalleSchnittstellen empfangen gültige DHCP-Angebote mit einer Standardroute, dann kommen Sie nicht darum herum, dhclientdiese so zu konfigurieren, dass sie ignoriert werden – das ist nichts, was Sie mit , oder irgendetwas anderem tun können, systemddas udevmit 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

routersDadurch wird nur die Option mit der Standardroute für akzeptiert ens3. Keine Probleme mit dem Timing, keine Probleme beim Herausfinden, welche systemdDateien verwendet werden sollen, und die Route ist nur gültig, wenn ens3aktiv 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|ens9erweitert werden kann, um alle Schnittstellen aufzulisten, für die die Standardroute nicht akzeptiert werden kann.

verwandte Informationen