Como definir rotas estáticas no Ubuntu Server?

51

Eu uso o Ubuntu desde o Ubuntu 8.10; hoje estou trabalhando com o Ubuntu 12.04 Server.

Estou tendo dificuldade em manter rotas estáticas durante a inicialização. Eu normalmente colocava os comandos de rota

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

em /etc/rc.localou eu iria criar um arquivo (chamado routes) dentro do diretório /etc/network/if-up/, mas noto que no Ubuntu 12.04 não está funcionando.

Se eu digitar os comandos no shell, eles funcionarão, mas os mesmos comandos não funcionarão quando estiverem no arquivo especificado.

Eu já tentei mudar o nome do arquivo para outros nomes, pensando que meu nome de arquivo ( routes) poderia estar errado no Ubuntu 12.04, mas isso também não funcionou.

Percebo também que o comando /sbin/ifconfigfunciona, menos o /sbin/route.

O que mudou na configuração da rede?

Como posso definir rotas estáticas no Ubuntu 12.04?

Frank Allan
fonte
Apenas para verificar: o rc.local é executável e começa com a linha shebang? Talvez seja um problema com o seu comando. Você pode tentar redirecionar o stderr para um arquivo ( your_command > stderr.txt 2>&1) e inspecionar sua saída ...
Salem
Você deve definir rotas em / etc / network / interfaces, não em /etc/rc.local. E novos comandos que você deve usar é ip adde ip route. Um comando para governar a rede. :)
Anders
Definitivamente lidoman 5 interfaces
David Tonhofer

Respostas:

64

Você pode colocar rotas estáticas em /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
fonte
13
Sintaxe para / sbin / ip:up ip route add 192.168.0.0/24 via 192.168.1.1
w00t 23/01
11
Você poderia explicar suas duas últimas linhas na resposta ou fornecer um link para a fonte de conhecimento? Obrigado!
itsols
Você pode visualizar -net 192.68.0.0 como um curinga, dizendo que todos os pacotes destinados a 192.168. *. * Devem ser roteados pelo gateway padrão 192.168.1.1. O kernel tentará resolver esse gateway padrão, mas se já tiver uma entrada ARP, enviará o pacote pela interface que aprendeu que o gateway reside com o MAC de destino para o próximo salto. Espero que ajude um pouco.
Neil McGill
Também há /etc/network/interfaces.d/, que pode ser um lugar melhor para colocar a rota.
Elias Lynn
Isso funciona, mas não está descrito nas páginas do manual para interfaces de rede. Isso é padrão?
BЈовић
18

Descobri muitas vezes que o local correto para definir uma rota estática é em / etc / network / interfaces, tudo bem se você for reiniciar a rede globalmente com /etc/init.d/networking restart por exemplo. Mas se você usará o ifdown e o ifup para desligar individualmente uma interface, o ifup terminará com o erro:

ifup eth1

RTNETLINK answers: File exists
Failed to bring up eth1.

Por isso, tenta definir uma rota, mas já está definida. A interface estará funcionando de qualquer maneira, mas, se o ifup não atualizar / executar / rede / ifstate, da próxima vez que você nos enviar, não será possível fazer isso, a menos que você use o sinalizador --force.

Para fazer com que o ifup continue configurando mesmo se as rotas já estiverem definidas, você pode usar este formato ao definir rotas em / 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

Dessa forma, você terá o aviso na saída, mas a configuração da interface será concluída

ifup eth1

RTNETLINK answers: File exists
RTNETLINK answers: File exists
ssh stop/waiting
ssh start/running, process 18553
mseisdedos
fonte
11
Por que não simplesmente adicionar um "down ip route del 192.168.0.0/16 via 192.168.10.1" à configuração?
W00t
Como as pessoas fazem coisas como usar ifconfigmanualmente, em vez de executar ifdown, desejam recuperar-se usando as ferramentas corretas. Portanto, é útil que essas ferramentas sejam resistentes a um estado inesperado enquanto tentam corrigi-lo. A || truesugestão é boa. Adicionar uma linha descendente também é útil.
P) P
5
De um usuário aleatório: Use "replace" em vez de "add" no comando ip. Ex: up ip route replace 172.16.0.0/24 via 192.168.10.1"replace" adicionaria a rota se ela ainda não existir, mas se existir uma rota com o mesmo seletor, ela será substituída pela atual, mesmo que elas tenham o mesmo destino.
Xen2050 28/03
9

Você pode tentar isso (adicioná-lo a /etc/network/interfaces), esta é a maneira quase completa de definir rotas:

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
fonte
6

Existe um pacote ifupdown-extra disponível no Ubuntu.
Ele fornece scripts automáticos (instalados em /etc/network/*/), um dos quais é usado para adicionar rotas estáticas.

O arquivo de configuração para isso é /etc/network/routes

A parte superior deste arquivo de configuração tem uma boa descrição:

Esse arquivo de configuração é lido pelo script static-routes if-updown e pelo script /etc/init.d/networking-routes para configurar uma lista de rotas associadas a uma determinada interface ou rotas globais.

Um exemplo de rota que eu uso é:

192.168.240.0 255.255.255.0 192.168.130.3 em3
NGRhodes
fonte
1

o que funcionou para nós foi

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

Eu costumava rodar em um Mac:

sudo route -n add -net 192.168.0.2/32 192.168.1.1

mas em um ubuntu o "gw" entre IPs e a última parte "netmask" estava ausente (também -n não é necessário no ubuntu)

Peter Perháč
fonte
10
isso funciona perfeitamente para rotas temporárias (não persistentes), a questão é sobre como tornar as rotas persistentes #
217
0

Eu prefiro usar nmcli.

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

Por exemplo:

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

Depois disso, aplique as alterações reiniciando o serviço NetworkManager:

sudo systemctl restart NetworkManager.service
isapir
fonte
0

Usando nmclieu era capaz de executar uma solução persistente (a solução @isapir não funcionava no meu dispositivo).

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

Por exemplo:

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

Depois disso, é possível aplicar as alterações configurando a conexão para baixo e para cima novamente (não é necessário reiniciar completamente o NetworkManager):

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

Para ver as conexões atuais, execute:

sudo nmcli connection
ofirule
fonte