LINUX.ORG.RU
ФорумAdmin

systemd + default gw с двумя nexthop

 ,


0

4

Как в конфиге системд прописать аналог

# ip route add default table 123 nexthop via 1.1.1.1 nexthop via 2.2.2.2

?

Я чето задолбался с [NextHop] и всякими MultiPathRoute=

Таблица 123 или остаётся пустой или там просто 2 default gw

★★★★★
Ответ на: комментарий от hbars

netplan говно! Там нет адекватной реализации хотелок про «ip ru»

Только костылями в виде своего сервиса или хуков в systemd-networkd.

Возьму свои слова обратно, если расскажут как туда добавить строку

from all lookup main suppress_prefixlength 0

vel ★★★★★
()
Ответ на: комментарий от iliyap

Да, я кажется понял, что было не так.

Я хочу, чтобы при поднятии интерфейса добавлялся хоп в дефолтный маршрут.

Если вставлять по одному MultiPathRoute, то он всё предыдущее забывает и хоп будет всегда один - последний.

Если вставить в конфиг каждого интерфейса по 2 MultiPathRoute, то если хоть один из хопов недоступен этот системд не добавляет ничего.

Но если все интерфейсы поднялись, то последний добавляет как надо.

А есть ли способ при поднятии интерфейса добавить только новый хоп в существующий дефолтный маршрут?

sergej ★★★★★
() автор топика
Ответ на: комментарий от sergej

Модифицировать маршруты systemd-networkd не умеет. А что если в настройках каждого интерфейса указать два дефолт маршрута: обычный через один шлюз с метрикой 500, и мультипас через два шлюза с метрикой 100. Если второй маршрут добавить не удалось, будет использоваться маршрут с метрикой 500, если удалось — будет использоваться маршрут с метрикой 100.

iliyap ★★★★★
()
Ответ на: комментарий от iliyap

Да, идея добавить неск маршрутов в надежде, что хоть один добавится рабочая, спасибо.

У меня правда больше 2х интерфейсов на самом деле, но думаю мне не нужны вообще все комбинации, 3-4х хватит.

Интересно, что для ipv6 он игнорирует нерабочий MultiPathRoute и добавляет остальное, а для ipv4 не добавляет весть маршрут.

sergej ★★★★★
() автор топика
Ответ на: комментарий от sergej

Я хочу, чтобы при поднятии интерфейса добавлялся хоп в дефолтный маршрут.

Если вставлять по одному MultiPathRoute, то он всё предыдущее забывает и хоп будет всегда один - последний.

Если у тебя куча белых адресов от разных провайдеров, то MultiPathRoute может оказаться плохой идеей.

Нужно сначала убедиться, что провайдеры не фильтруют чужой трафик от своих клиентов.

vel ★★★★★
()
Ответ на: комментарий от vel

Лучше запускай после старта/остановки интерфейса(UP/DOWN) дополнительный скрипт в котором и будешь настраивать маршруты в зависомости от готовых внешних интерфейсов. Не стоит надеяться на networkd и схожих комбайнов.

Кстати, как можно получить всю информацию которую получил networkd, и т.д.?
Он может это как то предоставить в структурированном виде через xml,json, и т.д. Или пробовать только через dbus его запрашивать?
Т.е. с IP/NET ещё терпимо, «ip a» - наше всё, а вот маршруты сложнее разобрать чей именно.

Atlant ★★★★★
()
Ответ на: комментарий от vel

Насколько я понял MultiPathRoute - это не multipath tcp, так что должно работать наверное. Да и на 2й стороне тоже мои сервера, так что не должно быть ничего такого.

sergej ★★★★★
() автор топика
Ответ на: комментарий от sergej

Насколько я понял MultiPathRoute - это не multipath tcp

Вот именно! На 10-й букве есть различие! :)

Представь, что ты хостер и клиент шлёт тебе пакеты ни из твоей сети и не в твою сеть. Это спуфинг, который обычно используется для ддос и нормальные хостеры такое не позволяют.

