NFsec Logo

Tanie przejęcie IP

11/08/2009 w Hacks & Scripts Brak komentarzy.  (artykuł nr 123, ilość słów: 883)

P

rzedstawiony hack jest tłumaczeniem “Cheap IP Takeover” z książki “Linux Servers Hacks” autorstwa Rob’a Flickenger’a udostępnionym on-line (Hack #63) na stronie http://hacks.oreilly.com. Do tłumaczenia zostało dodane także parę informacji od tłumacza.

   Kierowanie ruchu do jednego z kilku komputerów jest dosyć proste – przy krągłym układzie DNS, omówionym w rozdziale “Rozkładanie obciążenia serwera DNS” (poprzedni artykuł na stronie). A, co jeśli jeden z tych serwerów przestanie być dostępny? Oto pewien schemat monitorowania stanu jednego serwera i zastępowania go w razie awarii drugą maszyną.

Najpierw musimy odróżniać “prawdziwy” adres IP od adresu (adresów) IP, z których serwer faktycznie oferuje informacje. W tym przykładzie mamy dwa serwery, które nazwiemy: Pinky i Brain. Pinky jako “rzeczywisty” adres IP na interfejsie eth0 ma 208.201.239.12. Ma też on alias adresu IP 208.201.239.36 na interfejsie eth0:0. Brain na interfejsie eth0 używa adresu 208.201.239.13, zaś adresu 208.201.239.37 na interfejsie eth0:0. Oto krótki kurs przyznawania aliasów IP dla osób, które jeszcze z nich nie korzystały:

# ifconfig eth0:0 1.2.3.4

Viola. Mamy drugi adres IP 1.2.3.4 związany z interfejsem eth0, noszący nazwę eth0:0. Wcześniej obsługę aliasów IP trzeba było wkompilować w jądro (w wersjach 2.0.x oraz 2.2.x), ale opcja ta znikła w nowszych jądrach (od 2.4.x) i jest domyślnie włączona. Należy pamiętać o jednej istotnej sprawie w związku z aliasami IP. Jeśli interfejs, z którymi są związane (w tym przypadku eth0) zostanie wyłączony, wówczas likwidowane są także wszystkie przyporządkowane aliasy. Dowolny ciąg alfanumeryczny może być aliasem, choć niektóre wersje programu ifconfig podają pierwsze cztery lub pięć znaków aliasów podczas wyświetlania interfejsów.

Kiedy komputery Pinky i Brain mają ustawione interfejsy eth0:0, należy związać daną usługę (dla serwisów WWW będzie to np. Apache) z ich aliasami IP, a następnie skonfigurować krągły układ DNS tak, aby oba miały jedną nazwę komputera. Załóżmy, że konfigurujemy nadmiarową usługę WWW dla witryny www.oreilly.com, rozpoznanej jako adres: 208.201.239.36 lub 208.201.239.37.

Skoro teraz mniej więcej połowa ruchu trafia na każdy z serwerów, Pinky oraz Brain muszą monitorować wzajemnie swój stan w sieci. Mogą w tym celu wysyłać sygnały za pomocą ping na prawdziwe adresy IP i obserwować ich rezultaty. Następujący kod należy zapisać w skrypcie i zainstalować na komputerach Pinky i Brain:

#!/bin/bash
OTHER="brain"
PUBLIC="208.201.239.37"

PAUSE=3

PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/sbin
MISSED=0

while true; do 
if ! ping -c 1 -w 1 $OTHER > /dev/null; then 
((MISSED++))
else
if [ $MISSED -gt 2 ]; then
ifconfig eth0:$OTHER down
fi
MISSED=0
fi; 

if [ $MISSED -eq 2 ]; then
ifconfig eth0:$OTHER $PUBLIC
#
# ...zobacz komentarz poniżej...
#
fi
sleep $PAUSE; 
done

Naturalnie, zmiennej OTHER należy nadać wartość “pinky” oraz PUBLIC ustawić na “208.201.239.36”, w skrypcie, który zostanie uruchomiony na komputerze Brain.

Zakładając, że Brain nagle przestaje odpowiadać pod IP 208.201.239.17 (powiedzmy, że przez przypadek technik sieciowy wyjął nie tę wtyczkę, kiedy poprawiał konfigurację sieci). Po braku jakiejkolwiek odpowiedzi na 3 pingi z rzędu, Pinky wkracza do akcji, podnosząc interfejs eth0:brain z adresem 208.201.239.37 do życia, czyli publicznym adresem serwera Brain. Pinky nadal będzie obserwował rzeczywisty adres IP Braina, oddając mu kontrolę kiedy tylko wróci on online. Polecenie: ping -c 1 -w 1 – oznacza “wyślij jeden pakiet ping, z czasem przerwy równym jednej sekundzie, bez względu na to, co się stanie.” Wtedy program ping zwróci wartość niezerową, jeśli pakiet nie wróci w ciągu jednej sekundy.

Lecz to nie jest całe rozwiązanie. Choć aktualnie komputer Pinky odpowiada na żądania za Braina, to wszystkie komputery będące w tej samej sieci, co te dwa serwery (pierwszy router odbierający dane u ISP) będą posiadać błędy adres MAC przechowywany w buforze dla adresu 208.201.239.37. Ze złym adresem MAC scache’owanym w buforze, żaden ruch nie trafi do komputera Pinky, ponieważ będzie on odpowiadać tylko na pakiety noszące jego własny adres MAC. Jak mamy powiedzieć wszystkim maszyną w sieci 208.201.239.0, że adres MAC dla adresu 208.201.239.37 został uaktualniony?

Jednym z rozwiązań jest użycie narzędzia send_arp pochodzącego z projektu High Availability Linux. To bardzo poręczne (oraz małe) narzędzie potrafi wygenerować pakiet ARP według naszych specyfikacji oraz wysłać go pod wybrany adres MAC w sieci lokalnej. Jeśli podamy wszystkie maszyny (np. ff:ff:ff:ff:ff:ff) jako adres docelowy, stanie się on wówczas pakietem rozgłoszeniowym ARP. Podczas, gdy większość routerów nie uaktualni tablicy ARP, kiedy otrzymają nie proszony pakiet rozgłoszeniowy ARP, taki pakiet będzie dla nich sygnałem, aby wysłać żądanie ARP, na które komputer Pinky oczywiście odpowie. Zaletą użycia rozgłoszenia jest to, że poinformuje ono wszystkie komputery w podsieci jednocześnie, zamiast śledzenia wszystkich adresów MAC, które należy uaktualnić.

Składnia narzędzia send_arp jest następująca:

send_arp [źródłowy IP] [źródłowy MAC] [docelowy IP] [docelowy MAC]

Na przykład, nasz prosty skrypt monitorujący powyżej powinien wywołać następujące polecenie, gdy wykryje, że komputer Brain nie działa:

send_arp 208.201.239.37 00:11:22:aa:bb:cc 208.201.239.37 fffffffffff

(Gdzie 00:11:22:aa:bb:cc jest adresem sprzętowym MAC karty eth0 Pinkiego.) Skrypt może nadal obserwować, kiedy rzeczywisty adres IP Braina (208.201.239.17) będzie dostępny. Kiedy to się stanie, możemy wyłączyć interfejs eth0:brain, i pozwolić się martwić o uaktualnienie tablic ARP komputerowi Brain (który powinien to zrobić podczas startu swojego systemu).

Technikę tę można jeszcze pod wieloma względami ulepszyć. Choćby jedna rzecz: tylko dlatego, że 208.201.239.17 jest aktywny nie gwarantuje, że 208.201.239.37 jest także dostępny. Także, sygnał ping nie jest najlepszym testem dla dostępności usług (lepszym testem byłoby faktyczne żądanie strony WWW z innego komputera i sprawdzenie, czy zawiera ona zamykający znacznik </html>).

Te usprawnienia pozostawiamy jako ćwiczenia tobie, drogi czytelniku. Każda strona internetowa jest inna, więc trzeba opracować technikę najlepiej zgraną z narzędziami, które posiadasz. Przecież w końcu na tym polega “hack” nieprawdaż?

Więcej informacji: Projekt Heartbeat, Aliasy IP, man ifconfig, Hacks O’Reilly

Kategorie K a t e g o r i e : Hacks & Scripts

Tagi T a g i : , , , , ,

Komentowanie tego wpisu jest zablokowane.