====== Warstwa sieci ====== Warstwa **łącza danych** zapewnia komunikację między **bezpośrednio połączonymi** urządzeniami. Warstwa **sieci** zapewnia komunikację między **dowolnymi** urządzeniami. Wiadomości na warstwie sieci nazywa się **pakietami**. \\ Urządzenia warstwy sieci to trasowniki (routery). ===== Protokół IPv4 i IPv6 ===== IPv4 = Internet Protocol version 4 ([[https://tools.ietf.org/html/rfc791|RFC 791]]); czasami skracane do inet \\ IPv6 = Internet Protocol version 6 ([[https://datatracker.ietf.org/doc/html/rfc8200|RFC 8200]]((Ten dokument jest trzecim z kolei RFC opisującym IPv6, pierwszy to [[https://datatracker.ietf.org/doc/html/rfc1883|RFC 1883]]))); czasami skracane do inet6 Budowa nagłówka IPv4 i IPv6:\\ {{:sk2:pakiet_ipv4_vs_ipv6.svg|}} \\
źródło: https://www.ripe.net/support/training/material/ripe-ncc-training-material Pole //opcje// w IPv4 pozwala dodawać kolejne informacje do nagłówka IPv4. \\ W IPv6 zamiast tego po nagłówku IPv6 może znajdować się nagłówek z kolejnymi informacjami:\\# netstat -ng IPv6/IPv4 Group Memberships Interface RefCnt Group --------------- ------ --------------------- br0 1 224.0.0.251 br0 1 224.0.0.1 # ip maddr 4: br0 link 01:00:5e:00:00:01 link 01:00:5e:00:00:fb inet 224.0.0.1 inet 224.0.0.251 # cat /proc/net/igmp Idx Device : Count Querier Group Users Timer Reporter 3 br0 : 2 V3 FB0000E0 1 0:00000000 0 010000E0 1 0:00000000 0++++ ====== Trasowanie ====== ===== Wstęp ===== === Trasowanie === Zadaniem warstwy sieci jest dostarczenie danych do dowolnego wskazanego urządzenia w sieci. \\ **Jeśli cel nie jest bezpośrednio połączony, dane (pakiety) trzeba wysłać do wybranego z bezpośrednich sąsiadów.** Zauważ że adres źródłowy i docelowy warstwy sieci (adres IP) zostaje bez zmian od źródła do celu, a adres źródłowy i docelowy warstwy łącza danych (adres MAC) jest ustawiany na nowo przez każde kolejne urządzenie. **Trasowanie** (routing) to wyznaczenie następnego urządzenia do którego zostanie wysłany pakiet. \\ Na każdym urządzeniu wyznaczany jest **adres IP następnego skoku** i interfejs którym pakiet zostanie wysłany (nigdy cała trasa). {{bio-sk:trasy.png}} === Tablica tras === Urządzenia podejmują decyzję dokąd dalej wysłać pakiet na podstawie **tablicy tras** ([[http://en.wikipedia.org/wiki/Routing_table|routing table]]). Tablicę tras można zbudować ręcznie (trasowanie statyczne), lub skonfigurować i uruchomić protokół trasowania dynamicznego który automatycznie zbuduje taką tablicę. Tablica tras to lista wpisów na które składają się przynajmniej: * cel – sieć docelową (np. 1.2.0.0/16, 192.168.2.0/24) * trasa – 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 * metryka – 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 Przykład tablicy tras w Linuksie:
default via 150.254.32.65 dev br0 proto dhcp 10.0.0.0/8 via 150.254.32.126 dev br0 10.3.0.0/16 via 150.254.32.65 dev br0 10.8.0.0/16 via 172.16.0.1 dev enp1s0 metric 100 10.8.0.0/16 via 150.254.32.88 dev br0 metric 200 150.254.32.64/26 dev br0 proto kernel scope link src 150.254.32.75 172.16.0.0/16 dev enp1s0 proto kernel scope link src 172.16.0.10 172.18.0.0/16 dev enp1s0 scope link=== 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 1002
tu 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ą**. \\
Czasami 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
===== Trasowanie statyczne w Linuksie =====
==== Wyświetlanie tablic routingu w systemie Linux ====
Narzędzia ''route'' (net-tools) i ''ip route'' (iproute2)
Wypisanie trasy (uwaga, komendy wypisują zwykle osobno trasy do IPv4 i IPv6):
* ''ip [-6] route [list|show]''
* ''route [-6]''
* ''ip route show table all'' pokaże wszystkie trasy naraz
Sprawdzenie adresu następnego skoku do podanego adresu docelowego:
* ''ip route get / # 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 pakietów (packet forwarding). \\ Aby zmienić to zachowanie, należy zmienić parametry jądra wykonując: \\ ''sysctl net.ipv4.conf.all.forwarding=1'' \\ ''sysctl net.ipv6.conf.all.forwarding=1'' \\ lista dostępnych zmiennych: ''sysctl -a -r 'ip.*\.forwarding' '' (więcej informacji: ''man 8 sysctl'' oraz ''man 7 ip'') \\ dla IPv4 będzie też działać starszy parametr: ''sysctl net.ipv4.ip_forward=1'' Alternatywnie można też skorzystać z katalogu /proc: \\ ''echo 1 > /proc/sys/net/ipv4/conf/all/forwarding'' \\ ''echo 1 > /proc/sys/net/ipv6/conf/all/forwarding'' \\ dla IPv4 będzie też działać starszy plik: ''echo 1 > /proc/sys/net/ipv4/ip_forward'' Ponadto na większości produkcyjnych systemów firewall domyślnie zabrania na przepuszczanie ruchu ==== Komendy zmieniające trasy ==== === iproute2 === | 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. | === net-tools === | 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 | Komendy ustawiające trasy IPv4 i IPv6 są identyczne, przykłady są tylko dla IPv4 dla zwięzłości materiałów. 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). W Linuksie istnieją specjalne pseudo-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'' \\ ===== [Ekstra] Komendy dla Windowsa ===== * Obsługa tablicy routingu – odwieczne polecenie ''[[https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/route_ws2008|route]]'' (uwaga, wsparcie tylko dla IPv4) * Wyświetlenie tablicy tras ''route print'' * Dodanie trasy: ''route add