Проект

Общее

Профиль

Действия

HA fronend: ucarp + conntrackd

Данная схема позволяет построить фронтенд высокой доступности, имеющий на борту SNAT/DNAT.
Подразумевается что активен всегда front1 , при его недоступности в работу вступает front2,
при этом, пользователи, подключенные к ssh бэкенда через фронт, а так-же все соединения с
'интернет' на бэкенде не обрываются.

дано

frontend1, где:
  • eth0 - внешний интерфейс (интернет, условно 192.168.0.31/24, mac:50:ff:ff:ff:ff:22)
  • eth1 - внутренний интерфейс (локалка 192.168.1.10/24, mac:50:ff:ff:ff:ff:23)
  • eth2 - внутренний интерфейс (служебный, только для failover, 192.168.2.11/24)
frontend2, где:
  • eth0 - внешний интерфейс (интернет, условно 192.168.0.31/24, mac:50:ff:ff:ff:ff:22)
  • eth1 - внутренний интерфейс (локалка 192.168.1.10/24, mac:50:ff:ff:ff:ff:23)
  • eth2 - внутренний интерфейс (служебный, только для failover, 192.168.2.12/24)

iptables на front-ах, доступ в интернет из локалки + проброс ssh front:220022 -> backend:22

-A PREROUTING -d 192.168.0.31/32 -p tcp -m tcp --dport 22022 -j DNAT --to-destination 192.168.1.100:22
-A OUTPUT -s 192.168.0.31/32 -d 192.168.0.31/32 -p tcp -m tcp --dport 22022 -j DNAT --to-destination 192.168.1.100:22
-A POSTROUTING -s 192.168.1.0/24 -o eth1 -j SNAT --to-source 192.168.0.31

Важно: на фронтендах mac и ip eth0 должны совпадать, маки и ip eth1 должны совпадать

backend, где:
  • eth0 - 192.168.1.100/24 default gw 192.168.1.10

config conntrackd на фронтах

cp /usr/share/doc/conntrackd/examples/sync/primary-backup.sh /etc/conntrackd/
cat /etc/conntrackd/conntrackd.conf

Sync {
    Mode NOTRACK {
# настройки таймингов итп.
    }
    Multicast {
        IPv4_address 225.0.0.50
        Group 3780
        IPv4_interface 192.168.2.11 # на front1
#        IPv4_interface 192.168.2.12 # на front2
        Interface eth2
        SndSocketBuffer 1249280
        RcvSocketBuffer 1249280
        Checksum on
    }
}
General {
    HashSize 8192
    HashLimit 65535
    Syslog on
    LockFile /var/lock/conntrackd.lock
    UNIX {
        Path /var/run/conntrackd.sock
        Backlog 20
    }
    SocketBufferSize 262142
    SocketBufferSizeMaxGrown 655355
    Filter {
        Protocol Accept {
            TCP
        }
        Address Ignore {
            IPv4_address 127.0.0.1 # loopback
            IPv4_address 92.168.2.0/24 # sync locale
        }
    }
}

ucarp на фронтах

cat /etc/network/interfaces

auto lo
iface lo inet loopback

#auto eth0
iface eth0 inet static
        address 192.168.0.31/24
    gateway 192.168.0.1
    dns-nameservers 77.88.8.8 77.88.8.1

#auto eth1
iface eth1 inet static
        address 192.168.1.10

auto eth2
iface eth2 inet static
        address 192.168.2.12/24 # для front1
#        address 192.168.2.12/24 # для front2
    gateway 192.168.2.1 # доступ в интернет в режиме BACKUP
    dns-nameservers 77.88.8.8 77.88.8.1
    metric 10
    ucarp-vid 22
    ucarp-password mysecret5
    ucarp-vip 192.168.0.31
    ucarp-downscript /etc/network/ucarp/down.sh
    ucarp-upscript /etc/network/ucarp/up.sh    
    ucarp-master no
    ucarp-advskew 1 # приоритет
    ucarp-advbase 1 # 1сек

cat /etc/network/ucarp/down.sh

#!/bin/bash

/etc/conntrackd/primary-backup.sh backup

/sbin/ifdown eth0
/sbin/ifdown eth1

cat /etc/network/ucarp/up.sh

#!/bin/bash

/etc/conntrackd/primary-backup.sh primary

/sbin/ifup eth0
arping -i eth0 -c1 ff:ff:ff:ff:ff:ff # /???/ постараться избавиться от этого

/sbin/ifup eth1
arping -i eth1 -c1 ff:ff:ff:ff:ff:ff # /???/ постараться избавиться от этого

/etc/init.d/dnsmasq start
/etc/init.d/nginx start

полезные комманды
  • pkill -USR1 ucapr # показать статус ucarp в syslog, пример: [INFO] MASTER on eth2 id 22
  • pkill -USR2 ucarp # переключить ucarp в режим BACKUP
  • conntrackd -i # показать локальные conntrack соединения
  • conntrackd -e # показать внешние conntrack соединения
полезные ссылки

Обновлено Константин Пильник около 7 лет назад · 8 изменени(я, ий)