Модифицировать маршруты systemd-networkd не умеет. А что если в настройках каждого интерфейса указать два дефолт маршрута: обычный через один шлюз с метрикой 500, и мультипас через два шлюза с метрикой 100. Если второй маршрут добавить не удалось, будет использоваться маршрут с метрикой 500, если удалось — будет использоваться маршрут с метрикой 100.
Лучше запускай после старта/остановки интерфейса(UP/DOWN) дополнительный скрипт в котором и будешь настраивать маршруты в зависомости от готовых внешних интерфейсов. Не стоит надеяться на networkd и схожих комбайнов.
Кстати, как можно получить всю информацию которую получил networkd, и т.д.? Он может это как то предоставить в структурированном виде через xml,json, и т.д. Или пробовать только через dbus его запрашивать? Т.е. с IP/NET ещё терпимо, «ip a» - наше всё, а вот маршруты сложнее разобрать чей именно.
Насколько я понял MultiPathRoute - это не multipath tcp, так что должно работать наверное. Да и на 2й стороне тоже мои сервера, так что не должно быть ничего такого.
Насколько я понял MultiPathRoute - это не multipath tcp
Вот именно! На 10-й букве есть различие! :)
Представь, что ты хостер и клиент шлёт тебе пакеты ни из твоей сети и не в твою сеть. Это спуфинг, который обычно используется для ддос и нормальные хостеры такое не позволяют.
Но если все эти адреса относятся к одному хостеру или хостер раздолбай, то скорее всего эта конструкция (MultiPathRoute) будет работать.
IMHO через хуки systemd-network (в виде скриптов в /etc/networkd-dispatcher/routable.d) добавлять или модифицировать dgw не составит труда.
Да и на 2й стороне тоже мои сервера, так что не должно быть ничего такого.
Не, у меня такого нет, везде нат на правильные адреса. Снаружи тоже ничего левого не придёт, т.к. он на ходу посередине соединения вроде маршруты не меняет.
# 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
Если нужно выпустить кучу коннектов разных клиентов на разные сервера, то тут есть проблема - нужно привязывать юзера к каналу, а иначе может сломаться какое-нибудь приложение которое отслеживает ip клиента в течении сессии. Для такой ситуации я не знаю решений (Решения с NAT работают с диапазоном адресов, а не с набором).
И противоположная ситуация, когда тебе нужно получить максимальную полосу от одного клиента к одному внешнему серверу. Вот тут multipathtcp мог бы помочь.
Есть упоминания про использование openvpn c MPTCP. Но про настройку MPTCP я пока ничего не знаю.