OpenVPN + CARP

Настройка сетевых служб, маршрутизации, фаерволлов. Проблемы с сетевым оборудованием.
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
xeo
рядовой
Сообщения: 14
Зарегистрирован: 2007-11-30 17:32:29

OpenVPN + CARP

Непрочитанное сообщение xeo » 2011-01-21 17:28:46

Всем добрый день.

Столкнулся с проблемой при использовании CARP и OpenVPN.

Конфигурация стандартная:

Код: Выделить всё

            Router
              |
        +-----|-----+
        |  switch   |
        +-/-------\-+
         /         \         
        /           \              
       /             \           
+-----/------+   +----\-------+
|    FW1     |   |    FW2     |
+------------+   +------------+
FW1,FW2 - FreeBSD 8.1, из которых собран отказоустойчивый firewall на базе CARP + pfsync.
Так же на них крутится OpenVPN который поднят на CARP интерфейсе как сервер.

Теперь о проблеме, она заключается в возможности отсылать пакеты с backup carp интерфейса наружу.
Для примера скажем на carp0 у нас назначен 1.1.1.1 ip. Если мы выполним команду ping -S 1.1.1.1 ya.ru то пакеты будут уходить наружу.
Что повлечет смену mac в arp таблице свича, и входящие пакеты на 1.1.1.1 побегут на FW2, хотя он мастером не является.
Естественно что такой ping никто делать не будут, но все же не приятно.

Так вот, в OpenVPN есть прекрассная директива keepalive, ломает весь кайф от CARP.

Ситуация:
1. FW1 является мастером, связь с клиентом по openvpn поднята, они обмениваются keepalive пакетами.
2. Посылаем FW1 в ребут, мастером становится FW2. Он ничего не знает о клиентах, но клиенты продолжают слать ему keepalive, на которые он не отвечает.
3. По прошествии времени, клиенты не полчая ответ от FW2 рестартуют свои OpenVPN процессы и заново подключаются. Все ок.
4. В это время из ребута возвращается FW1 и забирает master на свой carp интерфейс.
5. И тут происходит страшное, клиенты посылают keepalive пакеты, и они идут на FW1, но FW2 тоже шлет keepalive клиентам. Коммутатор сходит с ума, постоянно меняет ARP таблицу и трафик от клиентов ходит то на FW1 то на FW2 примерно 50/50.

Переломить такую ситуацию возможно только ребутом OpenVPN на FW2, либо выключением там carp на какой то период, пока OpenVPN не успокоится со своим keepalive.

Вопрос, какого хера ?
Как настроить OpenVPN с этими keepalive, либо запретить отсылку исходящего трафика если CARP интерфейс не в статусе master ?

Конфиги openvpn,
Server:

Код: Выделить всё

cd /usr/local/etc/openvpn/fe
client-config-dir /usr/local/etc/openvpn/fe/ccd
port 5556
local 1.1.1.1
proto udp
dev tun2
server 172.31.192.0 255.255.255.0
ifconfig 172.31.192.1 172.31.192.2
ca /usr/local/etc/openvpn/fe/keys/ca.crt
cert /usr/local/etc/openvpn/fe/keys/server.crt
key /usr/local/etc/openvpn/fe/keys/server.key
dh /usr/local/etc/openvpn/fe/keys/dh1024.pem
tls-server
tls-auth keys/ta.key 0
tls-timeout 120
auth MD5
comp-lzo
cipher BF-CBC        # Blowfish (default)
keepalive 5 20
ping-timer-rem
persist-key
persist-tun
user nobody
group nobody
status /var/log/openvpn/fe-status.log
log /var/log/openvpn/fe.log
verb 3
mute 20
client:

Код: Выделить всё

client
dev tun1
proto udp
remote 1.1.1.1 5556
resolv-retry infinite
nobind
persist-key
persist-tun
mute-replay-warnings
auth MD5
cipher BF-CBC
ns-cert-type server
comp-lzo
verb 3
mute 20
ca /etc/openvpn/fw/ca.crt
key /etc/openvpn/fw/f02.key
cert /etc/openvpn/fw/f02.crt
tls-client
tls-auth /etc/openvpn/fw/ta.key 1
log /var/log/openvpn/fw.log
script-security 3
up /etc/openvpn/fw/up_route.sh
keepalive 5 30
где 1.1.1.1 CARP IP.

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
skeletor
майор
Сообщения: 2548
Зарегистрирован: 2007-11-16 18:22:04

Re: OpenVPN + CARP

Непрочитанное сообщение skeletor » 2011-01-23 18:29:32

Попробовать поиграться с keepalive и подобрать нужные параметры.

Гость
проходил мимо

Re: OpenVPN + CARP

Непрочитанное сообщение Гость » 2011-01-24 4:43:06

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

Гость
проходил мимо

Re: OpenVPN + CARP

Непрочитанное сообщение Гость » 2011-01-24 4:49:43

еще один вариант крутится в голове но руки не доходят проверить его.
это carp на tap интерфейсах внутри openvpn. может кто-то знает возможно ли это ?


xeo
рядовой
Сообщения: 14
Зарегистрирован: 2007-11-30 17:32:29

Re: OpenVPN + CARP

Непрочитанное сообщение xeo » 2011-01-27 23:43:58

всем спасибо за участие.
ospf не подходит, клиенты его не понимают.

добрые люди подсказали решение.
пока довольно успешно решение работает благодаря devd, демон может инициировать действия при изменении carp интерфейса.

для примера вот мой конфиг:

Код: Выделить всё

 root# cat /usr/local/etc/devd/carp.conf
notify 10 {
        match "system"          "IFNET";
        match "subsystem"       "carp1";
        match "type"            "LINK_UP";
        action                  "/usr/local/etc/bin/openvpn_start.sh";
};

notify 10 {
        match "system"          "IFNET";
        match "subsystem"       "carp1";
        match "type"            "LINK_DOWN";
        action                  "/usr/local/etc/bin/openvpn_stop.sh";
};
от сюда видно, openvpn запускается или останавливается в зависимости от того, поднимается carp или опускается.