• Policy routing w Linuksie

    dodany przez Konrad Stępień

    Prędzej czy później przy stawianiu serwera pojawi się problem więcej niż jednego interfejsu. Typowy przypadek to maszyna virtualna na xen-ie z kilkoma adresami i “route networking”. Albo serwer podłączony do 2 różnych operatorów (gdy nie mamy komfortu posiadania własnej puli adresów IP i musimy korzystać z IP-ków dostawcy). Na czym polega problem?

    Ano na tym że typowo jest jeden default gateway przypisany do jednego interfejsu i jednego IP. Wszystko jest w porządku jeśli łączymy się z adresem “podstawowym”, wtedy pakiet wyjdzie tym samym interfejsem który przyszedł. Ale jeśli połączymy się z drugim (czy kolejnym) adresem to pojawi się asymetria. Pakiety wejdą drugim interfejsem, ale wrócą przez default-gateway.

    Na szczęście Linux już od jądra 2.2 ma możliwość tzw. “policy routingu”. W skrócie polega to na tym, że można sobie stworzyć kilka tablic routingu a potem odpowiednimi regułkami kierować pakiety to tych różnych tablic. Standardowo w systemie istnieją 3 standardowe tablice: local, main i default. Wydając polecenia “route” albo “ip route” pracujemy na tablicy “main”.

    Powiedzmy że mamy serwer który jest podłączony do 2 różnych sieci 10.1.1.0/24 i 10.1.2.0/24. Adresy interfejsów serwera to:
    eth0 10.1.1.10
    eth1 10.1.2.10

    a adresy routerów to odpowiednio 10.1.1.1 i 10.1.2.1, przy czym ten pierwszy jest “główny”.
    Typowa tablica routingu (czyli tablica main) wygląda tak:

    10.1.1.0/24 dev eth0 scope link
    10.1.2.0/24 dev eth1 scope ling
    default via 10.1.1.1 dev eth0

    Naszym zadaniem będzie zrobić tak, żeby pakiety które przyjdą przez 10.1.2.1 na nasz adres 10.1.2.10 wróciły nie przez 10.1.1.1 tylko tak samo jak przyszły.

    Zaczniemy od stworzenia nowej tablicy routingu. Tablice mają swoje ID-y które są zdefiniowane w pliku “/etc/iproute2/rt_tables”. Powiedzmy że łącza 10.1.2.1 jest łączem zapasowym, więc stworzymy tablice o nazwie “backup” i nadamy jej ID-a 210. Do pliku rt_tables dopisujemy linijkę:
    210 backup

    Taraz trzeba ustawić routingi na tej tablicy. Robi się to narzędziem iproute tak samo jak normalnie, tylko z dodatkowym parametrem “table”.
    No to zaczynamy. Na początek ustawimy routingi lokalne, takie same jak w tablicy main.

    ip route add to 10.1.2.0/24 dev eth1 scope link table backup

    i na wszelki wypadek

    ip route add to 10.1.1.0/24 dev eth0 scope link table backup

    A teraz główna zabawa, czyli default gateway:

    ip route add default via 10.1.2.1 dev eth1 table backup

    Jak już mamy naszą alternatywną tablicę routingu to tylko trzeba ją aktywować. Robimy to przez ustawienie regułek komendą “ip rule”. W naszym wypadku wystarczy jedna

    ip rule add from 10.1.2.0/24 table backup prio 10000.

    Co w zasadzie zrobiliśmy? Kazaliśmy kernelowi wszystkie pakiety z adresem źródłowym 10.1.2.0/24 przepuszczać przez tablicę “backup” zamiast “main”. Parametr “prio” oznacza priorytet i jest użyteczny
    przy większej ilości regułek.

    Teraz każdy pakiet który przyjdzie z z routera 10.1.2.1 wyjdzie tą samą droga. A co z naszymy ruchem wychodzącym? Jeśli chcemy np. “pingnąć świat” przez drugie łącza wystarczy nam paramatr “-I 10.1.2.10”
    który wymusi adres źródłowy a resztą zrobi nasza regułka. Ale możemy też stworzyć inne regułki. Np. taka

    ip rule add to 8.8.8.8 table backup prio 5000

    spowoduje że wszystkie pakiety do DNS-ów Googla wyjdą łączem backupowym.

    Prawdziwa kopalnia wiedzy na temat zaawansowanego routingu w linuksie to stare (ale nadal świetne) HOWTO http://lartc.org/howto/

Dodaj komentarz

Warto odwiedzić
Valid XHTML 1.0 Transitional centos.com.pl- mapa strony