
En un sistema Debian Stretch con múltiples interfaces, necesito definir la ruta predeterminada a través de una interfaz específica ens3
. Esta interfaz recibe su dirección IP 10.33.34.2
a través de dhcp.
Ajusté la siguiente guía a mis necesidades:
5.3. La configuración de red moderna sin GUI
Así, creé un archivo /etc/systemd/network/route.network
con el siguiente contenido
[Match]
Name=ens3
[Network]
Gateway=10.33.34.1
Sin embargo, la ruta predeterminada no está configurada correctamente al inicio.
Habilité la depuración systemd-networkd
de acuerdo con¿Cómo depurar systemd-networkd?
Después de reiniciar systemd-networkd
, veo lo siguiente en los 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 networkd intenta establecer la ruta antes de asignar la dirección IP a través de dhcp.
¿Cómo puedo configurar la ruta predeterminada a una interfaz específica con systemd?
== Editar ==
Me equivoqué al suponer que systemd-networkd muestra las interfaces. Si reinicio el sistema, veo
$ 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)
Por lo tanto, la configuración /etc/systemd/network/route.network
no tiene ningún efecto al iniciar. Actualmente, me pregunto qué servicio es responsable de mostrar todos los dispositivos de red.
== Editar 2 ==
Este artículo de Steven Ivesonproporciona una buena visión sobre cómo se inician los dispositivos de red systemd-udevd
y cómo modificar la configuración de la interfaz.
Al realizar pruebas y leer más, también reafirmaría mi problema: las múltiples interfaces aparecen en orden aleatorio. Cada uno obtiene una configuración dhcp correcta. La primera interfaz que aparecerá establecerá la ruta predeterminada y, por lo tanto, 10.33.34.1
no siempre se utilizará como ruta predeterminada.
Respuesta1
Sitodolas interfaces reciben ofertas DHCP válidas con una ruta predeterminada, entonces no habrá forma de configurarlas dhclient
para ignorarlas; eso no es algo que pueda hacer con systemd
, udev
o cualquier otra cosa conectada al sistema de inicio.
Una forma de hacerlo se describeaquí: Creas (por supuesto, también puedes usar un editor) un fragmento de script de shell en uno de los directorios "gancho" 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 solo aceptará la routers
opción con la ruta predeterminada para ens3
. No hay problemas con el tiempo, no hay problemas para determinar qué systemd
archivos usar, y la ruta sólo será válida cuando ens3
esté activa y haya recibido la oferta de DHCP.
Respuesta2
Para Debian Stretch, las interfaces reciben el nombre de udev y la configuración básica se realiza en /etc/network/interfaces
. Como se indica en la edición 2, las múltiples interfaces aparecen en orden aleatorio. Cada uno obtiene una configuración dhcp correcta. La primera interfaz que aparezca establecerá la ruta predeterminada. Solo debemos aceptar la ruta predeterminada para la interfaz deseada. Esto puede serlogrado por un ganchohaciadhcpclient
Agregue un nuevo script de enlace /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
Where ens8|ens9
se puede ampliar para enumerar todas las interfaces para las que no se puede aceptar la ruta predeterminada.