Puis-je empêcher l'ajout d'une route par défaut lors de la création d'une interface?

12

J'ai un système avec deux NIC dessus. Cette machine et quelques appareils qui l'accompagnent seront déplacés et connectés à différents LAN ou parfois elle utilisera une connexion à distance.

    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

J'utilise ifconfig pour monter ou descendre des interfaces (sauf avec ppp0, qui est géré par KPPP).

Si j'évoque eth1 en premier, il obtient une adresse de son DHCP et obtient la passerelle et cela est ajouté au routage donc il n'y a aucun problème pour atteindre le LAN et Internet.

Si j'affiche eth0 en premier ou en second, il obtient son adresse et définit la passerelle par défaut dans son espace d'adressage (dans la plage 10.xxx). Si j'évoque eth0 en premier et eth1 en second, la passerelle par défaut est toujours maintenue dans la plage 10.xxx.

Donc, peu importe ce que je fais, eth0 remplacera eth1 et "revendiquera" la passerelle dans le routage.

Existe-t-il un moyen d'empêcher eth0 de revendiquer la passerelle ou de s'assurer que eth1 (s'il est affiché en 2e) utilise sa passerelle? Ou puis-je en quelque sorte prioriser un classement de la passerelle de l'interface à utiliser par rapport aux autres?

Je veux essentiellement m'assurer que la passerelle d'espace d'adressage par défaut d'eth1 est utilisée si elle est active, et sinon, la passerelle par défaut de ppp0 est utilisée. Je voudrais pouvoir empêcher eth0 d'avoir jamais la passerelle par défaut.

Tango
la source
Il est étrange que l'utilisation ifconfigprovoque toute sorte d'interaction DHCP. Le ifupfera généralement en commençant dhclient. Vos interfaces eth * sont-elles éventuellement mises en place par le processus de démarrage du système, par exemple /etc/init.d/network, ou par NetworkManager?
Mark Plotnick
@MarkPlotnick: C'est après que j'ai démarré et que j'utilise "ifconfig eth1 up" (ou vers le bas ou eth0 ...). Je suppose que la forme la plus simple de ce que je veux faire serait de faire apparaître eth0 sans ajouter de routes autres que l'espace d'adressage 10.xxx.
Tango

Réponses:

5

La configuration du serveur DHCP est incorrecte. Il ne doit pas envoyer d'option de passerelle par défaut lorsqu'il ne peut pas fournir de routage vers le reste du monde. S'il envoie cette option, tout client peut supposer qu'il peut envoyer des paquets pour n'importe quelle destination hors liaison à la passerelle par défaut spécifiée.

Donc, votre box a raison d'utiliser la passerelle par défaut de eth0 si DHCP le lui dit. La solution consiste à supprimer la mauvaise option de votre serveur DHCP.

Sander Steffann
la source
D'accord, cela a beaucoup de sens. Malheureusement, le serveur DHCP est un DLink DNS-321, ce qui ne permet pas de nombreuses options de contrôle. Il semble que j'inclus une passerelle. Je vais devoir voir si je peux le pirater et modifier le fichier de configuration. Mais, un autre problème: pourquoi prend-il toujours la passerelle du serveur DHCP 10.xxx et ne prend-il pas toujours la passerelle de l'autre serveur?
Tango
1
Je ne sais pas comment Linux choisit entre des routes identiques. Il est probablement basé sur la métrique. Pouvez-vous afficher votre table de routage lorsque vous avez plusieurs itinéraires par défaut?
Sander Steffann
Il n'autorisera pas plusieurs itinéraires par défaut. La frustration est que, pour une raison quelconque, eth0 écoute toujours le DHCP et met à jour la passerelle. Avec eth1, il écoute et utilise la passerelle uniquement si c'est la première et la seule interface qui fonctionne. Si la passerelle d'eth0 ne remplaçait pas toujours eth1, alors j'écrirais juste un script, donc quand eth0 a été mis en place, eth1 a été retiré, puis ramené.
Tango
Cela ressemble presque à une bizarrerie codée en dur dans le client DHCP. Lequel utilisez-vous? Comme alternative: il pourrait être plus facile d'échanger simplement eth0 et eth1;)
Sander Steffann
C'est sur un DNS-321 D-Link. Mais je suis passé par / var / logs / syslog et je peux voir que le DHCP pour eth1 envoie également la passerelle à chaque fois. Je n'arrive pas à comprendre pourquoi eth1 prend toujours la passerelle et l'ajoute à la route et eth1 ne le fait pas. Je vais essayer de limiter la plage d'utilisation du DHCP eth0 pour commencer à 10.0.0.3, puis rendre eth0 statique, en utilisant 10.0.0.2 et voir si cela l'amène à ignorer ce serveur DHCP grossier.
Tango
16

J'ai rencontré un problème similaire sur Raspbian (je suppose que la solution ci-dessous sera également applicable à Debian). Le Raspberry Pi 3 dispose de 2 cartes réseau intégrées: Wi-Fi et Ethernet. J'utilise les deux, ils sont respectivement wlan0 et eth0. wlan0 est connecté à mon réseau Wi-Fi domestique et l'accès à Internet passe par cette interface. Il obtient ses paramètres via DHCP à partir de mon routeur domestique. eth0 est connecté directement à mon PC Windows et possède une adresse IP statique . Aucun accès Internet via eth0 n'était disponible car je ne l'ai pas configuré sur mon PC Windows.

Dans Raspbian, le démon dhcpcd est responsable de la configuration des interfaces réseau. Afin de définir une adresse IP statique sur l'interface eth0, les lignes suivantes ont été ajoutées à la fin de /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

Avec ces paramètres, dhcpcd a créé 2 routes par défaut et la route via eth0 avait une priorité plus élevée que celle via 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

Je n'avais donc pas accès à Internet, car le système a essayé de le router via eth0 et il n'avait pas accès à Internet, comme je l'ai mentionné ci-dessus.

Pour résoudre le problème, j'ai utilisé l' nogatewayoption dans l' /etc/dhcpcd.confinterface for eth0. La configuration spécifique à eth0 a donc commencé à ressembler à ceci:

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

Après avoir enregistré cette configuration et redémarré, il n'y avait pas de route par défaut via 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

Un accès Internet est apparu et le problème a été résolu.

Roman Me
la source
1
C'était exactement ma situation, et c'était exactement la solution.
PNDA
Merci, nogatewayc'est la voie à suivre dans les dernières distributions Debian
Alessandro Dionisi
Vous ne pouvez pas imaginer ce qu'est un problème pour faire face à ce problème dans le Raspbian Pi, et vous venez de donner la solution la plus élégante et correcte. Merci mec.
TechNyquist
7

Sur RHEL6 / Fedora 22, les éléments suivants ont été testés.

Dans / etc / sysconfig / network-scripts / ifcfg-eth1, ajoutez la ligne:

DEFROUTE=no

Remplacez eth1 par le nom de l'interface où le routage par défaut n'est pas souhaité.

Cela peut également être fait via l'interface graphique de Network Manager en cochant la case "Utiliser cette connexion uniquement pour les ressources sur son réseau" au bas de l'onglet IPv4.

DEFROUTE = no empêche l'ajout de la route par défaut (destination 0.0.0.0) à la table de routage lorsque l'interface est activée. c'est à dire. l'entrée suivante ne sera pas ajoutée.

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
la source
1
Veuillez expliquer pourquoi cela résout le problème. Et quand ça marche. Cela fonctionnera sur les distributions basées sur Debian (je crois) mais pas sur les distributions avec des noms d'interface différents (ou distribution utilisant systemd pour la mise en réseau des services).
grochmal
1
Plus comme Red Hat que les systèmes basés sur Debian.
ilkkachu
4

ok, donc ce que vous voulez, c'est que la machine ne lance jamais une passerelle par défaut quand elle appelle eth0 et obtient son adresse via DHCP.

Voici la solution:

Modifier le fichier:

/etc/dhcp/dhclient-up-hooks

et remplir avec:

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

avant:

[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

après 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
la source
Cela supprime l'itinéraire avec la passerelle une fois qu'il est établi, ce qui signifie qu'il a déjà effacé tout autre itinéraire avec une passerelle par défaut. Ou est-ce que je me méprends?
Tango
il supprimera uniquement la passerelle créée par le client DHCP lorsqu'il a lancé eth0, il n'affectera aucune autre passerelle déjà sur le système. D'après votre description, je suppose que votre problème est que vous obtenez simultanément deux passerelles par défaut à la fois (une sur eth0 et une sur eth1) et vous devez vous débarrasser de celle pour eth0 avant même de la placer sur la table de routage. Si vous publiez votre sortie route -n au moment du problème, je pourrais changer mon hypothèse.
Ricardo
1

Vous pouvez modifier le fichier dhcpclient.conf et ne demander aucune route par défaut à partir du serveur DHCP distant.

Un petit échantillon de ce que j'ai fait et cela fonctionne pour mon cas

send host-name = "random-hostname";

demande masque de sous-réseau, adresse de diffusion, décalage temporel, interface-mtu, routes statiques sans classe rfc3442, serveurs ntp;

Netboy
la source