Narzędzia użytkownika

Narzędzia witryny


bio-psiec:routing

Różnice

Różnice między wybraną wersją a wersją aktualną.

Odnośnik do tego porównania

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"​)
  
bio-psiec/routing.txt · ostatnio zmienione: 2025/10/15 21:47 przez jkonczak