
Em um sistema Debian Stretch com múltiplas interfaces, preciso definir a rota padrão através de uma interface específica ens3
. Esta interface recebe seu endereço IP 10.33.34.2
através do dhcp.
Ajustei o seguinte guia às minhas necessidades:
5.3. A configuração de rede moderna 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.
Habilitei a depuração de systemd-networkd
acordo comComo depurar systemd-networkd?
Depois de reiniciar systemd-networkd
, vejo o seguinte nos logs:
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 ao presumir 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)
Portanto, a configuração /etc/systemd/network/route.network
não tem efeito durante a inicialização. Atualmente, estou me perguntando qual serviço é responsável por ativar todos os dispositivos de rede.
== Editar 2 ==
Este artigo de Steven Ivesonfornece uma boa visão sobre como os dispositivos de rede são iniciados systemd-udevd
e como modificar a configuração da interface.
Ao testar e ler mais, eu também reafirmaria meu problema: as múltiplas interfaces são exibidas em ordem aleatória. Cada um obtém uma configuração DHCP correta. A primeira interface a ser aberta definirá a rota padrão e, portanto, 10.33.34.1
nem sempre será usada como rota padrão
Responder1
SetodosSe as interfaces receberem ofertas DHCP válidas com uma rota padrão, não haverá como 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 é descritaaqui: 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á apenas a routers
opção com a rota padrão para ens3
. Sem problemas de tempo, sem problemas em descobrir quais systemd
arquivos usar, e a rota só será válida quando ens3
estiver ativa e tiver recebido a oferta de DHCP.
Responder2
Para o Debian Stretch, as interfaces são nomeadas por udev e a configuração básica ocorre em /etc/network/interfaces
. Conforme declarado na edição 2, as múltiplas interfaces são exibidas em ordem aleatória. Cada um obtém uma configuração DHCP correta. A primeira interface a ser aberta definirá a rota padrão. Precisamos aceitar apenas a rota padrão para a interface desejada. Isso pode seralcançado por um ganchopara odhcpclient
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
Onde ens8|ens9
pode ser estendido para listar todas as interfaces para as quais a rota padrão não pode ser aceita.