Kann ich verhindern, dass beim Aufrufen einer Schnittstelle eine Standardroute hinzugefügt wird?

12

Ich habe ein System mit zwei Netzwerkkarten. Dieses Gerät und einige zugehörige Geräte werden verschoben und an verschiedene LANs angeschlossen, oder manchmal wird die Einwahl verwendet.

    eth0:
    - 10.x.x.x address space
    - no internet gateway
    - only a few devices

eth1 (when used):
- 172.16.x.x or 192.168.x.x or other address spaces
- access to the gateway from LAN to internet

ppp0 (when used):
- internet access through dialup using KPPP

Ich verwende ifconfig, um Schnittstellen nach oben oder unten zu bringen (außer mit ppp0, das von KPPP verwaltet wird).

Wenn ich eth1 zuerst aufrufe, erhält es eine Adresse von seinem DHCP und erhält das Gateway. Dies wird dem Routing hinzugefügt, sodass es keine Probleme gibt, das LAN und das Internet zu erreichen.

Wenn ich eth0 zuerst oder zweitens aufrufe, erhält es seine Adresse und setzt das Standard-Gateway auf innerhalb seines Adressraums (im Bereich 10.xxx). Wenn ich zuerst eth0 und dann eth1 aufrufe, bleibt das Standard-Gateway weiterhin im Bereich 10.xxx.

Egal was ich mache, eth0 überschreibt eth1 und "beansprucht" das Gateway im Routing.

Gibt es eine Möglichkeit, entweder zu verhindern, dass eth0 das Gateway beansprucht, oder sicherzustellen, dass eth1 (falls es als 2. aufgerufen wird) sein Gateway verwendet? Oder kann ich irgendwie eine Rangfolge priorisieren, bei der das Gateway der Schnittstelle gegenüber den anderen verwendet werden soll?

Grundsätzlich möchte ich sicherstellen, dass das Standard-Adressraum-Gateway von eth1 verwendet wird, wenn es aktiv ist. Wenn nicht, wird das Standard-Gateway von ppp0 verwendet. Ich möchte verhindern können, dass eth0 jemals das Standard-Gateway hat.

Tango
quelle
Es ist seltsam, dass die Verwendung ifconfigjede Art von DHCP-Interaktion verursachen würde. In der Regel ifupwird dies durch Starten erledigt dhclient. Werden Ihre eth * -Schnittstellen möglicherweise beispielsweise durch den Systemstartprozess /etc/init.d/networkoder durch NetworkManager aufgerufen?
Mark Plotnick
@MarkPlotnick: Dies ist, nachdem ich gebootet habe und "ifconfig eth1 up" (oder down oder eth0 ...) verwende. Ich denke, die einfachste Form von dem, was ich tun möchte, wäre, eth0 aufzurufen, ohne dass andere Routen als dem 10.xxx-Adressraum hinzugefügt werden.
Tango

Antworten:

5

Die DHCP-Serverkonfiguration ist falsch. Es darf keine Standard-Gateway-Option senden, wenn kein Routing für den Rest der Welt bereitgestellt werden kann. Wenn diese Option gesendet wird, kann jeder Client davon ausgehen, dass er Pakete für jedes Off-Link-Ziel an das angegebene Standard-Gateway senden kann.

Ihre Box verwendet also das Standard-Gateway von eth0, wenn dies von DHCP mitgeteilt wird. Die Lösung besteht darin, die fehlerhafte Option von Ihrem DHCP-Server zu entfernen.

