Comment définir des routes statiques dans Ubuntu Server?

51

J'ai utilisé Ubuntu depuis Ubuntu 8.10; aujourd'hui, je travaille avec Ubuntu 12.04 Server.

J'ai de la difficulté à garder les routes statiques au démarrage. Je mettrais habituellement les commandes de route

/sbin/route add -net <IP>/<MASK> <GW> dev <ethX>

dans /etc/rc.localou je créerais un fichier (nommé routes) à l'intérieur du répertoire /etc/network/if-up/, mais je remarque que sous Ubuntu 12.04, cela ne fonctionne pas.

Si je tape les commandes dans le shell, elles fonctionnent, mais les mêmes commandes ne fonctionnent pas quand elles sont dans le fichier spécifié.

J'ai déjà essayé de changer le nom de fichier en un autre nom en pensant que mon nom de fichier ( routes) pouvait être erroné dans Ubuntu 12.04, mais cela ne fonctionnait pas non plus.

Je remarque aussi que la commande /sbin/ifconfigfonctionne, moins le /sbin/route.

Qu'est-ce qui a changé dans la configuration du réseau?

Comment définir des routes statiques sur Ubuntu 12.04?

Frank Allan
la source
Juste pour vérifier: est-ce que rc.local est exécutable et ça commence par la ligne shebang? Peut-être que c'est un problème avec votre commande. Vous pouvez essayer de rediriger stderr vers un fichier ( your_command > stderr.txt 2>&1) et d’inspecter sa sortie ...
Salem
Vous devez définir les itinéraires dans / etc / network / interfaces, et non dans /etc/rc.local. Et les nouvelles commandes à utiliser sont ip addet ip route. Une commande pour gouverner le net. :)
Anders
Certainement luman 5 interfaces
David Tonhofer

Réponses:

64

Vous pouvez mettre des routes statiques dans /etc/network/interfaces:

auto eth0
iface eth0 inet static
      address 192.168.1.2
      netmask 255.255.255.0
      up route add -net 192.168.0.0 netmask 255.255.0.0 gw 192.168.1.1
      up route add -net 172.16.0.0 netmask 255.240.0.0 gw 192.168.1.1
Eric Carvalho
la source
13
Syntaxe pour / sbin / ip:up ip route add 192.168.0.0/24 via 192.168.1.1
mardi
1
Souhaitez-vous expliquer vos deux dernières lignes dans la réponse ou fournir un lien vers la source de connaissances? Merci!
Itsols
Vous pouvez afficher -net 192.68.0.0 en tant que caractère générique, en indiquant que tous les paquets destinés à 192.168. *. * Doivent être routés via la passerelle par défaut 192.168.1.1. Le noyau essaiera ensuite de résoudre cette passerelle par défaut, mais s'il a déjà une entrée ARP, il enverra le paquet à l'interface. J'espère que ça aidera un peu.
Neil McGill
Il y a aussi /etc/network/interfaces.d/ qui peut être un meilleur endroit pour placer la route.
Elijah Lynn
Cela fonctionne, mais cela n’est pas décrit dans les pages de manuel relatives aux interfaces réseau. Est-ce standard?
jeudi
18

J'ai trouvé très souvent que l'emplacement correct pour définir une route statique est dans / etc / network / interfaces. Si vous envisagez de redémarrer globalement le réseau avec /etc/init.d/networking restart par exemple. Mais si vous allez utiliser ifdown et ifup pour arrêter individuellement une interface, ifup se termine par l'erreur suivante:

ifup eth1

RTNETLINK answers: File exists
Failed to bring up eth1.

À cause de cela tente de définir un itinéraire mais celui-ci est déjà défini. L’interface sera quand même active, mais ifup ne mettra pas à jour / run / network / ifstate, donc la prochaine fois, vous ne pourrez pas le faire si vous n’utilisez pas l’option --force.

Pour que ifup continue de configurer même si les itinéraires sont déjà définis, vous pouvez utiliser ce format pour définir les itinéraires dans / etc / network / interfaces.