Но если все эти адреса относятся к одному хостеру или хостер раздолбай, то скорее всего эта конструкция (MultiPathRoute) будет работать.

IMHO через хуки systemd-network (в виде скриптов в /etc/networkd-dispatcher/routable.d) добавлять или модифицировать dgw не составит труда.

Да и на 2й стороне тоже мои сервера, так что не должно быть ничего такого.

В данном случае это неважно.

vel ★★★★★
()
Ответ на: комментарий от vel

Не, у меня такого нет, везде нат на правильные адреса. Снаружи тоже ничего левого не придёт, т.к. он на ходу посередине соединения вроде маршруты не меняет.

sergej ★★★★★
() автор топика
Ответ на: комментарий от sergej

Попробовал:

# /etc/systemd/network/wan1.netdev
[NetDev]
Name=wan1
Kind=dummy
# /etc/systemd/network/wan2.netdev
[NetDev]
Name=wan2
Kind=dummy
# /etc/systemd/network/wan1.network
[Match]
Name=wan1
[Address]
Address=1.1.1.123/24
[Route]
Table=123
Destination=0.0.0.0/0
Gateway=1.1.1.1
Metric=500
[Route]
Table=123
Destination=0.0.0.0/0
MultiPathRoute=1.1.1.1@wan1
MultiPathRoute=2.2.2.2@wan2
Metric=100
# /etc/systemd/network/wan2.network
[Match]
Name=wan2
[Address]
Address=2.2.2.123/24
[Route]
Table=123
Destination=0.0.0.0/0
Gateway=2.2.2.2
Metric=500
[Route]
Table=123
Destination=0.0.0.0/0
MultiPathRoute=1.1.1.1@wan1
MultiPathRoute=2.2.2.2@wan2
Metric=100

Вроде работает как должно:

# systemctl restart systemd-networkd
# ip ro ls table 123
default proto static metric 100 
	nexthop via 1.1.1.1 dev wan1 weight 1 
	nexthop via 2.2.2.2 dev wan2 weight 1 
default via 1.1.1.1 dev wan1 proto static metric 500 
default via 2.2.2.2 dev wan2 proto static metric 500 
# networkctl down wan2
# networkctl down wan1
# ip ro ls table 123
# networkctl up wan1
# ip ro ls table 123
default via 1.1.1.1 dev wan1 proto static metric 500 
# networkctl up wan2
# ip ro ls table 123
default proto static metric 100 
	nexthop via 1.1.1.1 dev wan1 weight 1 
	nexthop via 2.2.2.2 dev wan2 weight 1 
default via 1.1.1.1 dev wan1 proto static metric 500 
default via 2.2.2.2 dev wan2 proto static metric 500 

В логе ожидаемая ошибка про wan1:

Dec 17 08:40:58 nb-3046 systemd-networkd[154686]: wan1: Could not set route: Nexthop has invalid gateway. Network is unreachable
Dec 17 08:40:58 nb-3046 systemd-networkd[154686]: wan1: Failed

CentOS Stream 9, systemd 253.

iliyap ★★★★★
()
Ответ на: комментарий от sergej

IMHO готовых, хороших универсальных решений нет.

Есть 2 крайности:

Если нужно выпустить кучу коннектов разных клиентов на разные сервера, то тут есть проблема - нужно привязывать юзера к каналу, а иначе может сломаться какое-нибудь приложение которое отслеживает ip клиента в течении сессии. Для такой ситуации я не знаю решений (Решения с NAT работают с диапазоном адресов, а не с набором).

И противоположная ситуация, когда тебе нужно получить максимальную полосу от одного клиента к одному внешнему серверу. Вот тут multipathtcp мог бы помочь. Есть упоминания про использование openvpn c MPTCP. Но про настройку MPTCP я пока ничего не знаю.

vel ★★★★★
()