===== 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). Na warstwie sieci działają protokoły IPv4 i IPv6 === Fragmentacja w IPv4 i IPv6 === Protokoły działające na drugiej warstwie (łącza danych) mają górne ograniczenie na wielkość ramek, np. dla Ethernetu to 1500B. Niektóre protokoły działające na czwartej warstwie (transportu) potrzebują czasami przesłać większe wiadomości – np. w protokole UDP programista może zażądać wysłania wiadomości do rozmiaru 64kB. Dlatego protokoły trzeciej warstwy (sieci) – takie jak IPv4 i IPv6 – potrafią wykonać fragmentację: podzielić wiadomość warstwy czwartej na fragmenty, przesłać każdy z nich w osobnym pakiecie, a następnie u odbiorcy złożyć te fragmenty w całość. Fragmentacji, o ile to możliwe, należy unikać – często prowadzi do nieoptymalnego wykorzystania sieci. === ICMP === Protokół IP nie przewiduje informowania nadawcy o problemach. Funkcje diagnostyczne i kontrolne dla IP spełnia protokół ICMP (Internet Control Message Protocol). ICMP różni się w szczegółach między wersją dla [[https://en.wikipedia.org/wiki/Internet_Control_Message_Protocol|IPv4 (ICMP)]] i dla [[https://en.wikipedia.org/wiki/ICMPv6|IPv6 (ICMPv6)]]. ICMPv6 spełnia też dodatkowe funkcje. ICMP/v6 pozwala między innymi na: * wysłanie informacji zwrotnej o niedostarczeniu pakietu, z podaniem powodu, np: * nie ma takiej sieci, komputera, programu docelowego, … (//destination unreachable//) * zabroniono fragmentacji, a pakiet był za duży żeby go przesłać dalej (//packet too big//) * pakiet zrobił za dużo skoków i skończył się TTL/hop limit (//time exceeded//) * testowanie łączności (ping – //echo request// i //echo reply//) ===== 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). ==== 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) 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 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ą**. \\ 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 ==== Szukanie MAC, przełączanie, trasowanie – ilustracja ==== ==== Komendy sprawdzające trasę pakietu ==== W nagłówku każdego pakietu IP jest limit przeskoków (w IPv4: TTL – Time To Live, w IPv6: Hop Limit), zmniejszany przez każdy mijany router. Kiedy licznik spadnie do zera, pakiet nie jest przesyłany dalej, a do nadawcy powinien zostać wysłany pakiet ICMP //Time exceeded//. Można wykorzystać ten mechanizm do poznania trasy pakietu – wysyła się pakiety z wartościami limitu przeskoków 1, 2, 3, 4, …, następnie obserwuje skąd przychodzą odpowiedzi o przekroczeniu limitu. Programy które służą do badania w ten sposób trasy to: * ''traceroute {-I|-T} '' \\ Z uwagi na firewall Politechniki proszę używać opcji ''-I'' lub ''-T'', która go skutecznie omija * ''mtr '' ===== Konfiguracja trasowania statycznego 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 '' ++++ 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 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 / [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. | === net-tools ===
| 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 | 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 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!) * Można też użyć odpowiedni cmdlet modułu [[https://learn.microsoft.com/en-us/powershell/module/nettcpip/?view=windowsserver2022-ps|NetTCPIP]] albo komendę ''[[https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2008-r2-and-2008/cc753156(v=ws.10)#add-route|netsh]]'' * 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")