Spis treści

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:

Wybór trasy

Schemat wyboru trasy:

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:

Protokoły trasowania można podzielić ze względu na obszar działania (w odniesieniu do obszarów autonomicznych (AS) [1]):

albo ze względu na sposób działania:

http://en.wikipedia.org/wiki/Routing

Wyświetlanie tablic routingu w systemie Linux

Narzędzia route (net-tools) i ip route (iproute2)

Wypisanie trasy:

Sprawdzenie adresu następnego skoku do podanego adresu docelowego:

Przykłady poleceń

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:

Można też skorzystać z katalogu /proc:

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 <addr>/<mask> [via <addr>] [dev <ifname>]
Dodanie trasy przez następny skok ip route add <addr>/<mask> via <addr>
np.: ip r add 192.168.5.0/24 via 192.168.0.254
Dodanie trasy przez urządzenie ip route add <addr>/<mask> dev <ifname>
np.: ip r add 192.168.6.0/24 dev tun0
Dodanie trasy domyślnej ip route add default via <następny skok> [dev <urządzenie>]
np.: ip r add default via 192.168.0.1
Usunięcie trasy ip route del <specyfkacja trasy>
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] <cel> [netmask <maska>] [gw <brama>] [dev <ifname>] , 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] <cel> [netmask <maska>] [gw <brama>] [dev <ifname>] , 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 <brama>] [dev <ifname>], 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:

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

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