====== Trasowanie – wstęp, routing statyczny w Linuksie ====== ===== Routing ===== Trasowanie (routing) – wyznaczenie dalszej drogi, którą zostanie wysłany pakiet. Jest wykonywane na warstwie sieci. Na każdym urządzeniu wyznaczany jest **adres IP następnego skoku** i interface którym pakiet zostanie wysłany (nigdy cała trasa). Urządzenia podejmują decyzję na podstawie **tablicy tras** (routing table, http://en.wikipedia.org/wiki/Routing_table). Tablica routingu - lista znanych sieci i tras do nich.\\ Wpisy w tablicy definiują przynajmniej: * cel - sieć docelową (np. 1.2.0.0/16, 192.168.2.0/24) * trasę - adres następnego skoku (np. 3.4.5.6, 192.168.1.1) lub/i port wyjściowy (slo1, tun2) * typowo podaje się tylko adres następnego skoku (czyli adres z bezpośrednio połączonej sieci) * dla sieci bezpośrednio podłączonych podaje się tylko urządzenie * metrykę - koszt wysłania daną trasą pakietu, używany do porównywania tras, (np. 0, 1, 10, 679842) * w routerach CISCO (na których będą kolejne zajęcia) dodatkowo parametr //administrative distance// (AD), który jest używany do rozstrzygania wyboru trasy jeśli więcej protokołów routingu poda trasę do tej samej sieci ==== Wybór trasy ==== Schemat wyboru trasy: * z tras do sieci w których znajduje się docelowy adres wybiera się trasy do sieci o najdłuższej masce, np.:172.21.0.0/16 via 172.16.0.16 dev eth2 172.21.0.0/24 via 172.16.0.24 dev eth2 172.21.0.0/28 via 172.16.0.28 dev eth2 pakiet kierowany do 172.21.0.15 zostanie wysłany przez 172.16.0.28, a \\ pakiet kierowany do 172.21.0.55 zostanie wysłany przez 172.16.0.24 * jeśli wybór nie jest jednoznaczny - trasa o najmniejszym koszcie, np.:150.254.44.0/23 dev wlan0 proto kernel scope link src 150.254.45.39 metric 2003 150.254.44.0/23 dev wlan1 proto kernel scope link src 150.254.44.149 metric 1002tu zawsze wybrana jest trasa przez 150.254.44.149, jako ta o niższym koszcie * jeśli wybór nie jest jednoznaczny - pierwsza w tablicy.default via 150.254.44.1 dev wlan0 default via 150.254.130.42 dev eth0 Zwykle definiuje się w tablicy tras **trasę domyślną**. \\ Czasam jest ona traktowana "specjalnie" – pokazywana w osobnym miejscu lub opisana jako //default// (zamiast adresu sieci). \\ Jeśli nie – do zdefiniowania trasy domyślnej używa się adresu 0.0.0.0/0 ==== Tworzenie tablicy tras ==== Sposoby uzyskiwania informacji o trasach: * ręczna konfiguracja * użycie protokołów routingu Protokoły trasowania można podzielić ze względu na obszar działania (w odniesieniu do obszarów autonomicznych (AS) [[https://en.wikipedia.org/wiki/Autonomous_system_(Internet)|[1]]]): * wewnętrzne (IGP - Interior Gateway Protocol), np. RIP, EIGRP, OSPF, IS-IS * zewnętrzne (EGP - Exterior Gateway Protocol) - obecnie (jedynym) używanym jest BGP albo ze względu na sposób działania: * wektora odległości (distance vector), np. RIP, IGRP – wymieniają się z sąsiadami informacjami o osiągalnych sieciach; wyznaczają tylko koszty dotarcia do sieci * stanu łącza (link state), np. OSPF, IS-IS – wymieniają się z sąsiadami informacjami o topologii sieci; budują pełną mapę sieci * wektora ścieżki (path-vector), np. BGP – wymieniają się z sąsiadami pełnymi ścieżkami do każdej sieci; zbierają listę dostępnych ścieżek; algorytm używany tam gdzie sieć jest za duża by działał algorytm stanu łącza; algorytm podobny do wektora odległości, ale dużo lepiej radzi sobie ze zmianami topologii http://en.wikipedia.org/wiki/Routing ===== Wyświetlanie tablic routingu w systemie Linux ===== Narzędzia ''route'' (net-tools) i ''ip route'' (iproute2) Wypisanie trasy: * ''route'' * ''ip route [list/show]''\\ Sprawdzenie adresu następnego skoku do podanego adresu docelowego: * ''ip route get '' ++++ Przykłady poleceń |
/ # ip route
default via 10.0.1.2 dev br0 proto dhcp src 10.0.1.3 metric 3 
10.0.0.0/24 via 10.0.1.1 dev br0 proto dhcp src 10.0.1.3 metric 3 
10.0.1.0/24 dev br0 proto dhcp scope link src 10.0.1.3 metric 3 
10.0.2.0/24 via 10.0.1.254 dev br0 
10.0.3.0/24 via 10.0.1.254 dev br0 metric 200 mtu 1480 
blackhole 10.0.4.0/24 

/ # route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.0.1.2        0.0.0.0         UG    3      0        0 br0
10.0.0.0        10.0.1.1        255.255.255.0   UG    3      0        0 br0
10.0.1.0        0.0.0.0         255.255.255.0   U     3      0        0 br0
10.0.2.0        10.0.1.254      255.255.255.0   UG    0      0        0 br0
10.0.3.0        10.0.1.254      255.255.255.0   UG    200    0        0 br0
10.0.4.0        0.0.0.0         255.255.255.0   U     0      0        0 *

/ # ip route get 10.0.1.2
10.0.1.2 dev br0 src 10.0.1.3 uid 1000 
    cache 

/ # ip route get 10.0.0.1
10.0.0.1 via 10.0.1.1 dev br0 src 10.0.1.3 uid 1000 
    cache 

/ # ip route get 150.254.32.129
150.254.32.129 via 10.0.1.2 dev br0 src 10.0.1.3 uid 1000 
    cache

/ # ip route get 10.0.3.3    
10.0.3.3 via 10.0.1.254 dev br0 src 10.0.1.3 uid 1000 
    cache mtu 1480
++++ ===== Polityka systemu względem ruchu przechodzącego ===== Domyślnie Linux **nie** pozwala na przekazywanie (forward) pakietów. \\ Aby zmienić to zachowanie, należy zmienić parametry jądra wykonując jedno z: * ''sysctl net.ipv4.conf.all.forwarding=1'' \\ lista dostępnych zmiennych: ''sysctl -a -r 'ip.*\.forwarding' '' \\ więcej informacji: ''man 8 sysctl'' oraz ''man 7 ip'' * albo starsze: \\ ''sysctl net.ipv4.ip_forward=1'' Można też skorzystać z katalogu /proc: * ''echo 1 > /proc/sys/net/ipv4/conf/all/forwarding'' * ''echo 1 > /proc/sys/net/ipv4/ip_forward'' Ponadto na większości produkcyjnych systemów firewall domyślnie zabrania na przepuszczanie ruchu ===== Narzędzia związane z trasowaniem w systemie Linux ===== iproute: | Dodanie trasy | ''ip route add / [via ] [dev ]'' | | Dodanie trasy przez następny skok | ''ip route add / via '' \\ np.: ''ip r add 192.168.5.0/24 via 192.168.0.254'' | | Dodanie trasy przez urządzenie | ''ip route add / dev '' \\ np.: ''ip r add 192.168.6.0/24 dev tun0'' | | Dodanie trasy domyślnej | ''ip route add default via [dev ]'' \\ np.: ''ip r add default via 192.168.0.1'' | | Usunięcie trasy | ''ip route del '' \\ np.: ''ip r del 192.168.5.0/24 via 192.168.0.254'' | | Usunięcie całej tablicy routinug | ''ip route flush'' \\ Uwaga! Usuwa też trasy do bezpośrednio połączonych sieci. | route: | Dodanie trasy | ''route add [-net|-host] [netmask ] [gw ] [dev ]'' , np. \\ ''route add -net 192.168.5.0 [netmask 255.255.255.0] gw 192.168.0.254'' | | Usunięcie trasy | ''route del [-net|-host] [netmask ] [gw ] [dev ]'' , np. \\ ''route del -net 192.168.5.0 [netmask 255.255.255.0] gw 192.168.0.254'' | | Dodanie trasy domyślnej | ''route add default [gw ] [dev ]'', np: \\ ''route add default gw 192.168.0.1'' \\ Uwaga! Starsze wersje nie znają słowa kluczowego default, trzeba ustawiać trasę do 0.0.0.0/0 | Trasa może definiować jednocześnie adres następnego skoku i urządzenie. \\ Podanie samego urządzenia starczy **tylko** w specjalnych przypadkach, takich jak np. sieć bezpośrednio połączona. Przy definiowaniu trasy można podać też inne opcje mające wpływ na wybór trasy (''metric, src'') jak i też na sposób wysyłania nią pakietów (np. ''mtu'', opcje TCP). Pomoc: ''man route'' / '' man ip-route'' Narzędzia do sprawdzania trasy pakietu: * ''tracepath'' * ''traceroute'' (w sali lab. potrzeba przełącznika ''-T'' lub ''-I'' do ominięcia firewalla) * ''mtr'' Pętle routingu (przypomnienie). Specjalne trasy odrzucające pakiety - ''throw unreachable prohibit blackhole'', np:\\ ''ip r a blackhole 10.0.0.0/8'' \\ ''ip r a unreachable 10.0.0.0/8'' \\ **[[http://www.cs.put.poznan.pl/mlibuda/routing_stat_Linux.pdf|Slajdy]]** ===== [Ekstra] Wybrane mechanizmy odrzucające nielogiczne pakiety w Linuksie ===== Linux, widząc pakiet wysłany z adresu A i wchodzący na interfejs If sprawdza, czy zna trasę do nadawcy A (2) i czy trasa do A jest przez interfejs If (1). Jeśli nie jest spełnione (2) lub (1), to pakiet jest odrzucany o ile zmienna jądra ''rp_filter'' ma wartość odpowiednio 2 lub 1. \\ Aby wyłączyć to zachowanie, należy: sysctl net.ipv4.conf.all.rp_filter=0 sysctl net.ipv4.conf.p4p1.rp_filter=0 sysctl net.ipv4.conf.p4p2.rp_filter=0 Linux, widząc pakiet od adresu A wchodzący na interfejs I sprawdza, czy nie ma ustawionego adresu A na którymś ze swoich interfejsów (czyli: czy ktoś się pod niego nie podszywa). Jeśli tak jest, pakiet jest odrzucany o ile zmienna ''accept_local'' nie jest włączona.\\ Aby wyłączyć to zachowanie, należy: sysctl net.ipv4.conf.p4p1.accept_local=1 sysctl net.ipv4.conf.p4p2.accept_local=1 Dokładny opis: https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt ===== [Ekstra] Komendy dla Windowsa ===== * Obsługa tablicy routingu – polecenie ''route'' * Wyświetlenie tablicy tras ''route print'' * Dodanie trasy: ''route add mask '' (np. ''route add 192.168.1.0 mask 255.255.255.0 10.0.0.1'') * Usunięcie trasy ''route delete '' (uwaga! jeśli jest wiele tras do tego samego adresu sieci z różnymi maskami – wszystkie będą usunięte!) * Sprawdzenie trasy ''tracert'' * Włączenie ruchu przechodzącego: * Wpisanie wartości ''1'' typu DWORD do ''HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\IPEnableRouter'' * Podobne działanie daje udostępnienie połączenia internetowego (ppm na połączeniu sieciowym / "Właściwości" / karta "Udostępnianie" / "Zezwalaj innym użytkownikom sieci na łączenie się poprzez połączenie internetowe tego komputera")