Добрый день.
Бьюсь над вопросом уже довольно долго, но решение никак не могу найти.
Задача: Настроить 2 плавающих адреса (внешний и внутренний) между двумя серверами ubuntu. Чтобы если один сервер упадёт, адреса переехали на другой сервер.
Данные: 10.10.255.171 - внутренний статический адрес сервера 10.10.255.170 - плавающий внутренний адрес 212.79.91.71 - плавающий внешний адрес
Дошел до запуска всего что нужно через iproute2 + netplan + keepalived
Netplan:
network:
version: 2
ethernets:
ens160:
addresses:
- 10.10.255.171/25
gateway4: 10.10.255.129
keepalived:
vrrp_instance internal {
state MASTER
interface ens160
virtual_router_id 10
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass +hinFang75
}
virtual_ipaddress {
10.10.255.170/25
}
}
vrrp_instance external {
state BACKUP
interface ens160
virtual_router_id 20
priority 50
advert_int 1
authentication {
auth_type PASS
auth_pass +hinFang75
}
virtual_ipaddress {
212.79.91.71/28 gw 212.79.91.65 dev ens192
}
}
При запуске системы поднимается keepalived и мне доступны оба внутренних адреса.
Теперь добавляю записи iproute2
iproute2:
Создаем таблицы
echo '100 local' >> /etc/iproute2/rt_tables
echo '101 inet' >> /etc/iproute2/rt_tables
Добавляем дефолтный шлюз
ip route add default via 10.10.255.129 table 100
ip route add default via 212.79.91.65 table 101
Определяем правила:
ip rule add from 10.10.255.170 table 100
ip rule add from 212.79.91.71 table 101
На этом этапе начинаю получать ответы по внешнему адресу, но только до перезапуска keepalived или интерфейса ens192. После перезапуска адрес появляется на интерфейсе, но больше не пингуется.
Я пробовал добавить метки на интерфейсы, но ничего не изменилось
Привязка ответа по тому же интерфейсу, по которому был получен пакет.
iptables -t mangle -A INPUT -i ens160 -j CONNMARK --set-mark 0x1
iptables -t mangle -A INPUT -i ens192 -j CONNMARK --set-mark 0x2
iptables -t mangle -A OUTPUT -j CONNMARK --restore-mark
iptables -t mangle -A OUTPUT -m mark ! --mark 0x0 -j ACCEPT
iptables -t mangle -A OUTPUT -d 10.10.255.170/32 -j MARK --set-mark 0x1
iptables -t mangle -A OUTPUT -d 212.79.91.71/32 -j MARK --set-mark 0x2
Теперь добавим правила роутинга так, чтобы с помощью файрвола выставив нужные значения fwmark мы могли выбрать нужную таблицу роутинга:
ip rule add priority 101 fwmark 0x1/0x1 lookup 100
ip rule add priority 102 fwmark 0x2/0x2 lookup 101
Я так понимаю проблема в том, что при перезапуске что-то срабатывает неправильно и пакеты для внешнего адреса пытаются уйти не через свой шлюз.
Гуру сети, подскажите пожалуйста, в каком направлении искать решение?