Cómo cambiar el orden de la puerta de enlace predeterminada con systemd-networkd

Cómo cambiar el orden de la puerta de enlace predeterminada con systemd-networkd

Tengo un contenedor lxd configurado con dos interfaces de red (usando systemd-networkd).

El primero tiene una dirección IP estática:

testuser@lxd-7e5cbece-180b-427f-a8b1-b2c12f6e9d79:~$ cat /etc/systemd/network/20-net0.network 
[Match]
Name=net0

[Network]
Address=162.132.242.249/26
Gateway=162.132.192.252
DNS=162.132.192.252
DNS=162.132.170.6

Y la interfaz predeterminada de lxd (que usa DHCP):

testuser@lxd-7e5cbece-180b-427f-a8b1-b2c12f6e9d79:~$ cat /etc/systemd/network/eth0.network 
[Match]
Name=eth0

[Network]
DHCP=ipv4

[DHCP]
SendHostname=True

Ahora el problema es que la tabla de enrutamiento se genera con 162.132.192.252(desde net0) como puerta de enlace predeterminada, pero me gustaría que la puerta de enlace de eth0 fuera la puerta de enlace predeterminada.

testuser@lxd-7e5cbece-180b-427f-a8b1-b2c12f6e9d79:~$ sudo route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         162.132.242.252 0.0.0.0         UG    0      0        0 net0
0.0.0.0         10.245.111.1    0.0.0.0         UG    1024   0        0 eth0
10.245.111.0    0.0.0.0         255.255.255.0   U     0      0        0 eth0
10.245.111.1    0.0.0.0         255.255.255.255 UH    1024   0        0 eth0
162.132.242.192 0.0.0.0         255.255.255.192 U     0      0        0 net0

1) ¿Por qué se genera la tabla de enrutamiento en ese orden? (primero net0 y luego eth0)

2) ¿Es posible cambiar el orden de las puertas de enlace predeterminadas?

Respuesta1

Para cualquiera que tenga el mismo problema, puede hacerlo utilizando métricas. En lugar de definir la puerta de enlace predeterminada en la sección [Red], puede agregar una ruta predeterminada con una métrica más baja a la interfaz estática:

[Match]
Name=net0

[Network]
Address=162.132.242.249/26
DNS=162.132.192.252
DNS=162.132.170.6

[Route]
Gateway=162.132.192.252
Destination=0.0.0.0/0
Metric=1024

Después de esto, puede hacer lo mismo para una interfaz DHCP (tenga en cuenta que no es necesario definir la puerta de enlace porque la proporcionará su servidor DHCP):

[Match]
Name=eth0

[Network]
DHCP=ipv4

[DHCP]
SendHostname=True
UseDomains=True

[Route]
Destination=0.0.0.0/0
Metric=1000

Ahora obtienes la tabla de enrutamiento deseada con la interfaz eth0 como puerta de enlace predeterminada:

> ip route list
default dev eth0 proto static metric 1000 
default dev net0 proto static metric 1024 
default via 10.245.111.1 dev eth0 proto dhcp src 10.245.111.96 metric 1024 
10.245.111.0/24 dev eth0 proto kernel scope link src 10.245.111.96 
10.245.111.1 dev eth0 proto dhcp scope link src 10.245.111.96 metric 1024 
162.132.242.192/26 dev net0 proto kernel scope link src 162.132.242.249 

Respuesta2

Esta no es realmente una cuestión de programación. Sería mejor que preguntaras cosas como esta en StackExchange Unix y Linux.

Tuve un escenario similar: múltiples interfaces que usan DHCP provocan múltiples rutas predeterminadas.

Lo que hice, puede que también funcione para usted, es decirle a las interfaces dónde no queremos las rutas DHCP que no las queremos. En el .networkarchivo de la interfaz, agregue la UseRoutes=falseopción DHCP como en este ejemplo:

[Match]
Name=eno3

[Network]
DHCP=ipv4

[DHCP]
UseRoutes=false

información relacionada