Назад | Перейти на главную страницу

systemd-networkd и прямые маршруты

У меня проблема с добавлением прямых маршрутов через systemd-networkd. То, что я пытаюсь достичь, похоже на:

ip a a 192.168.0.2/32 dev enp0s3
ip r a 192.168.0.1/32 dev enp0s3
ip r a default via 192.168.0.1

Я знаю, что это странная установка, но я не могу использовать обычную ip a a 192.168.0.2/24 добраться до шлюза. По какой-то причине вся подсеть / 24 доступна через шлюз в этой подсети. Таким образом, этот маршрут по умолчанию предназначен не только для всех маршрутов, но и для достижения подсети. Итак, я создал /etc/systemd/network/enp0s3.network:

[Match]
Name=enp0s3

[Address]
Address=192.168.0.2/32

[Route]
Destination=192.168.0.1/32

[Route]
Gateway=192.168.0.1

Проблема с этой настройкой в ​​том, что второй Route блок никогда не выполняется. Я немного отладил и вот разница между тем, что ip и systemd-networkd делает для первого Route блок.

# ip
192.168.0.1 dev enp0s3 scope link
# networkd
192.168.0.1 dev enp0s3 proto static

Так systemd-networkd не добавляет scope link к маршруту. Поэтому попытка добавить маршрут по умолчанию через 192.168.0.1 терпит неудачу с Network is unreachable ошибка. Это можно исправить

ip r c 192.168.0.1/32 dev enp0s3 # automatically adds `scope link`
ip r a default via 192.168.0.1   # added successfully

Итак, мой вопрос: следует ли считать такое поведение systemd-networkd ошибка или я неправильно использую? Я не смог найти никакой документации по прямым маршрутам в networkd. На данный момент я отключил systemd-networkd и создал сервис для запуска ip команды напрямую. Но я бы хотел использовать стандартный подход, так как это CoreOS, которую я пытаюсь настроить.

Итак, решение здесь немного сложное: вам нужно добавить шлюз в качестве параметра pointtopoint с маской / 32. Это работает:

[Match]
Name=enp0s3

[Address]
Address=192.168.0.2
Peer=192.168.0.1/32

[Network]
Gateway=192.168.0.1

Вы хотите указать, как можно достичь шлюза через локальную область. То есть фактически достижимо на том же сегменте. В вашем примере просто отсутствует строка Scope=link.

[Match]
Name=enp0s3

[Address]
Address=192.168.0.2/32

[Route]
Destination=192.168.0.1/32
Scope=link

[Route]
Gateway=192.168.0.1

Ни одно из предложенных решений не работало с systemd 237, потому что GatewayOnlink=true скучал.

Мне удалось использовать локальный шлюз IPv4 с адресом интерфейса / 32 с такой конфигурацией:

[Match]
Name=eth0

[Network]
Address=192.0.2.42/32

[Route]
Destination=169.254.1.1
Scope=link

[Route]
Gateway=169.254.1.1
GatewayOnlink=true

У меня аналогичная настройка для IPv6 (кто-то описывает случай здесь: https://phyks.me/2014/11/getting-ipv6-to-work-with-a-kimsufi-server.html).

В вашем случае это будет переводиться как таковое:

[Math]
Name=enp0s3

[Network]
Address=192.168.0.2/32
Gateway=192.168.0.1

[Route]
Destination=192.168.0.1

Он работает нормально (по крайней мере, в моем случае), хотя недавно я заметил, что вывод systemd-networkd enp1s0f0: Could not set NDisc route or address: Invalid argument. Но не знаю, почему, и моя система все еще работает.

РЕДАКТИРОВАТЬ: эта ошибка кажется несвязанной. Я обнаружил, что мой провайдер включил RA, поэтому я даже больше не указываю шлюз (просто адрес, а не маршрут), и эта ошибка все еще возникает.