Sander Steffann
quelle
Okay, das macht sehr viel Sinn. Leider ist der DHCP-Server ein DLink-DNS-321, der nicht viele Steuerungsoptionen zulässt. Es scheint erforderlich zu sein, dass ich ein Gateway einbinde. Ich muss sehen, ob ich es irgendwie hacken und die Konfigurationsdatei bearbeiten kann. Ein weiteres Problem: Warum wird das Gateway immer vom 10.xxx-DHCP-Server und nicht immer vom anderen Server übernommen?
Tango
1
Ich bin mir nicht sicher, wie Linux zwischen identischen Routen wählt. Es basiert wahrscheinlich auf der Metrik. Können Sie Ihre Routing-Tabelle anzeigen, wenn Sie mehrere Standardrouten haben?
Sander Steffann
Es werden nicht mehrere Standardrouten zugelassen. Die Frustration ist, dass eth0 aus irgendeinem Grund immer auf das DHCP hört und das Gateway aktualisiert. Mit eth1 hört und verwendet es das Gateway nur, wenn es die erste und einzige Schnittstelle ist, die aktiv ist. Wenn das Gateway von eth0 nicht immer das von eth1 überschreibt, schreibe ich einfach ein Skript. Wenn eth0 aufgerufen wird, wird eth1 heruntergefahren und dann hochgefahren.
Tango
Es klingt fast wie eine hartcodierte Verrücktheit im DHCP-Client. Welches benutzt du? Als Alternative: Es könnte einfacher sein, nur eth0 und eth1 zu tauschen;)
Sander Steffann
Es ist auf einem D-Link DNS-321. Aber ich habe / var / logs / syslog durchgesehen und kann sehen, dass der DHCP für eth1 jedes Mal auch das Gateway sendet. Ich kann einfach nicht herausfinden, warum eth1 immer das Gateway nimmt und es der Route hinzufügt und eth1 nicht. Ich werde versuchen, den Bereich für das DHCP zu begrenzen, das eth0 verwendet, um bei 10.0.0.3 zu beginnen und dann eth0 mit 10.0.0.2 statisch zu machen und zu prüfen, ob dies dazu führt, dass dieser unhöfliche DHCP-Server ignoriert wird.
Tango
15

Ich hatte ein ähnliches Problem mit Raspbian (ich nehme an, dass die folgende Lösung auch für Debian gilt). In Raspberry Pi 3 sind zwei Netzwerkkarten integriert: Wi-Fi und Ethernet. Ich benutze beide, sie sind wlan0 bzw. eth0. wlan0 ist mit meinem WLAN-Heimnetzwerk verbunden und der Internetzugang erfolgt über diese Schnittstelle. Es erhält seine Einstellungen über DHCP von meinem Heimrouter. eth0 ist direkt mit meinem Windows-PC verbunden und hat eine statische IP zugewiesen. Es war kein Internetzugang über eth0 verfügbar, da ich ihn nicht auf meinem Windows-PC konfiguriert habe.

In Raspbian ist der daemon dhcpcd für die Konfiguration der Netzwerkschnittstellen verantwortlich. Um die statische IP auf die eth0-Schnittstelle zu setzen, wurden am Ende von folgende Zeilen hinzugefügt /etc/dhcpcd.conf:

interface eth0

static ip_address=192.168.2.2/24
static routers=192.168.2.1
static domain_name_servers=192.168.2.1

Mit diesen Einstellungen erstellte dhcpcd zwei Standardrouten und die Route über eth0 hatte eine höhere Priorität als die über wlan0:

pi@raspberrypi:~ $ route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         192.168.2.1     0.0.0.0         UG    202    0        0 eth0
default         192.168.1.254   0.0.0.0         UG    303    0        0 wlan0
192.168.1.0     *               255.255.255.0   U     303    0        0 wlan0
192.168.2.0     *               255.255.255.0   U     202    0        0 eth0

Ich hatte also keinen Internetzugang, weil das System versucht hat, ihn über eth0 zu routen, und es hatte keinen Internetzugang, wie ich oben erwähnt habe.

Um das Problem zu lösen, habe ich die nogatewayOption in der /etc/dhcpcd.conffor eth0-Schnittstelle verwendet. Die eth0-spezifische Konfiguration sah also folgendermaßen aus:

interface eth0

static ip_address=192.168.2.2/24
static routers=192.168.2.1
static domain_name_servers=192.168.2.1
nogateway

Nach dem Speichern dieser Konfiguration und dem Neustart gab es keine Standardroute über eth0:

