Posso impedire l'aggiunta di una route predefinita quando si apre un'interfaccia?


12

Ho un sistema con due schede di rete su di esso. Questa macchina e alcuni dispositivi di accompagnamento verranno spostati e collegati a LAN diverse o a volte utilizzerà la connessione remota.

    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

Sto usando ifconfig per portare su o giù le interfacce (tranne che con ppp0, che è gestito da KPPP).

Se visualizzo prima eth1, ottiene un indirizzo dal suo DHCP e ottiene il gateway e questo viene aggiunto al routing, quindi non ci sono problemi a raggiungere la LAN e Internet.

Se visualizzo eth0 per primo o secondo, ottiene il suo indirizzo e imposta il gateway predefinito all'interno del suo spazio di indirizzi (nell'intervallo 10.xxx). Se visualizzo eth0 per primo e eth1 per secondo, il gateway predefinito rimane comunque compreso nell'intervallo 10.xxx.

Quindi, qualunque cosa io faccia, eth0 sovrascriverà eth1 e "rivendicherà" il gateway nel routing.

Esiste un modo per impedire a eth0 di rivendicare il gateway o per assicurarsi che eth1 (se visualizzato secondo) utilizza il suo gateway? O posso in qualche modo dare la priorità a una classifica di quale gateway dell'interfaccia dovrebbe essere usato rispetto agli altri?

Fondamentalmente voglio assicurarmi che il gateway dello spazio di indirizzi predefinito di eth1 sia usato se è attivo e, in caso contrario, viene utilizzato il gateway predefinito di ppp0. Mi piacerebbe essere in grado di impedire a eth0 di avere sempre il gateway predefinito.


È strano che l'utilizzo ifconfigprovocherebbe qualsiasi tipo di interazione DHCP. In genere ifuplo farà, avviando dhclient. Le tue interfacce eth * possono essere attivate dal processo di avvio del sistema, per esempio /etc/init.d/network, o da NetworkManager?
Mark Plotnick,

@MarkPlotnick: Questo è dopo che ho avviato e sto usando "ifconfig eth1 up" (o down o eth0 ...). Immagino che la forma più semplice di ciò che voglio fare sia far apparire eth0 senza che vengano aggiunti percorsi diversi dallo spazio degli indirizzi 10.xxx.
Tango,

Risposte:


5

La configurazione del server DHCP è errata. Non deve inviare un'opzione gateway predefinita quando non è in grado di fornire il routing al resto del mondo. Se invia tale opzione, qualsiasi client può presumere che possa inviare pacchetti per qualsiasi destinazione off-link al gateway predefinito specificato.

Quindi la tua scatola ha ragione nell'usare il gateway predefinito da eth0 se è stato detto dal DHCP. La soluzione è rimuovere l'opzione non valida dal server DHCP.


Va bene, ha molto senso. Sfortunatamente, il server DHCP è un DLink DNS-321, che non consente molte opzioni di controllo. Sembra che includa un gateway. Dovrò vedere se posso hackerarlo in qualche modo e modificare il file di configurazione. Ma un altro problema: perché prende sempre il gateway dal server DHCP 10.xxx e non sempre prende il gateway dall'altro server?
Tango,

1
Non sono sicuro di come Linux scelga tra percorsi identici. Probabilmente si basa sulla metrica. Puoi mostrare la tua tabella di routing quando hai più route predefinite?
Sander Steffann,

Non consentirà più percorsi predefiniti. La frustrazione è che per qualche motivo eth0 ascolta sempre il DHCP e aggiorna il gateway. Con eth1, ascolta e utilizza il gateway solo se è la prima e unica interfaccia ad essere attiva. Se il gateway di eth0 non ha sempre ignorato quello di eth1, allora scriverei solo una sceneggiatura, quindi quando eth0 è stato sollevato, eth1 è stato rimosso, quindi sollevato.
Tango,

Sembra quasi una stranezza codificata nel client DHCP. Quale stai usando? In alternativa: potrebbe essere più semplice scambiare eth0 ed eth1;)
Sander Steffann

È su un D-Link DNS-321. Ma ho esaminato / var / logs / syslog e posso vedere che il DHCP per eth1 invia anche ogni volta il gateway. Non riesco proprio a capire perché eth1 prende sempre il gateway e lo aggiunge al percorso e eth1 no. Proverò a limitare l'intervallo per il DHCP che eth0 utilizza per iniziare da 10.0.0.3 e quindi rendere eth0 statico, usando 10.0.0.2 e vedere se questo porta a ignorare quel maleducato server DHCP.
Tango,

