Имеется вот такой "сетап" (кликабельно).
Диаграмма
Draw.io
Вводные данные:
- Failover IP - IP который может быть переключен на любой из серверов, Хецнер маршрутизирует трафик до главного IP нужного сервера, дальше сам сервер должен маршрутизировать трафик до ВМ. Сами сервера "не знают" направлен на них Failover IP или нет. Можно делать запрос к API и узнавать, но у API лимит 100 запросов в час, особо не разгонишься.
- 3 KVM гипервизора, на 2-х имеются ВМ которые используют Failover IP.
- Failover IP подключен на KVM Host 1
- Настройка vmbr2 на хосте
auto vmbr2
iface vmbr2 inet manual
bridge_ports none
bridge_stp off
bridge_fd 0
- Настройка интерфейса и маршрутов на ВМ
2: ens18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 86:47:47:fb:a7:ff brd ff:ff:ff:ff:ff:ff
inet 46.4.100.100 peer 88.99.99.100/32 scope global ens18
valid_lft forever preferred_lft forever
# ip route show
default via 172.21.3.1 dev ens19
88.99.99.100 dev ens18 proto kernel scope link src 46.4.100.100
# ip rule sh
0: from all lookup local
32765: from 46.4.100.100 lookup 10
32766: from all lookup main
32767: from all lookup default
# ip route show table 10
default via 88.99.99.100 dev ens18
Задача в том, чтоб внешние клиенты и все ВМ размещенные на гипервизорах могли
получать доступ обращаясь к ресурсам которые расположены на Failover IP.
Простейший вариант, чтоб трафик проходил до ВМ, на каждом гиервизоре прописываю маршрут
ip route add 46.4.100.100/32 dev vmbr2
Проблема такой реализации - доступ к Failover IP могут получить только внешние клиенты, и те ВМ которые расположены на одном гипервизоре с "Failover IP ВМ", притом трафик уйдет именно на ближайшую "Failover IP ВМ", VM11 и VM12 попадут на VM10, VM21 и VM22 попадут на VM20, а VM30 и VM31 никуда не попадут, получат "Destination Host Unreachable" т.к. гипервизоры просто отправляют весь трафик в
vmbr2.
Альтернативный вариант с использованием policy based routing, дающий немного лучший результат
ip route add 46.4.100.100/32 dev vmbr2 table 11
ip rule add to 46.4.100.100 table 11
ip rule add to 46.4.100.100 iif vmbr1 table main
# ip rule sh
0: from all lookup local
32763: from all to 46.4.100.100 iif vmbr1 lookup main
32764: from all to 46.4.100.100 lookup 11
32765: from all lookup main
32766: from all lookup default
При такой настройке трафик с ВМ попадает под правило
from all to 46.4.100.100 iif vmbr1 lookup main
и уходит в основную таблицу маршрутизации, соответственно отправляется на шлюз по умолчанию, т.е. на оборудование Хецнера, которое маршрутизирует трафик на текущий активный Failover IP сервер, т.е. на KVM Host 1, на KVM Host 1 трафик попадает под правило
from all to 46.4.100.100 lookup 11
и уходит на VM10 через
vmbr2.
Проблема в том что это не работает для машин на KVM1, трафик улетает в Хецнер и на этом все кончается, видимо шлюз "видит" что после прохождения таблицы маршрутизации SRC = DST и ничего никуда не шлет.
Можно ли вообще данную задачу решить средствами статической маршрутизации или необходима динамическая маршрутизация?