Redundantny Firewall w OpenBSD

Firewall to obecnie podstawowe urządzenie, które oddziela prywatną sieć od świata zewnętrzengo. Często spełnia on też rolę bramy domyślnej (szczególnie w mniejszych sieciach). W przypadku awarii tego urządzenia sieć jest zupełnie pozbawiona dostępu do Internetu. Warto zabezpieczyć się przed taką sytuacją, szczególnie że jest to możliwe do wykonania praktycznie za darmo.
Jako konfiguracji testowej użyjemy systemu OpenBSD 4.8, do tego jako sprzęt 2x Soerkis Box net5501. OpenBSD używa protokołu CARP (Common Address Redundancy Protocol), który tworzy nowe „wirtualne” interfejsy w systemie (carp1, carp2…). Jeden z firewall’i pełni funkcję głównego (status: master), a kolejne- zapasowego (status: backup). Interfejs carp co określony czas wysyla do sieci rozgłoszenia (CARPv2-advertise), dzięki którym druga maszyna wie, że pierwsza wciąż działa. Rozgłoszenia wysyłane są używając multicastowego adresu 224.0.0.18.

Schemat sieci

schemat sieci

fw-m (MASTER)
vr0: WAN (IP: x.x.x.10)
vr1: LAN (IP 192.168.1.10)
carp0 : WAN (IP: x.x.x.1)
carp1 : LAN (IP 192.168.1.1)
fw-s (BACKUP)
vr0: WAN (IP: x.x.x.11)
vr1: LAN (IP 192.168.1.11)
carp0 : WAN (IP: x.x.x.1)
carp1 : LAN (IP 192.168.1.1)

Jest to dosyć prosta konfiguracja, 2 interfejsy (LAN/WAN), jednak bez problemu można ją rozbudować o kolejne interfejsy i podsieci. Warto zwrócić uwagę, że adresy IP na interfejsach carp są identyczne dla obydwu firewall’i ! Te adresy będą też używane w sieci (a więc jako default gateway dla LAN i WAN!).

Konfiguracja

Zaczynamy od skonfigurowania interfejsów na każdym firewall’u:

fw-m (MASTER)

root@fw-m:~>cat /etc/hostname.vr0
inet x.x.x.10 255.255.255.224 x.x.x.31
root@fw-m:~>cat /etc/hostname.vr1
inet 192.168.1.10 255.255.255.0 192.168.1.255
root@fw-m:~>cat /etc/hostname.carp0
inet x.x.x.1 255.255.255.224 x.x.x.31 vhid 100 advbase 5 advskew 0 carpdev vr0 pass jkfd882hfvkjvd2189axkc83hf4cad
root@fw-m:~>cat /etc/hostname.carp1
inet 192.168.1.1 255.255.255.0 192.168.1.255 vhid 101 advbase 5 advskew 0 carpdev vr1 pass qfjvd09ec723hvbx732hs781ah1azc

fw-s (BACKUP)

root@fw-s:~>cat /etc/hostname.vr0
inet x.x.x.11 255.255.255.224 x.x.x.31
root@fw-s:~>cat /etc/hostname.vr1
inet 192.168.1.11 255.255.255.0 192.168.1.255
root@fw-s:~>cat /etc/hostname.carp0
inet x.x.x.1 255.255.255.224 x.x.x.31 vhid 100 advbase 5 advskew 10 carpdev vr0 pass jkfd882hfvkjvd2189axkc83hf4cad
root@fw-s:~>cat /etc/hostname.carp1
inet 192.168.1.1 255.255.255.0 192.168.1.255 vhid 101 advbase 5 advskew 10 carpdev vr1 pass qfjvd09ec723hvbx732hs781ah1azc

vhid (Virtual Host ID): numer identyfikujący grupę carp. Oczywiście interfejsy należą do tej samej grupy, jeśli numer jest ten sam. carp0 przypisujemy numer 100, carp1: 101. vhid przyjmuje wartości od 1 do 255.
advbase: określa co ile sekund firewall ma wysyłać pakiety CARPv2-advertise. Jeżeli zapasowy firewall nie dostanie takiego pakiety 3 razy, automatycznie zmienia swój status na MASTER. W podanej konfiguracji rozgłoszenia są wysyłane co 5 sekund, co można zobaczyć używając programu tcpdump:

root@fw-m:/>tcpdump -i vr0 -c 3 -n proto carp
tcpdump: listening on vr0, link-type EN10MB
tcpdump: listening on vr0, link-type EN10MB
14:46:06.904092 carp x.x.x.1 > 224.0.0.18: CARPv2-advertise 36: vhid=100 advbase=5 advskew=0 demote=0 [tos 0x10] (ttl 255, id 43885, len 56)
14:46:11.914291 carp x.x.x.1 > 224.0.0.18: CARPv2-advertise 36: vhid=100 advbase=5 advskew=0 demote=0 [tos 0x10] (ttl 255, id 16961, len 56)
14:46:16.924482 carp x.x.x.1 > 224.0.0.18: CARPv2-advertise 36: vhid=100 advbase=5 advskew=0 demote=0 [tos 0x10] (ttl 255, id 61250, len 56)