16

Ho riscontrato un problema simile su Raspbian (suppongo che la soluzione seguente sarà applicabile anche a Debian). Raspberry Pi 3 ha 2 schede di rete integrate: Wi-Fi ed Ethernet. Li uso entrambi, sono rispettivamente wlan0 ed eth0. wlan0 è connesso alla mia rete Wi-Fi domestica e l'accesso a Internet arriva attraverso questa interfaccia. Ottiene le sue impostazioni tramite DHCP dal mio router di casa. eth0 è collegato direttamente al mio PC Windows e ha un IP statico assegnato. Nessun accesso a Internet tramite eth0 era disponibile poiché non l'ho configurato sul mio PC Windows.

In Raspbian, il demone dhcpcd è responsabile della configurazione delle interfacce di rete. Per impostare l'IP statico sull'interfaccia eth0, sono state aggiunte le seguenti righe alla fine di /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

Con queste impostazioni, dhcpcd ha creato 2 route predefinite e route tramite eth0 aveva una priorità più alta di quella tramite 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

Quindi non avevo accesso a Internet, perché il sistema ha provato a instradarlo tramite eth0 e non aveva accesso a Internet, come ho già detto.

Per risolvere il problema, ho usato l' nogatewayopzione nell'interfaccia /etc/dhcpcd.conffor eth0. Quindi la configurazione specifica di eth0 ha iniziato ad apparire così:

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

Dopo aver salvato questa configurazione e riavviato, non vi era alcun percorso predefinito tramite 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

È apparso l'accesso a Internet e il problema è stato risolto.


1
Questa era esattamente la mia situazione, e questa era esattamente la soluzione.
PNDA,

Grazie, nogatewayè la strada da percorrere nelle ultime distro debian
Alessandro Dionisi il

Non puoi immaginare che seccatura affrontare questo problema in Raspbian Pi, e hai appena dato la soluzione più elegante e corretta. Grazie amico.
TechNyquist,

7

Su RHEL6 / Fedora 22 è stato testato quanto segue.

In / etc / sysconfig / network-scripts / ifcfg-eth1 aggiungi la riga:

DEFROUTE=no

Sostituire eth1 con il nome dell'interfaccia in cui non si desidera il routing predefinito.

Questo può essere fatto anche tramite la GUI di Network Manager selezionando la casella "Usa questa connessione solo per le risorse sulla sua rete" nella parte inferiore della scheda IPv4.

DEFROUTE = no impedisce l'aggiunta della route predefinita (destinazione 0.0.0.0) alla tabella di routing quando l'interfaccia è abilitata. vale a dire. la seguente voce non verrebbe aggiunta.

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

1
Spiega perché risolve il problema. E quando funziona. Funzionerà su distribuzioni basate su Debian (credo) ma non su distribuzioni con nomi di interfaccia diversi (o distro usando systemd per servizi di rete).
grochmal

1
Più simile a Red Hat rispetto ai sistemi basati su Debian.
ilkkachu,

4

ok, quindi quello che vuoi è che la macchina non apra mai un gateway predefinito quando fa apparire eth0 e ottiene un suo indirizzo tramite DHCP.

Ecco la soluzione:

Modifica file:

/etc/dhcp/dhclient-up-hooks

e popolare con:

#!/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

prima:

[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

dopo 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

Ciò elimina la route con il gateway dopo che è stata stabilita, il che significa che ha già cancellato qualsiasi altra route con un gateway predefinito. O fraintendere?
Tango,

eliminerà solo il gateway creato dal client DHCP quando ha avviato eth0, non influirà su nessun altro gateway già presente sul sistema. Dalla tua descrizione suppongo che il tuo problema sia che stai ricevendo due gateway predefiniti simultanei in un determinato momento (uno su eth0 e uno su eth1) e devi sbarazzarti di quello per eth0 prima ancora che venga messo sul tavolo di routing. Se pubblichi il tuo percorso -n output al momento del problema, potrei cambiare il mio presupposto.
Ricardo,

1

È possibile modificare il file dhcpclient.conf e non richiedere alcuna route predefinita dal server DHCP remoto.

Un piccolo esempio di ciò che ho fatto e funziona per il mio caso

send host-name = "random-hostname";

richiedere subnet-mask, indirizzo di trasmissione, time-offset, interfaccia-mtu, rfc3442-classless-static-route, ntp-server;

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.