====== 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 ([[https://en.wikipedia.org/wiki/Multipath_routing|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: * https://en.wikipedia.org/wiki/Policy-based_routing * Rozdział 4 z http://lartc.org/howto/index.html * http://www.policyrouting.org/PolicyRoutingBook/ONLINE/TOC.html * https://www.cs.put.poznan.pl/ddwornikowski/sieci/pizsk/policy.html ==== 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) * Pobierz {{:zsk:zsk_policy_routing.tar.xz|}} * 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 '' Narzędzia w kontenerach: * [wszystkie] sprawdzanie łączności IP / trasy: ''ping'' i ''traceroute'' * [gw1 i gw2] monitoring ruchu: ''iftop -i '' / ''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 //// 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 //// … '' * wybór tablic dla pakietów przychodzących z konkretnej sieci IP:\\ ''ip rule add from ///// … '' \\ ''ip rule add from 10.1.0.0/16 lookup 30'' * wybór tablic dla pakietów z ustawionym znacznikiem: \\ ''ip rule add fwmark ///// … '' \\ ''ip rule add fwmark 0xbe lookup 40'' Ostatnia opcja (''fwmark'') pozwala na połączenie wyboru tras z mechanizmem filtracji [[sk1:nf|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: ** [[https://pl.wikipedia.org/wiki/Plik:Netfilter-packet-flow-pl.svg|[PL]]] ** ** [[https://commons.wikimedia.org/wiki/File:Netfilter-packet-flow.svg|[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 '' * ''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 [[https://student.put.poznan.pl/files/Dost%C4%99p-bezprzewodowy-USK-PP_2016101902.pdf|[1] ]] [[https://student.put.poznan.pl/artykul/200804201|[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'' \\