pi@raspberrypi:~ $ route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         192.168.1.254   0.0.0.0         UG    303    0        0 wlan0
192.168.1.0     *               255.255.255.0   U     303    0        0 wlan0
192.168.2.0     *               255.255.255.0   U     202    0        0 eth0

Der Internetzugang wurde angezeigt und das Problem behoben.

Roman Me
quelle
1
Dies war genau meine Situation und genau die Lösung.
PNDA
Danke, nogatewayist der Weg in die neuesten Debian-Distributionen
Alessandro Dionisi
Sie können sich nicht vorstellen, wie mühsam es ist, dieses Problem im Raspbian Pi zu lösen, und Sie haben gerade die eleganteste und korrekteste Lösung gegeben. Danke mann.
TechNyquist
7

Auf RHEL6 / Fedora 22 wurde Folgendes getestet.

Fügen Sie in / etc / sysconfig / network-scripts / ifcfg-eth1 die folgende Zeile hinzu:

DEFROUTE=no

Ersetzen Sie eth1 durch den Namen der Schnittstelle, für die kein Standardrouting gewünscht wird.

Dies kann auch über die Benutzeroberfläche von Network Manager erfolgen, indem das Kontrollkästchen "Diese Verbindung nur für Ressourcen in seinem Netzwerk verwenden" unten auf der Registerkarte IPv4 aktiviert ist.

DEFROUTE = no verhindert das Hinzufügen der Standardroute (Ziel 0.0.0.0) zur Routing-Tabelle, wenn die Schnittstelle aktiviert ist. dh. Der folgende Eintrag wird nicht hinzugefügt.

Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
0.0.0.0         172.16.x.x      0.0.0.0         UG        0 0          0 eth1
user3489409
quelle
1
Bitte erläutern Sie, warum das Problem dadurch behoben wird. Und wenn es funktioniert. Es funktioniert auf Debian-basierten Distributionen (glaube ich), aber nicht auf Distributionen mit unterschiedlichen Schnittstellennamen (oder auf Distributionen, die systemd für das Netzwerk von Diensten verwenden).
Gro♀
1
Eher wie Red Hat als Debian-basierte Systeme.
Ilkkachu
4

OK, Sie möchten also, dass der Computer niemals ein Standard-Gateway aufruft, wenn er eth0 aufruft und seine Adresse über DHCP erhält.

Hier ist die Lösung:

Datei bearbeiten:

/etc/dhcp/dhclient-up-hooks

und bevölkern mit:

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

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

Vor:

[root@centos7lab dhcp]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.4.1     0.0.0.0         UG    20     0        0 eth0
192.168.4.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0

nach ifdown eth0, ifup eth0:

[root@centos7lab dhcp]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.4.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0
Ricardo
quelle
Dadurch wird die Route mit dem Gateway gelöscht, nachdem sie eingerichtet wurde. Dies bedeutet, dass bereits jede andere Route mit einem Standard-Gateway gelöscht wurde. Oder verstehe ich falsch?
Tango
Es löscht nur das Gateway, das der DHCP-Client beim Aufrufen von eth0 erstellt hat. Es wirkt sich nicht auf andere Gateways aus, die sich bereits auf dem System befinden. Aus Ihrer Beschreibung würde ich annehmen, dass Ihr Problem darin besteht, dass Sie zu einem bestimmten Zeitpunkt zwei gleichzeitige Standardgateways erhalten (eines auf eth0 und eines auf eth1) und dass Sie das für eth0 entfernen müssen, bevor es überhaupt in die Routing-Tabelle aufgenommen wird. Wenn Sie Ihre Route-n-Ausgabe zum Zeitpunkt des Problems veröffentlichen, kann ich meine Annahme ändern.
Ricardo
1

Sie können die Datei dhcpclient.conf bearbeiten und keine Standardroute vom Remote-DHCP-Server anfordern.

Eine kleine Auswahl von dem, was ich getan habe und es funktioniert für meinen Fall

send host-name = "zufälliger Hostname";

Subnetzmaske, Broadcast-Adresse, Zeitversatz, Schnittstellen-MTU, RFC3442-Klassenlose-Statische-Routen, NTP-Server anfordern;

Netboy
quelle