Hatifnatt
@Hatifnatt

Как настроить нестандартную маршрутизацию Failover IP в Hetzner?

Имеется вот такой "сетап" (кликабельно).
uc?id=12vDLeJgvqyMyGXJTr4ssl6oAF36pCwD_
Диаграмма 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 и ничего никуда не шлет.

Можно ли вообще данную задачу решить средствами статической маршрутизации или необходима динамическая маршрутизация?
  • Вопрос задан
  • 251 просмотр
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы