Definir rota padrão no Debian Stretch com várias interfaces configuradas pelo dhcp

3

Em um sistema Debian Stretch com várias interfaces, eu preciso definir a rota padrão através de uma interface específica ens3 . Essa interface recebe seu endereço de IP 10.33.34.2 por meio do dhcp.

Eu ajustei o seguinte guia às minhas necessidades:

5.3. A moderna configuração de rede sem GUI

Assim, criei um arquivo /etc/systemd/network/route.network com o seguinte conteúdo

[Match]
Name=ens3

[Network]
Gateway=10.33.34.1

No entanto, a rota padrão não está definida corretamente na inicialização.

Ativei a depuração de systemd-networkd de acordo com Como depurar systemd-networkd?

Depois de reiniciar o systemd-networkd , vejo o seguinte nos registros:

Aug 21 13:43:13 vpn systemd-networkd[15671]: ens3: Setting routes
Aug 21 13:43:13 vpn systemd-networkd[15671]: ens3: Could not set route: Network is unreachable
Aug 21 13:43:13 vpn systemd-networkd[15671]: ens3: Routes set
Aug 21 13:43:13 vpn dhclient[15709]: Listening on LPF/ens3/52:54:00:3f:f1:d0
Aug 21 13:43:13 vpn dhclient[15709]: Sending on LPF/ens3/52:54:00:3f:f1:d0
Aug 21 13:43:13 vpn dhclient[15709]: Sending on Socket/fallback
Aug 21 13:43:13 vpn dhclient[15709]: DHCPDISCOVER on ens3 to 255.255.255.255 port 67 interval 8
Aug 21 13:43:13 vpn dhclient[15709]: DHCPREQUEST of 10.33.34.2 on ens3 to 255.255.255.255 port 67
Aug 21 13:43:13 vpn dhclient[15709]: DHCPOFFER of 10.33.34.2 from 10.33.34.1
Aug 21 13:43:13 vpn dhclient[15709]: DHCPACK of 10.33.34.2 from 10.33.34.1
Aug 21 13:43:13 vpn systemd-networkd[15671]: ens3: Adding address: 10.33.34.2/24 (valid forever)

Parece que o networkd tenta definir a rota antes que o endereço IP seja atribuído via dhcp.

Como faço para definir a rota padrão para uma interface específica com o systemd?

== Editar ==

Eu estava errado em assumir que o systemd-networkd traz as interfaces. Se eu reiniciar o sistema, vejo

$ sudo service systemd-networkd status
● systemd-networkd.service - Network Service
   Loaded: loaded (/lib/systemd/system/systemd-networkd.service; disabled; vendor pres
  Drop-In: /etc/systemd/system/systemd-networkd.service.d
           └─10-debug.conf
   Active: inactive (dead)
     Docs: man:systemd-networkd.service(8)

Assim, a configuração em /etc/systemd/network/route.network não tem efeito ao inicializar. Atualmente, estou imaginando qual serviço é responsável por exibir todos os dispositivos de rede.

== Editar 2 ==

Este artigo de Steven Iveson fornece uma boa visão de como os dispositivos de rede são iniciados por systemd-udevd e como modificar a configuração da interface.

Ao testar e ler mais, eu também gostaria de reafirmar meu problema: As múltiplas interfaces são criadas em ordem aleatória. Cada um obtém uma configuração correta do dhcp. A primeira interface a ser criada definirá a rota padrão e, portanto, 10.33.34.1 nem sempre será usado como rota padrão

    
por DoRe 21.08.2018 / 14:10

2 respostas

2

Se as interfaces all receberem ofertas DHCP válidas com uma rota padrão, não haverá maneira de configurar dhclient para ignorá-las - isso não é algo que você possa fazer com systemd , udev ou qualquer outra coisa conectada ao sistema init.

Uma maneira de fazer isso é descrita aqui : Você cria (é claro, você também pode usar um editor) um fragmento de script de shell em um dos diretórios" hook "de dhclient ,

cat << EOF > /etc/dhcp/dhclient-enter-hooks.d/restrict-default-route
## Only the DHCP server talking to ens3 is allowed to give us a default
## route.  Other interfaces only get local-segment configuration.
case ${interface} in
  ens3)
    ;;
  *)
    unset new_routers
    ;;
esac
EOF

que aceitará somente a opção routers com a rota padrão para ens3 . Não há problemas com o tempo, sem problemas em descobrir quais systemd de arquivos usar, e a rota só será válida quando ens3 estiver ativo e tiver recebido a oferta DHCP.

    
por 24.08.2018 / 14:51
0

Para o Debian Stretch, as interfaces são nomeadas pelo udev e a configuração básica ocorre em /etc/network/interfaces . Como afirmado na edição 2, as múltiplas interfaces são colocadas em ordem aleatória. Cada um obtém uma configuração correta do dhcp. A primeira interface a ser criada definirá a rota padrão. Precisamos apenas aceitar a rota padrão para a interface desejada. Isso pode ser obtido com um gancho para o dhcpclient

Adicione um novo script de gancho /etc/dhcp/dhclient-enter-hooks.d/nodefaultroute :

#!/bin/sh
## Prevent DHCP server on eth0 from forcing a default route on us

case ${interface} in
  ens8|ens9)
     printf "executing ip route delete default via $new_routers\n" 
     ip route delete default via $new_routers
  ;;
     *)
  ;;
esac

Em que ens8|ens9 pode ser estendido para listar todas as interfaces para as quais a rota padrão não pode ser aceita.

    
por 24.08.2018 / 15:03