Как изменить порядок шлюза по умолчанию с помощью systemd-networkd

Как изменить порядок шлюза по умолчанию с помощью systemd-networkd

У меня есть контейнер lxd, настроенный с двумя сетевыми интерфейсами (используется systemd-networkd).

Первый имеет статический IP-адрес:

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

И интерфейс по умолчанию от lxd (который использует DHCP):

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

[Network]
DHCP=ipv4

[DHCP]
SendHostname=True

Проблема в том, что таблица маршрутизации сформирована с использованием 162.132.192.252(из net0) в качестве шлюза по умолчанию, но я бы хотел, чтобы шлюз из eth0 был шлюзом по умолчанию.

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) Почему таблица маршрутизации формируется именно в таком порядке? (сначала net0, а затем eth0)

2) Можно ли изменить порядок шлюзов по умолчанию?

решение1

Для тех, у кого та же проблема, вы можете сделать это с помощью метрик. Вместо определения шлюза по умолчанию в разделе [Сеть] вы можете добавить маршрут по умолчанию с более низкой метрикой к статическому интерфейсу:

[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

После этого вы можете сделать то же самое для интерфейса DHCP (обратите внимание, что вам не нужно определять шлюз, поскольку он будет предоставлен вашим DHCP-сервером):

[Match]
Name=eth0

[Network]
DHCP=ipv4

[DHCP]
SendHostname=True
UseDomains=True

[Route]
Destination=0.0.0.0/0
Metric=1000

Теперь вы получаете желаемую таблицу маршрутизации с интерфейсом eth0 в качестве шлюза по умолчанию:

> 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 

решение2

Это не совсем вопрос программирования. Лучше бы вы задавали такие вопросы на StackExchange Unix & Linux.

У меня была похожая ситуация: несколько интерфейсов использовали DHCP, что приводило к появлению нескольких маршрутов по умолчанию.

Что я сделал, и это может сработать и для вас, так это сказал интерфейсам, где мы не хотим маршруты DHCP, что они нам не нужны. В файле .networkдля интерфейса добавьте UseRoutes=falseопцию DHCP, как в этом примере:

[Match]
Name=eno3

[Network]
DHCP=ipv4

[DHCP]
UseRoutes=false

Связанный контент