У меня проблема с добавлением прямых маршрутов через 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, поэтому я даже больше не указываю шлюз (просто адрес, а не маршрут), и эта ошибка все еще возникает.