Narzędzia użytkownika

Narzędzia witryny


Pasek boczny

zsk:policy_routing

Policy routing

Jeśli urządzenie ma kilka alternatywnych tras w stronę tej samej sieci, można skonfigurować:

  • wysyłanie pakietów zawsze do tego samego adresu następnego skoku (domyślne zachowanie)
  • wybór dla każdego z pakietów jednej trasy, tak by wykorzystywać wszystkie adresy następnego skoku (multipath routing; takie rozwiązanie jest koncepcyjnie proste i łatwe do skonfigurowania, choć technicznie złożone.)
  • wysyłanie pakietów zgodnie z polityką ustanowioną przez administratora (policy routing)

Policy routing oznacza, że przygotowane przez administratora reguły decydują – na podstawie adresu źródłowego, interfejsu którym przyszedł pakiet, lub dowolnego filtra iptables – jak ma wyglądać tablica tras.

Dodatkowe materiały:

Topologia używa w przykładach

\                                                             .1
 \         .---. .1     172.16.1/24                       .---- PC1
I(- - - --( gw1 )--------                                /
N\         `---'         \                192.168.0/24  /   .2
T \                       \.2                          /   .-- PC2
E  )                       .------. .254      +-----+--'   /
R /                       ( router )----------| <-- |-----'   
N(                         `------'           | --> |----------- PC3
E )        .---. .1         /.2               +-----+-.   
T/- - - --( gw2 )-----------                           `---- PC4
/          `---'         172.16.2/24                   

Przygotowanie środowiska do zajęć

  • Uruchom VLAB
  • Wybierz maszynę Linux SK prog (lxc w OpenSUSE ma problemy)
  • Uruchom konsolę jako root
  • Wykonaj poniższy kod:
# instalacja LXC
aptitude update
aptitude install lxc
# rozpakowanie kontenerów
cd /var/lib/lxc/
tar xf SCIEZKA_DO_PLIKU/zsk_policy_routing.tar.xz
# konfiguracja serwerów DNS w kontenerach
find /var/lib/lxc/ -name resolv.conf -exec cp /etc/resolv.conf \{\} \;
# konfiguracja mostków używanych w kontenerach i start kontenerów
source ./topologia_lxc

Lista kontenerów: lxc-ls -f
Podłączenie do kontenera: lxc-attach -n <nazwa>

Narzędzia w kontenerach:

  • [wszystkie] sprawdzanie łączności IP / trasy: ping i traceroute
  • [gw1 i gw2] monitoring ruchu: iftop -i <ifname> / tcpdump / iptraf-ng
  • odświeżenie listy pakietów: apk update, instalacja pakietów: apk add …
    np. apk add openssh-client, apk add iproute2

Policy routing należy konfigurować na kontenerze nazwanym router.

Zadanie 1. Podłącz się do kontenera enduser2 i sprawdź trasę do fc.put.poznan.pl

Podstawy

Pokazanie tablicy tras vs pokazanie wszystkich tablic tras:

  • ip route show (lub: ip -4 -6 route show)
  • ip -4 route show table all (lub: ip route show table all)

Zadanie 2. Która tablica tras jest używana jeśli nie poda się table …?

Kolejność użycia tablic tras definiują reguły, do wypisania których użyj:

  • ip rule [list]

Aby wybrać trasę, system przegląda kolejno reguły (w rosnącej kolejności preferencji) i wykonuje to, co te nakazują. Przykłady:

0: from all lookup local przejrzyj tablicę tras o nazwie local (identyfikator 0)
200: from all lookup 5 przejrzyj tablicę tras o identyfikatorze 5
500: from all goto 700 przeskocz do reguły numer 700 (tzn. pomiń reguły 501÷699)
501: from 1.2.3.4/30 lookup default dla pakietów z sieci 1.2.3.4/30 przejrzyj tablicę default
502: from all to 5.6.7.8/30 lookup default dla pakietów idących do sieci 5.6.7.8/30 przejrzyj tablicę default
503: from all iif eth0 lookup default dla pakietów wchodzących interfejsem eth0 przejrzyj tablicę default
504: from all fwmark 0x50 lookup default dla pakietów oznaczonych jako 0x50 przejrzyj tablicę default
504: from all fwmark 0x30/0x70 lookup default dla pakietów których ((mark & 0x70) == 0x30) przejrzyj tablicę default

Jeśli we wskazanej przez lookup tabeli zostanie znaleziona trasa dalsze reguły nie są przeglądane.

Skrócona pomoc: ip rule help
Dokumentacja : man ip-rule

Zadanie 3. Wykonaj przykładowe polecenia i zaobserwuj działanie:

  • Dodaj do tabeli 10 trasę domyślną przez gw2:
    ip route add default via 172.16.2.1 table 10
    To polecenie automatycznie utworzy tabelę 10 (jeśli jej wcześniej nie było)
  • ip route show table 10 (lub: ip route show table all)
  • Dodaj regułę która nakaże użycie tabeli 10 dla pakietów z adresu 192.168.0.1
    ip rule add from 192.168.0.1/32 table 10
  • ip rule show
  • Porównaj trasy z PC1 do fc.put.poznan.pl i z PC2 do fc.put.poznan.pl
  • Wykonaj ping do 172.16.1.1 i 172.16.2.1 z PC1 i PC2 (wszystkie kombinacje)
  • Popraw tablice tras tak, by wszystkie pingi były możliwe

