Posso impedir que uma rota padrão seja adicionada ao abrir uma interface?

12

Eu tenho um sistema com duas placas de rede nele. Esta máquina e alguns dispositivos acompanhantes serão movidos e conectados a diferentes LANs ou, às vezes, usarão acesso discado.

    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

Estou usando o ifconfig para ativar ou desativar as interfaces (exceto com o ppp0, que é tratado pelo KPPP).

Se eu abrir o eth1 primeiro, ele obtém um endereço do DHCP e obtém o gateway e isso é adicionado ao roteamento para que não haja problemas para acessar a LAN e a Internet.

Se eu abrir eth0 primeiro ou segundo, ele obtém seu endereço e define o gateway padrão para dentro de seu espaço de endereço (no intervalo 10.xxx). Se eu abrir eth0 primeiro e eth1 segundo, o gateway padrão ainda será mantido dentro do intervalo 10.xxx.

Portanto, não importa o que eu faça, o eth0 substituirá o eth1 e "reivindicará" o gateway no roteamento.

Existe alguma maneira de impedir que eth0 reivindique o gateway ou garantir que o eth1 (se mencionado em 2º) use seu gateway? Ou posso, de alguma forma, priorizar uma classificação do gateway de qual interface deve ser usado sobre os outros?

Basicamente, quero garantir que o gateway do espaço de endereço padrão do eth1 seja usado se estiver ativo e, caso contrário, o gateway padrão do ppp0 será usado. Eu gostaria de impedir que o eth0 tenha o gateway padrão.

Tango
fonte
É estranho que o uso ifconfigcause qualquer tipo de interação DHCP. Normalmente ifupfará isso, iniciando dhclient. Suas interfaces eth * possivelmente estão sendo apresentadas pelo processo de inicialização do sistema, digamos /etc/init.d/network, ou pelo NetworkManager?
Mark Plotnick
@ MarkPlotnick: Isso é depois que eu inicializei e estou usando "ifconfig eth1 up" (ou down ou eth0 ...). Eu acho que a forma mais simples do que eu quero fazer seria abrir o eth0 sem que nenhuma rota seja adicionada além do espaço de endereço 10.xxx.
Tango

Respostas:

5

A configuração do servidor DHCP está incorreta. Ele não deve enviar uma opção de gateway padrão quando não puder fornecer roteamento para o resto do mundo. Se enviar essa opção, qualquer cliente poderá presumir que pode enviar pacotes para qualquer destino fora do link para o gateway padrão especificado.

Portanto, sua caixa está correta ao usar o gateway padrão de eth0, se for solicitado pelo DHCP. A solução é remover a opção ruim do seu servidor DHCP.

Sander Steffann
fonte
Ok, isso faz muito sentido. Infelizmente, o servidor DHCP é um DLink DNS-321, que não permite muitas opções de controle. Parece exigir que eu inclua um gateway. Vou ter que ver se consigo hackear de alguma forma e editar o arquivo de configuração. Mas, outro problema: por que o gateway sempre é usado no servidor DHCP 10.xxx e nem sempre o outro servidor?
Tango
1
Não sei como o linux escolhe entre rotas idênticas. Provavelmente é baseado na métrica. Você pode mostrar sua tabela de roteamento quando tiver várias rotas padrão?
Sander Steffann
Não permitirá várias rotas padrão. A frustração é que, por algum motivo, eth0 sempre ouve o DHCP e atualiza o gateway. Com o eth1, ele apenas escuta e usa o gateway se for a primeira e única interface instalada. Se o gateway do eth0 nem sempre substituísse o eth1, então eu escreveria um script para que quando o eth0 fosse ativado, o eth1 fosse desativado e, em seguida, ativado.
Tango
Parece quase uma estranheza codificada no cliente DHCP. Qual deles você está usando? Como alternativa: talvez seja mais fácil para eth0 troca justa e eth1;)
Sander Steffann
Está em um D-Link DNS-321. Mas eu já passei por / var / logs / syslog e posso ver que o DHCP para eth1 também envia sempre o gateway. Eu simplesmente não consigo entender por que o eth1 sempre pega o gateway e o adiciona à rota e o eth1 não. Vou tentar limitar o intervalo para o DHCP eth0 usar para iniciar em 10.0.0.3 e, em seguida, tornar eth0 estático, usando 10.0.0.2 e ver se isso leva a ignorar esse servidor DHCP rude.
Tango
16

