L3 - IPv4 a IPv6

Routing

Routing vychází ze schopnosti snadno určit, do kterého subnetu z možných kandidátů patří konkrétní adresa. Protokoly IP (v4 i v6) totiž používají směrovací tabulku, která je vytvořena ruční nebo automatickou konfigurací na každém počítači / zařízení, které podporuje protokol IP. Pro IPv4 může tabulka vypadat například takto:

target next-hop destination device
0.0.0.0/0 192.168.0.1 enp0s3
10.0.3.0/24 lxcbr0
192.168.0.0/24 enp0s3
192.168.0.1/32 enp0s3

Ve skutečnosti jsme tu jen přepsali do přehlednější tabulky skutečnou směrovací tabulku z našeho experimentálního prostředí:

root@osboxes:/home/osboxes# ip route
default via 192.168.0.1 dev enp0s3 proto dhcp src 192.168.0.100 metric 100 
10.0.3.0/24 dev lxcbr0 proto kernel scope link src 10.0.3.1 
192.168.0.0/24 dev enp0s3 proto kernel scope link src 192.168.0.100 
192.168.0.1 dev enp0s3 proto dhcp scope link src 192.168.0.100 metric 100

První sloupec vyznačuje target, tedy subnet do kterého díky tomuto řádku známe cestu. Následuje buď via NEXT-HOP nebo jen dev DEVICE. To jsou dva základní druhy záznamů - pokud má záznam via NEXT-HOP, znamená to, že to je záznam co vede na další router - ten je určen adresou NEXT-HOP a eventuálně síťovým rozhraním DEVICE, která usnadňuje výběr.

Naproti tomu záznam bez via NEXT-HOP jen s dev DEVICE je takzvaná connected route a říká, že daný subnet je dostupný lokálně po L2, protože síťové rozhraní DEVICE má přímý přístup do L2 segmentu, kde je lokálně aspoň jedna adresa z daného subnetu nastavena. Ostatní adresy z tohoto subnetu jsou pak dostupné tímto interfacem přes L2. To znamená, že v závislosti na tom, jaká technologie je dané síťové rozhraní, lze přes ní komunikovat s ostatními IP adresami v daném subnetu. V případě Ethernetu je na to potřeba protokol na překlad IP adres na MAC adresy: ARP pro IPv4 a NDP pro IPv6.

Dejme tomu, že tedy chceme doručit IP datagram:

IP verze (další pole) Cílová IP adresa Zdrojová IP adresa Payload (data)
4 * 192.168.0.242 192.168.0.100 TCP/UDP/...

Směrovací rozhodnutí se řídí pouze cílovou adresou. Je tedy třeba zjistit, který záznam ve směrovací tabulce se má pro směrování datagramu s cílovou adresou 192.168.0.242 použít. Na to IP používá Longest Prefix Match (LPM). Pro každý záznam ve směrovací tabulce se vypočte bitový AND cílové adresy a síťové masky (nyní se díváme na adresu i na síťovou masku jako na řetězec bitů odpovídající délky):

  • 0.0.0.0/0: 192.168.0.242 AND 0.0.0.0 = 0.0.0.0, záznam tedy odpovídá výsledku a délka matche je 0
  • 10.0.3.0/24: 192.168.0.242 AND 255.255.255.0 = 192.168.0.0, záznam tedy neodpovídá
  • 192.168.0.0/24: 192.168.0.242 AND 255.255.255.0 = 192.168.0.0, záznam odpovídá výsledku a délka matche je 24
  • 192.168.0.1/32: 192.168.0.242 AND 255.255.255.255 = 192.168.0.242, záznam neodpovídá

Ze směrovací tabulky tedy odpovídají dva záznamy - první a třetí. Delší masku (24>0) má třetí záznam a proto se dle LPM použije k odeslání rámce třetí záznam. To je connected route, která říká, že celý subnet 192.168.0.0/24 je dostupný přes L2 přes rozhraní enp0s3. Tuhle úvahu si můžeme ověřit na našem pokusném scénáři:

root@osboxes:/home/osboxes# ip route get 192.168.0.242
192.168.0.242 dev enp0s3 src 192.168.0.100 uid 0     cache

IP datagram je tedy předán nižší vrstvě, která však potřebuje znát MAC adresu interfacu, na kterém je nastavena cílová adresa 192.168.0.242. Protokol ARP si udržuje cache známých dvojic IP - MAC. Pokud v cache nenajde záznam pro 192.168.0.242, pošle ethernetovým broadcastem ARP výzvu, aby se stanice s adresou 192.168.0.242 ohlásila. Jakmile dostane odpověď, může si vyplnit příslušný záznam do ARP cache a doplnění MAC headeru a odeslání původního IP datagramu přes Ethernet už nic nebrání. Takhle vypadá v mém případě ARP cache:

root@osboxes:/home/osboxes# ip neighbor
...
192.168.0.242 dev enp0s3 lladdr 28:f1:0e:4d:92:d5 REACHABLE

V případě, že bychom chtěli poslat datagram například na adresu 8.8.8.8, tak bude průběh obdobný - jediný záznam v route tabulce, který bude tentokrát matchovat, bude pouze první záznam (default route). Ten má jako cíl next-hop 192.168.0.1. ARPem se tedy nebude vyhledávat cílová adresa v IP datagramu, nýbrž adresa next-hopu 192.168.0.1.

root@osboxes:/home/osboxes# ip route get 8.8.8.8
8.8.8.8 via 192.168.0.1 dev enp0s3 src 192.168.0.100 uid 0     cache