Powyższe ćwiczenie pokazuje jak stworzyć nową tabelę tras i dodać do niej wpis, oraz jak stworzyć prostą regułę która przegląda tą trasę. Tablice tras mają identyfikatory numeryczne. Dla ułatwienia można nadać im identyfikatory słowne zmieniając treść pliku /etc/iproute2/rt_tables.

Zadanie 4.

  • Przejrzyj plik /etc/iproute2/rt_tables na lokalnym komputerze.
    Pierwsza wartość to identyfikator tabeli, druga – nazwa.
  • Zmodyfikuj (lub stwórz w razie potrzeby) plik /etc/iproute2/rt_tables tak, by nazywał przynajmniej dwie tabele
  • Dodaj przykładową trasę i regułę z użyciem nazwy

Możliwe reguły wyboru tablicy tras są podsumowane powyżej. Najważniejsze opcje przy ustawiani reguł to:

  • wybór preferencji dla reguł (ustala porządek w którym reguły są przetwarzane):
    ip rule add … pref <preferencja> lookup|goto …
    ip rule add iif eth0 pref 500 lookup 20
    Bez podania preferencji reguła dodawana jest przed wszystkie (poza local).
  • wybór tablic dla pakietów przychodzących z interfeju:
    ip rule add iif <ifname>
  • wybór tablic dla pakietów przychodzących z konkretnej sieci IP:
    ip rule add from <sieć>/<maska>
    ip rule add from 10.1.0.0/16 lookup 30
  • wybór tablic dla pakietów z ustawionym znacznikiem:
    ip rule add fwmark <wartość>/<maska>
    ip rule add fwmark 0xbe lookup 40

Ostatnia opcja (fwmark) pozwala na połączenie wyboru tras z mechanizmem filtracji netfilter (iptables).

Zadanie 5.

  • Stwórz osobną tablicę tras dla tego, co przychodzi po interfejsie eth0.
  • W tablicy dodaj trasę ze specjalnym celem throw lub unreachable dla wybranej podsieci
    (komenda: ip r a table id unreachable siec/maska)
  • Sprawdź czy powyższa reguła działa; sprawdź czy dalsze tablice tras są przeglądane jeśli żadna reguła z nowo stworzonej tablicy się nie dopasuje

fwmark

Reguły iptables potrafią ustawić znacznik pakietom. Jest to uniwersalny sposób na oznaczanie wybranych pakietów tak, by inne komponenty systemu mogły osobno traktować wybrany ruch.
Znacznik to liczba 32-bitowa, zwykle zapisywana szesnastkowo (tzn. od 0x0 do 0xFFFFFFFF).

Droga pakietu przez mechanizmy filtrujące w systemie Linux podsumowana jest tutaj: [PL] [EN]

Aby ustawić znacznik przed podjęciem decyzji o trasowaniu, trzeba go dodać do łańcucha PREROUTING tabeli mangle:

  • iptables -t mangle -A PREROUTING … -j MARK --set-mark <mark>
  • iptables -t mangle -A PREROUTING -p udp --dport 53 -j MARK --set-mark 0x10
  • iptables -t mangle -A PREROUTING -s 192.168.0.1 -j MARK --set-mark 0x1/0x1

Zadanie 6. Wyzeruj konfigurację. Następnie skonfiguruj router tak, by domyślnie ruch szedł przez gw1, natomiast zapytania DNS przez gw2. Na gw2 wyświetlaj treść zapytań:

  • iptables -t mangle -A PREROUTING -p udp --dport 53 -j MARK --set-mark 0xbabe
  • ip rule add fwmark 0xbabe lookup 90
  • ip route add default table 90 via 172.16.2.1
  • [gw2] tcpdump -i eth1 "udp dst port 53" | cut -d" " -f 7-8

Znacznik MARK można skopiować do informacji o połączeniu używając do tego celu -j CONNMARK z opcjami --save-mark, a następnie nadać nowym pakietom z tego samego połączenia używając --restore-mark.

Zadania

Zadanie 7. Ustaw policy routing tak, by ruch dopuszczony przez domyślną politykę ruchu PP [1] [2] był wysyłany do gw1. Pozostały ruch pokieruj przez gw2.

Zadanie 8. Ustaw politykę, by połączenia SSH, zapytania DNS i komunikaty NTP szły przez gw2. Resztę puść przez gw1.
Następnie dodaj trasę, która w razie awarii łącza do gw1 pokieruje cały ruch przez gw2.

Zadanie 9. Korzystając z modułu limit lub hashlimit ustaw, by w każdej minucie pierwsze 32KB wysłane z eth0 szło przez gw1, nadwyżka przez gw2.

Multipath route

Osobnym tematem jest równoważenie obciążenia przez wybór jednej z dostępnych tras do tej samej sieci.
Przykładowa komenda równoważąca obciążenie prez podanie kilku tras do tego samego celu poniżej:
ip route add default nexthop via 172.16.1.1 weight 1 nexthop via 172.16.2.1 weight 1

zsk/policy_routing.txt · ostatnio zmienione: 2017/11/05 14:00 przez jkonczak