advskew: niższa wartośc oznacza, że dany firewall przejdzie do stanu MASTER. Dla firewall’a głównego ustawiamy wartość 0, dla zapasowego: 10.
carpdev: określa z jakim fizycznym interfejsem zostanie połączony logiczny interfejs carp.
pass: hasło używane do autoryzacji przez hosty znajdujące się w tej samej grupie. Tak więc dla interfesjów carp0 musi być ono takie samo na obydwu firewall’ach (i analogicznie z carp1)! Maksymalna długość hasła wynosi 30 znaków. Do jego wygenerowania można użyć narzędzia apg (nie jest domyślnie zainstalowane w systemie):

root@fw-m:~>pkg_add -i apg
root@fw-m:~>apg -M N -m 30 -x 30 -n1
jkfd882hfvkjvd2189axkc83hf4cad

Należy jeszcze skonfigurować 2 opcję w sysctl:

root@fw-m:~>cat /etc/sysctl.conf
net.inet.carp.allow=1
net.inet.carp.preempt=1

Pierwsza pozwala na akceptację pakietów CARP, natomiast włączenie drugiej umożliwia danemu firewall’owi na przejście do stanu MASTER, jeżeli główna maszyna przestanie działać.

Packet Filter

W zasadzie wystarczy dodać tylko 1 linijkę do pf.conf, żeby zezwolić na połączenia carp. Należy pamiętać, że wciąż korzystamy z fizycznych interfejsów (a nie carp!).

WAN_IF="vr0"
LAN_IF="vr1"
pass quick on {$WAN_IF,$LAN1_IF} proto carp keep state

Testujemy konfigurację

Bo zrestartowaniu systemu (lub uruchomieniu netstart) w naszym systemie powinny pokazać się 2 nowe interfejsy: carp0 i carp1. Musimy sprawdzić czy każdy z firewall’i jest we właściwym stanie, a więc fw-m jako MASTER:

root@fw-m:/>ifconfig carp0
carp0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
        lladdr 00:00:5e:00:01:64
        priority: 0
        carp: MASTER carpdev vr0 vhid 100 advbase 5 advskew 0
        groups: carp
        status: master
        inet x.x.x.1 netmask 0xffffffff broadcast x.x.x.31
root@fw-m:/>ifconfig carp1
carp1: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
        lladdr 00:00:5e:00:01:03
        priority: 0
        carp: MASTER carpdev vr1 vhid 101 advbase 5 advskew 0
        groups: carp
        status: master
        inet 192.168.1.1 netmask 0xffffff00 broadcast 192.168.1.255

i fw-s jako BACKUP:

root@fw-s:/>ifconfig carp0
carp0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
        lladdr 00:00:5e:00:01:64
        priority: 0
        carp: BACKUP carpdev vr0 vhid 100 advbase 5 advskew 10
        groups: carp
        status: backup
        inet x.x.x.1 netmask 0xffffffff broadcast x.x.x.31
root@fw-s:/>ifconfig carp1
carp1: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
        lladdr 00:00:5e:00:01:03
        priority: 0
        carp: BACKUP carpdev vr1 vhid 101 advbase 5 advskew 10
        groups: carp
        status: backup
        inet 192.168.1.1 netmask 0xffffff00 broadcast 192.168.1.255

Teraz czas na decydujący test. Musimy sprawdzić czy po wyłączeniu głównego firewall’a, zapasowy przejmnie jego funkcję. Najłatwiej jest wyłączyć fizyczny interfejs (lub wyciągnąć kabel):

root@fw-m:/>ifconfig vr0 down

Po 15 sekundach fw-s zmieni swój status na MASTER, co oznacza że wszystko działa jak należy.

/var/log/messages
fw-s /bsd: carp0: state transition: BACKUP -> MASTER

Używanie aliasów IP w interfejsie carp

Na szczęscie ta opcja jest możliwa przy użyciu carp, więc jeśli ktoś koniecznie potrzebuje aliasów, nie ma się czego obawiać. Konfiguracja jest dokładnia taka sama jak dla zwykłego interfejsu:

root@fw-s:~>cat /etc/hostname.carp0
inet x.x.x.1 255.255.255.224 x.x.x.31 vhid 100 advbase 5 advskew 10 carpdev vr0 pass jkfd882hfvkjvd2189axkc83hf4cad
inet alias x.x.x.2 255.255.255.224 NONE vhid 100 advbase 5 advskew 10 carpdev vr0 pass jkfd882hfvkjvd2189axkc83hf4cad
inet alias x.x.x.3 255.255.255.224 NONE vhid 100 advbase 5 advskew 10 carpdev vr0 pass jkfd882hfvkjvd2189axkc83hf4cad

I analogicznie na drugim firewall’u. Aliasy ustawiamy tylko na interfejsach carp!

  1. Monitoring interfejsów z ifstated | ITCore Tech - pingback on 2011/08/31 w 13:20
  2. Dotarłem tu po 7 latach od publikacji szukając sposobu na obsługę kilku WAN’ów w OpenBSD… Googlam i nic w sumie. W Linuksie nie ma z tym stresu, routing ustawiamy, snatem puszczamy ruch na zapasowe, a w OpenBSD jeszcze nie ogarniam gdzie, co i jak ;-) Może coś podpowiesz?

Odpowiedz Tom ¬
Anuluj odpowiedź


Podpowiedź - możesz użyć tych HTML tagów i atrybutów:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Obraz CAPTCHY

*

Trackback'i i Pingback'i: