Różnice między wybraną wersją a wersją aktualną.
— |
bio-psiec:routing [2025/10/15 21:47] (aktualna) jkonczak utworzono |
||
---|---|---|---|
Linia 1: | Linia 1: | ||
+ | ===== 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: | ||
+ | <html><div style="margin-top:-1.2em;margin-bottom:-1.2em"></div></html> | ||
+ | <html><pre> | ||
+ | <span title="Trasa domyślna – będzie użyta jak żadna inna się nie dopasuje" style="background-color:rgba(255,0,255,0.1)">default</span> <span title="Wskazanie do kogo przekazać dalej pakiet idący na adresy IP ze wskazanej sieci" style="background-color:rgba(255,0,0,0.2)">via 150.254.32.65</span> dev br0 <span title="Trasę ustawił protokół DHCP" style="background-color:rgba(0,128,0,0.1)">proto dhcp</span> | ||
+ | <span title="Wskazanie do których adresów IP prowadzi trasa" style="background-color:rgba(255,255,0,0.2)">10.0.0.0/8</span> <span title="Wskazanie do kogo przekazać dalej pakiet idący na adresy IP ze wskazanej sieci" style="background-color:rgba(255,0,0,0.2)">via 150.254.32.126</span> dev br0 | ||
+ | <span title="Wskazanie do których adresów IP prowadzi trasa" style="background-color:rgba(255,255,0,0.2)">10.3.0.0/16</span> <span title="Wskazanie do kogo przekazać dalej pakiet idący na adresy IP ze wskazanej sieci" style="background-color:rgba(255,0,0,0.2)">via 150.254.32.65</span> dev br0 | ||
+ | <span title="Wskazanie do których adresów IP prowadzi trasa" style="background-color:rgba(255,255,0,0.2)">10.8.0.0/16</span> <span title="Wskazanie do kogo przekazać dalej pakiet idący na adresy IP ze wskazanej sieci" style="background-color:rgba(255,0,0,0.2)">via 172.16.0.1</span> dev enp1s0 <span title="Koszt wysłania pakietu tą trasą" style="background-color:rgba(0,0,255,0.1)">metric 100</span> | ||
+ | <span title="Wskazanie do których adresów IP prowadzi trasa" style="background-color:rgba(255,255,0,0.2)">10.8.0.0/16</span> <span title="Wskazanie do kogo przekazać dalej pakiet idący na adresy IP ze wskazanej sieci" style="background-color:rgba(255,0,0,0.2)">via 150.254.32.88</span> dev br0 <span title="Koszt wysłania pakietu tą trasą" style="background-color:rgba(0,0,255,0.1)">metric 200</span> | ||
+ | 150.254.32.64/26 dev br0 <span title="Trasę automatycznie ustawił kernel przy dodaniu IP z tej sieci do interfejsu" style="background-color:rgba(0,128,0,0.1)">proto kernel</span> scope link src 150.254.32.75 | ||
+ | 172.16.0.0/16 dev enp1s0 <span title="Trasę automatycznie ustawił kernel przy dodaniu IP z tej sieci do interfejsu" style="background-color:rgba(0,128,0,0.1)">proto kernel</span> scope link src 172.16.0.10 | ||
+ | <span title="Dodana ręcznie informacja że komputery z sieci 172.18.0.0/16 są bezpośrednio osiągalne przez urządzenie enp1s0" style="background-color:rgba(255,128,0,0.2)">172.18.0.0/16 dev enp1s0 scope link</span> | ||
+ | </pre></html> | ||
+ | | ||
+ | ==== 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.:<code>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</code> 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.:<code>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</code>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.<code>default via 150.254.44.1 dev wlan0 | ||
+ | default via 150.254.130.42 dev eth0</code> | ||
+ | |||
+ | 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 ==== | ||
+ | |||
+ | <html> | ||
+ | <object id="svg-object" data="/jkonczak/_media/bio-psiec:routing:arp-switching-routing.svg" type="image/svg+xml"></object> | ||
+ | </html> | ||
+ | |||
+ | ==== Komendy sprawdzające trasę pakietu ==== | ||
+ | |||
+ | W nagłówku każdego pakietu IP jest limit przeskoków (<small>w IPv4: TTL – Time | ||
+ | To Live, w IPv6: Hop Limit</small>), 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} <//cel//>'' \\ <small>Z uwagi na firewall Politechniki proszę używać opcji ''-I'' lub ''-T'', która go skutecznie omija</small> | ||
+ | * ''mtr <//cel//>'' | ||
+ | |||
+ | ===== 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]'' | ||
+ | * <small>''ip route show table all'' pokaże wszystkie trasy naraz</small> | ||
+ | <html><div style="margin-top:-1.2em"></div></html> | ||
+ | Sprawdzenie adresu następnego skoku do podanego adresu docelowego: | ||
+ | * ''ip route get <addr>'' | ||
+ | |||
+ | ++++ Przykłady poleceń | | ||
+ | <html><pre> | ||
+ | <b>/ # ip route</b> | ||
+ | <span title="Trasa domyślna (trasa do 0.0.0.0/0)" style="background-color:rgba(0,255,0,0.2)">default</span> via 10.0.1.2 dev br0 proto dhcp src 10.0.1.3 metric 3 | ||
+ | <span title="Cel trasy - sieć 10.0.0.0/24" style="background-color:rgba(0,255,0,0.2)">10.0.0.0/24</span> <span title="Następny skok" style="background-color:rgba(255,0,0,0.2)">via 10.0.1.1</span> <span title="Urządzenie przez które dostępny jest adres następnego skoku" style="background-color:rgba(255,255,0,0.4)">dev br0</span> proto dhcp <span title="Adres używany jako źródłowy, ma znaczenie jeśli komputer ma wiele adresów IP" style="background-color:rgba(0,0,255,0.15)">src 10.0.1.3</span> <span title="Metryka (koszt) trasy" style="background-color:rgba(255,0,255,0.2)">metric 3</span> | ||
+ | <span title="Trasa bez adresu IP następnego skoku oznacza, że komputery z tej sieci są bezpośrednio połączone do podanego interfejsu" style="background-color:rgba(255,0,0,0.2)">10.0.1.0/24 dev br0</span> 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 <span title="Przykład dodatkowej opcji trasy" style="background-color:rgba(0,0,0,0.1)">mtu 1480</span> | ||
+ | <span title="Przykład specjalnego typu trasy (tutaj: zaznaczenie, że tych adresów nie ma w sieci)" style="background-color:rgba(0,0,0,0.1)">blackhole 10.0.4.0/24</span> | ||
+ | |||
+ | <b>/ # route -n</b> | ||
+ | Kernel IP routing table | ||
+ | Destination Gateway Genmask Flags Metric Ref Use Iface | ||
+ | <span title="Trasa domyślna" style="background-color:rgba(0,255,0,0.2)">0.0.0.0</span> 10.0.1.2 0.0.0.0 UG 3 0 0 br0 | ||
+ | <span title="Cel trasy - sieć lub komputer 10.0.0.0, w zależności od maski podanej dalej" style="background-color:rgba(0,255,0,0.2)">10.0.0.0</span> 10.0.1.1 <span title="Maska adresu docelowego – w tym przypadku /24, czyli jest to adres do sieci" style="background-color:rgba(0,255,0,0.2)">255.255.255.0</span> UG 3 0 0 br0 | ||
+ | 10.0.1.0 <span title="Brak adresu następnego skoku oznacza sieć bezpośrednio połączoną" style="background-color:rgba(255,0,0,0.2)">0.0.0.0</span> 255.255.255.0 U 3 0 0 br0 | ||
+ | 10.0.2.0 <span title="Adres następnego skoku" style="background-color:rgba(255,0,0,0.2)">10.0.1.254</span> 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 * | ||
+ | |||
+ | <b>/ # ip route get 10.0.1.2</b> | ||
+ | 10.0.1.2 dev br0 src 10.0.1.3 uid 1000 | ||
+ | cache | ||
+ | |||
+ | <b>/ # ip route get 10.0.0.1</b> | ||
+ | 10.0.0.1 via 10.0.1.1 dev br0 src 10.0.1.3 uid 1000 | ||
+ | cache | ||
+ | |||
+ | <b>/ # ip route get 150.254.32.129</b> | ||
+ | 150.254.32.129 via 10.0.1.2 dev br0 src 10.0.1.3 uid 1000 | ||
+ | cache | ||
+ | |||
+ | <b>/ # ip route get 10.0.3.3</b> | ||
+ | 10.0.3.3 via 10.0.1.254 dev br0 src 10.0.1.3 uid 1000 | ||
+ | cache mtu 1480 | ||
+ | </pre></html> | ||
+ | ++++ | ||
+ | |||
+ | ==== 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'' | ||
+ | \\ | ||
+ | <small> | ||
+ | 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'' | ||
+ | </small> | ||
+ | |||
+ | <small> | ||
+ | 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 | ||
+ | </small> | ||
+ | |||
+ | ==== Komendy zmieniające trasy ==== | ||
+ | |||
+ | === iproute2 === | ||
+ | <html><div style="margin-top:-1.2em"></div></html> | ||
+ | | 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'' | | ||
+ | | <small> Dodanie trasy przez urządzenie </small>|<small> ''ip route add <//addr//>/<//mask//> dev <//ifname//>'' \\ np.: ''ip r add 192.168.6.0/24 dev tun0'' </small>| | ||
+ | | 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'' \\ <small>Uwaga! Usuwa też trasy do bezpośrednio połączonych sieci.</small> | | ||
+ | |||
+ | === net-tools === | ||
+ | <html><div style="margin-top:-1.2em"></div></html> | ||
+ | | 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'' \\ <small>Uwaga! Starsze wersje nie znają słowa kluczowego default, trzeba ustawiać trasę do 0.0.0.0/0 </small> | | ||
+ | |||
+ | <small>Komendy ustawiające trasy IPv4 i IPv6 są identyczne, przykłady są tylko dla IPv4 dla zwięzłości materiałów.</small> | ||
+ | |||
+ | 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. | ||
+ | |||
+ | <small> | ||
+ | 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'' \\ | ||
+ | </small> | ||
+ | |||
+ | ===== [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 <SIEĆ> mask <MASKA> <NEXT_HOP>'' \\ np. ''route add 192.168.1.0 mask 255.255.255.0 10.0.0.1'' | ||
+ | * Usunięcie trasy ''route delete <SIEĆ>'' \\ (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") | ||