up ip route add 172.16.0.0/24 via 192.168.10.1 || true
up ip route add 192.168.0.0/16 via 192.168.10.1 || true

De cette façon, vous aurez l'avertissement dans la sortie mais la configuration de l'interface sera complétée

ifup eth1

RTNETLINK answers: File exists
RTNETLINK answers: File exists
ssh stop/waiting
ssh start/running, process 18553
mseisdedos
la source
1
Pourquoi ne pas simplement ajouter un "down ip route del 192.168.0.0/16 via 192.168.10.1" à la configuration?
w00t
Parce que les utilisateurs font des choses comme utiliser ifconfigmanuellement, au lieu d’exécuter ifdown, ils veulent ensuite pouvoir récupérer en utilisant les outils appropriés. Il est donc utile que ces outils résistent à un état inattendu lorsqu'ils tentent de corriger l'état. La || truesuggestion est bonne. L'ajout d'une ligne descendante est également utile.
Phil P
5
D'un utilisateur aléatoire: Utilisez "remplacer" au lieu de "ajouter" dans la commande ip. Ex: up ip route replace 172.16.0.0/24 via 192.168.10.1"replace" ajouterait la route si elle n'existe pas encore, mais si une route avec le même sélecteur existe, elle serait remplacée par celle actuelle, même si elles ont la même destination.
Xen2050
9

Vous pouvez essayer ceci (ajoutez-le à /etc/network/interfaces), c’est une manière presque complète de définir des itinéraires:

auto eth0
iface eth0 inet static
    post-up /sbin/route add -net 192.168.0.0 netmask 255.255.0.0 gw 192.168.1.1
    post-up /bin/mount -t nfs 192.168.0.203:/motd/ /motd/
Mmehboobhan
la source
6

Il existe un paquet ifupdown-extra disponible dans Ubuntu.
Il fournit des scripts automatiques (installés dans /etc/network/*/), dont l'un est utilisé pour ajouter des itinéraires statiques.

Le fichier de configuration pour cela est /etc/network/routes

Le haut de ce fichier de configuration a une bonne description:

Ce fichier de configuration est lu par le script static-routes if-updown et le script /etc/init.d/networking-routes pour établir une liste de routes associées à une interface donnée ou à des routes globales.

Un exemple de route que j'utilise est:

192.168.240.0 255.255.255.0 192.168.130.3 em3
NGRhodes
la source
1

ce qui a fonctionné pour nous était

sudo route add -net 192.168.0.2/32 gw 192.168.1.1 netmask 255.255.0.0

J'avais l'habitude de courir sur un Mac:

sudo route -n add -net 192.168.0.2/32 192.168.1.1

mais sur un ubuntu, le "gw" entre les IP et la dernière partie "masque de réseau" était manquant (également -n pas nécessaire sur ubuntu)

Peter Perháč
la source
10
cela fonctionne parfaitement pour les routes temporaires (non persistantes), la question est de faire en sorte que les routes
soient
1

Je préfère utiliser nmcli.

nmcli device modify <device-name> ipv4.routes "<ip>/<mask> <gw>" ipv4.route-metric 25

Par exemple:

nmcli device modify wlp2s0 ipv4.routes "1.1.1.0/24 192.168.0.1" ipv4.route-metric 25

Après cela, appliquez les modifications en redémarrant le service NetworkManager:

sudo systemctl restart NetworkManager.service
isapir
la source
1

En utilisant, nmclije pouvais exécuter une solution persistante (la solution @isapir ne fonctionnait pas sur mon appareil).

sudo nmcli connection modify <conection-name> +ipv4.routes "<ip>/<mask> <gw> <mt>"

Par exemple:

sudo nmcli connection modify ssid-name +ipv4.routes "1.1.1.0/24 192.168.0.1 100"

Après cela, il est possible d’appliquer les modifications en définissant à nouveau la connexion (il n’a pas besoin de redémarrer NetworkManager):

sudo nmcli con down ssid-name ; sudo nmcli con up ssid-name

Pour voir les connexions en cours:

sudo nmcli connection
ofirule
la source