Eu enfrentei um problema semelhante no Raspbian (suponho que a solução abaixo também seja aplicável ao Debian). O Raspberry Pi 3 possui 2 NICs integradas: Wi-Fi e Ethernet. Eu uso os dois, eles são wlan0 e eth0, respectivamente. O wlan0 está conectado à minha rede Wi-Fi doméstica e o acesso à Internet é fornecido por essa interface. Ele obtém suas configurações via DHCP do meu roteador doméstico. eth0 está conectado diretamente ao meu PC com Windows e possui um IP estático atribuído. Nenhum acesso à Internet via eth0 estava disponível, pois eu não o configurei no meu PC com Windows.

No Raspbian, o daemon dhcpcd é responsável pela configuração de interfaces de rede. Para definir o IP estático para a interface eth0, foram adicionadas as seguintes linhas ao final 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

Com essas configurações, o dhcpcd criou duas rotas padrão e a rota via eth0 teve prioridade mais alta que a 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

Portanto, eu não tinha acesso à Internet, porque o sistema tentou rotear via eth0 e não tinha acesso à internet, como mencionei acima.

Para resolver o problema, usei a nogatewayopção na /etc/dhcpcd.confinterface for eth0. Portanto, a configuração específica de eth0 começou assim:

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

Depois de salvar essa configuração e reiniciar, não havia rota padrão 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

O acesso à Internet apareceu e o problema foi resolvido.

Roman Me
fonte
1
Essa era exatamente a minha situação e essa era exatamente a solução.
PNDA 17/08/19
Obrigado, nogatewayé o caminho a percorrer em mais distros debian
Alessandro Dionisi
Você não pode imaginar o que é um incômodo para enfrentar esse problema no Raspbian Pi e acabou de dar a solução mais elegante e correta. Obrigado cara.
TechNyquist
7

No RHEL6 / Fedora 22, o seguinte foi testado.

Em / etc / sysconfig / network-scripts / ifcfg-eth1, adicione a linha:

DEFROUTE=no

Substitua eth1 pelo nome da interface em que o roteamento padrão não é desejado.

Isso também pode ser feito via GUI do Network Manager, marcando a caixa "Use esta conexão apenas para recursos em sua rede" na parte inferior da guia IPv4.

DEFROUTE = no impede a adição da rota padrão (destino 0.0.0.0) à tabela de roteamento quando a interface está ativada. ie a entrada a seguir não seria adicionada.

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
fonte
1
Por favor, explique por que ele corrige o problema. E quando funciona. Ele funcionará em distros baseados no Debian (eu acredito), mas não em distros com nomes de interface diferentes (ou distros usando systemd para serviços de rede).
grochmal
1
Mais como o Red Hat do que os sistemas baseados no Debian.
Ilkkachu
4

ok, então o que você deseja é que a máquina nunca abra um gateway padrão quando abrir o eth0 e obter um endereço via DHCP.

Aqui está a solução:

Editar arquivo:

/etc/dhcp/dhclient-up-hooks

e preencha com:

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

antes:

[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

apó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
fonte
Isso exclui a rota com o gateway depois de estabelecida, o que significa que já foi eliminada qualquer outra rota com um gateway padrão. Ou entendo mal?
Tango
ele excluirá apenas o gateway criado pelo cliente DHCP ao ativar o eth0, não afetará nenhum outro gateway já existente no sistema. Pela sua descrição, eu suporia que seu problema é que você está obtendo dois gateways padrão simultâneos em algum momento (um no eth0 e outro no eth1) e precisa se livrar do que é o eth0 antes mesmo de ser colocado na tabela de roteamento. Se você postar sua saída route -n no momento do problema, posso mudar minha suposição.
Ricardo
1

Você pode editar o arquivo dhcpclient.conf e não solicitar nenhuma rota padrão no servidor DHCP remoto.

Uma pequena amostra do que fiz e está funcionando no meu caso

send host-name = "random-hostname";

solicitar máscara de sub-rede, endereço de broadcast, deslocamento de tempo, interface mtu, rotas estáticas sem classe rfc3442, servidores ntp;

Netboy
fonte