Blog (22)
Komentarze (997)
Recenzje (0)
@parranoyaProste równoważenie obciążenia za pomocą pf (OpenBSD) i iptables (Linux)

Proste równoważenie obciążenia za pomocą pf (OpenBSD) i iptables (Linux)

11.02.2013 23:23, aktualizacja: 04.04.2013 20:49

Załóżmy, że mamy w sieci lokalnej usługę rozłożoną na powiedzmy dwa serwery. Dobrym przykładem może być usługa DNS. W prawidłowo zaprojektowanej sieci, powinny znaleźć się co najmniej dwa serwery DNS: podstawowy i zapasowy. Często jest tak, że z pewnych względów, użytkownicy w sieci lokalnej muszą korzystać tylko z wyznaczonych im serwerów DNS. W związku z tym w filtrze pakietów routera tworzymy regułę przekierowującą do odpowiednich serwerów DNS. W Linuksie wygląda to tak:

iptables -t nat -A PREROUTING -i vr1 -p udp -s 192.168.1.0/24 --dport 53 -j DNAT --to-destination 208.67.222.222

a w OpenBSD tak:

match in on vr1 proto udp from 192.168.1.0/24 to any port 53 rdr-to 208.67.222.222 port 53

Skoro mamy dwa serwery, to dlaczego używany ma być tylko jeden z nich? W przypadku OpenBSD reguła przekierowująca naprzemiennie do serwerów z danej puli jest banalnie prosta. Najpierw tworzymy tabelę:

table <opendns> persist {208.67.222.222 208.67.220.220}

A następnie regułę właściwą:

match in on vr1 proto udp from 192.168.1.0/24 to any port 53 rdr-to <opendns> port 53

Natomiast w Linuksie trzeba skorzystać z rozszerzenia iptables, które nazywa się "nth". Jego składnia (jak i całego iptables) nie jest tak oczywista ale spróbuję ją przybliżyć. Reguły iptables wykorzystujące "nth" wyglądają tak:

iptables -t nat -A PREROUTING -s 192.168.1.0/24 -i vr1 -p udp --dport 53 -m statistic --mode nth --every 2 --packet 0 -j DNAT --to-destination 208.67.222.222:53
iptables -t nat -A PREROUTING -s 192.168.1.0/24 -i vr1 -p udp --dport 53 -m statistic --mode nth --every 2 --packet 1 -j DNAT --to-destination 208.67.220.220:53

Aby wszystko było jasne, należy się krótkie wyjaśnienie. Liczone są tylko pierwsze pakiety inicjujące dane połączenie. Tak więc pierwszy pakiet jest przekierowywany pod dany adres a za nim "idzie" reszta z połączenia. Kolejne zapytanie DNS, które uznane zostanie za nowe połączenie, będzie skierowane pod kolejny adres. Zależnie ile mamy adresów w puli, tyle kolejnych regułek należy zastosować co niestety nieco komplikuje listę reguł iptables. Wziąć pod uwagę musimy jeszcze to, że liczenie zaczyna się od zera.

Takie prymitywne równoważenie na pewno nie znajdzie zastosowania w przypadku serwerów WWW gdzie trzeba zastosować coś bardziej konfigurowalnego i przede wszystkim wykrywającego ewentualne wyłączenie któregoś serwera z puli adresów. Wówczas Haproxy z pewnością będzie bardziej odpowiednie ale do zapytań DNS opisana przeze mnie metoda, moim zdaniem jest wprost idealna.

Wybrane dla Ciebie
Komentarze (2)