===== Wstęp ===== {{bio-sk:basics_routing:switch-router-symbols.svg}} Do budowy sieci lokalnych (ale nie tylko) używa się głównie dwóch typów urządzeń: przełączników (ang. //switch//) i trasowników (ang. //router//). Dwa urządzenia połączone ze sobą kablem lub połączone za pośrednictwem samych switchy mogą wysłać bezpośrednio do siebie ramki ethernetowe. Jeżeli na ścieżce między urządzeniem źródłowym //SRC// a urządzeniem docelowym //DST// jest router //R//, to urządzenie //SRC// nie może wysyłać ramki ethernetowej do urządzenia //DST//. Zamiast tego, //SRC// może wysłać ramkę ethernetową do routera //R//, który patrząc na dane zawarte w ramce (zwykle adresy IP) prześle ją dalej do urządzenia //DST//. \\ {{bio-sk:basics_routing:router_pass.svg}} ==== Adresy MAC ==== Do adresowania ramek ethernetowych – wiadomości przesyłanych między urządzeniami bezpośrednio połączonymi lub połączonym tylko switchami – używa się [[http://en.wikipedia.org/wiki/MAC_address|adresów MAC]] (adresów fizycznych). \\ Adres MAC ma 48 bitów i jest zapisywany szesnastkowo, w 6 grupach po 8 bajtów oddzielonych dwukropkiem. \\ Przykład adresu: 5c:f9:dd:78:3d:88. Adresy MAC są wykorzystywane też w innych sieciach niż Ethernet – przykładowo są tak samo używane w sieciach Wi-Fi. === Unikalne adresy MAC === Adres MAC używany domyślnie (tzn. używany jeśli administrator nie wybierze innego) jest ustawiany w nienadpisywalnej pamięci karty sieciowej przez jej producenta. \\ Taki adres MAC jest podzielony na dwie części: pierwsza połowa to identyfikator producenta (OUI), druga połowa to numer karty. \\ Producenci sprzętu muszą [[https://standards.ieee.org/products-programs/regauth/|wykupić pulę adresów]]. Lista zajętych początków adresów jest [[https://standards-oui.ieee.org/|dostępna publicznie]], razem z informacją kto ma który OUI. System operacyjny musi sam wpisać adres MAC do każdej ramki, adres MAC używany przez kartę można zmienić na inny. === Pozostałe adresy MAC === Adresy MAC z ustawionym bitem 0x01 w pierwszym bloku to adresy multicastowe (i adres rozgłoszeniowy, ff:ff:ff:ff:ff:ff). \\ Adresy użyte przez IPv4 do multicastu zaczynają się od ''01:00:5e:…'', a IPv6 od ''33:33:…'' Adresy MAC z ustawionym bitem 0x02 w pierwszym bloku to adresy lokalnie administrowane (nieunikalne). Można je nadawać np. urządzeniom wirtualnym. === Wyświetlanie / zmiana adresów MAC === | odczyt adresów MAC | zmiana adresu MAC | | ''ip link [show dev //eth0//]'' | ''ip link set dev //eth0// address //12:34:56:78:90:ab//'' | | ''ifconfig [//eth0//]'' | ''ifconfig //eth0// hw ether //12:34:56:78:90:ab//'' |
Większość sterowników kart pozwala zmieniać MAC tylko na wyłączonych kartach. ++++ Przykłady poleceń wyświetlających adres MAC: |
/ # ip l
2: em1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UP mode DEFAULT group default qlen 1000
    link/ether 5c:f9:dd:78:3d:88 brd ff:ff:ff:ff:ff:ff
3: p4p1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
    link/ether 90:e2:ba:1a:4d:48 brd ff:ff:ff:ff:ff:ff
5: wlan0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether 08:ed:b9:4c:31:8b brd ff:ff:ff:ff:ff:ff

/ # ifconfig -a
em1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        ether 5c:f9:dd:78:3d:88  txqueuelen 1000  (Ethernet)
        RX packets 2702  bytes 355076 (346.7 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 523  bytes 53668 (52.4 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        device interrupt 20  memory 0xddf00000-ddf20000  

p4p1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.2  netmask 255.255.255.0  broadcast 0.0.0.0
        inet6 fe80::92e2:baff:fe1a:4d48  prefixlen 64  scopeid 0x20<link>
        ether 90:e2:ba:1a:4d:48  txqueuelen 1000  (Ethernet)
        RX packets 293  bytes 60122 (58.7 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 286  bytes 26478 (25.8 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        device memory 0xdd420000-dd43ffff  

wlan0: flags=4098<BROADCAST,MULTICAST>  mtu 1500
        ether 08:ed:b9:4c:31:8b  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
++++ ==== Podsieci i adresy IP a switche/routery ==== Urządzenia połączone ze sobą kablem lub połączone za pośrednictwem switchy mogą wysyłać do siebie wiadomości bezpośrednio, więc nadaje im się adresy z tej samej podsieci IP. Połączone ze sobą bezpośrednio switche razem z bezpośrednio połączonymi do tych switchy urządzeniami tworzą [[https://en.wikipedia.org/wiki/Network_segment|segment sieci]] nazywany [[https://pl.wikipedia.org/wiki/Domena_rozg%C5%82oszeniowa|domeną rozgłoszeniową]]. \\ **Nadanie adresów IP z tej samej podsieci na urządzeniach podłączonych do różnych takich segmentów sieci jest nieprawidłową konfiguracją!** \\ Komunikacje między takimi segmentami (domenami rozgłoszeniowymi) realizują routery. ==== Trasy ==== {{bio-sk:basics_routing:why-route.svg}} Spójrz na sieć z ilustracji. Zauważ, że cokolwiek PC1 chce przesłać przez sieć, może przesłać jedynie kablem do urządzenia R1 – bo tylko takie połączenie ma. \\ Ale co z PC2? Jeżeli chce wysłać dane do PC1 albo do PC3, to skąd ma wiedzieć czy przesłać je kablem "w lewo" czy "w prawo"? \\ I skąd ma wiedzieć czy podać te dane do przekazania dalej urządzeniu R1 czy R2 (na "lewym" kablu), bądź R3 czy R4 (na "prawym" kablu)? \\ Wszystko to musi ustawić administrator tworząc tablicę tras. Urządzenia podejmują decyzję dokąd dalej wysłać pakiet na podstawie **tablicy tras** ([[http://en.wikipedia.org/wiki/Routing_table|routing table]]). \\ Taką 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 które określają do jakich adresów IP ten komputer zna drogę i wskazuje jak/którędy można się do tych adresów dostać. \\ W tablicy tras są zarówno informacje o adresach IP z którymi urządzenie może się bezpośrednio komunikować (trasy bezpośrednie), jak i informacje o adresach do których można się dostać tylko za pośrednictwem innych urządzeń. Na każdy wpis w tablicy tras składa się: * cel – sieć docelowa (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 interfejs wyjściowy (eth1, wlan0): * dla sieci bezpośrednio podłączonych podaje się tylko urządzenie, * w każdym innym przypadku podaje się **adres następnego skoku, czyli adres bezpośrednio połączonego urządzenia** któremu przekazać wiadomość od przesłania dalej, * metryka – koszt wysłania daną trasą pakietu, używany do porównywania tras do tego samego celu (metryka to wartość liczbowa, np. 0, 1, 10, 679842). Zwykle definiuje się w tablicy tras też **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 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
==== Trasowanie ==== **Trasowanie** (routing) to wyznaczenie następnego urządzenia do którego zostanie przesłana wiadomość kierowana pod wskazany w tej wiadomości docelowy adres IP. \\ Na każdym kolejnym urządzeniu wyznaczany jest adres IP następnego skoku i interfejs którym pakiet zostanie wysłany (nigdy cała trasa). Schemat wyboru trasy na podstawie tablicy tras: - 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
==== Sprawdzanie trasy ==== Do sprawdzania trasy którą idą dane do wskazanego adresu IP (czy nazwy domenowej), czyli do sprwdzenia przez jakie routery IP przechodzą dane na drodze do podanego celu, można użyć poleceń: * ''traceroute {-I|-T} '' \\ Z uwagi na firewall Politechniki proszę używać opcji ''-I'' lub ''-T'', która go skutecznie omija * ''mtr '' Zauważ, że urządzenia na trasie mogą: * przekazywać dalej dane, ale nie odpowiadać na próbę zbadania trasy (np. mieć tak ustawiony firewall), * mieć źle skonfigurowaną tablicę tras, przez co nie wiedzą gdzie wysłać odpowiedź na próbę zbadania trasy. ++++ Przykład badania trasy: |
/ # traceroute -T www.gov.pl
traceroute to www.gov.pl (185.32.48.49), 30 hops max, 60 byte packets
 1  150.254.32.65 (150.254.32.65)  0.677 ms  0.461 ms  0.523 ms
 2  150.254.30.129 (150.254.30.129)  0.565 ms  0.553 ms  0.542 ms
 3  hellfire.put.poznan.pl (150.254.6.36)  0.915 ms  *  0.892 ms
 4  PUTNET-BGP-P.put.poznan.pl (150.254.4.66)  0.700 ms  0.606 ms  1.645 ms
 5  237.14.119.185-rev.hti.pl (185.119.14.237)  1.078 ms  0.774 ms  1.051 ms
 6  088156078001.p2p.business.static.vectranet.pl (88.156.78.1)  7.493 ms  6.434 ms  6.538 ms
 7  exatel.tpix.pl (195.149.232.45)  23.117 ms  22.719 ms  22.763 ms
 8  88.220.42.166 (88.220.42.166)  7.340 ms  7.523 ms  7.495 ms
 9  * * *
10  100.90.0.6 (100.90.0.6)  7.943 ms  7.506 ms  8.292 ms
11  185.32.48.49 (185.32.48.49)  7.623 ms  7.725 ms  7.957 ms
/ # traceroute poznan.pl
traceroute to poznan.pl (150.254.186.176), 30 hops max, 60 byte packets
 1  150.254.32.65 (150.254.32.65)  0.729 ms  0.565 ms  0.654 ms
 2  150.254.30.129 (150.254.30.129)  0.577 ms  0.614 ms  0.596 ms
 3  hellfire.put.poznan.pl (150.254.6.36)  1.528 ms  0.909 ms  0.595 ms
 4  PUTNET-BGP-P.put.poznan.pl (150.254.4.66)  18.596 ms  18.314 ms  18.297 ms
 5  mx-pp-wilda-irb-1.man.poznan.pl (150.254.163.29)  1.206 ms  1.243 ms  1.171 ms
 6  150.254.249.66 (150.254.249.66)  1.485 ms  0.921 ms  1.540 ms
 7  * * *
 8  * * *
 9  * * *
...
++++ ===== Polityka systemu względem ruchu przechodzącego ===== Domyślnie Linux **nie** pozwala na przekazywanie pakietów które przyszły na jednym interfejsie do wysłania innym interfejsem (ang. //packet forwarding//). \\ Żeby zmienić to zachowanie, czyli pozwolić Linuksowi pracować jako router, należy zmienić parametry jądra wykonując komendy: \\ ''sysctl net.ipv4.conf.all.forwarding=1'' \\ ''sysctl net.ipv6.conf.all.forwarding=1'' Komenda ''sysctl'' zmienia opcje jądra systemu operacyjnego. Więcej informacji znajdziesz w [[https://docs.kernel.org/networking/ip-sysctl.html|dokumentacji jądra]]. Zamiast komendy ''sysctl'' 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 przepuszczania ruchu ===== Trasowanie statyczne w Linuksie ===== ==== Wyświetlanie tablic routingu w systemie Linux ==== Wypisanie trasy (uwaga, komendy wypisują zwykle osobno trasy do IPv4 i IPv6): * ''ip [-6] route [list|show]'' \\ np. ''ip route'' * ''route [-6]''       (komenda ze starszej paczki narzędzi – ''net-tools'' – tej z której jest ''ifconfig'') * ''ip route show table all''       pokaże wszystkie trasy naraz
Wyświetlenie adresu następnego skoku do podanego adresu docelowego na podstawie skonfigurowanej tablicy tras: * ''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
++++ ==== 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'' \\ ===== Wireshark ===== [[https://www.wireshark.org|Wireshark]] to narzędzie, które pozwala między innymi wyświetlić i analizować wiadomości wysłane przez karty sieciowe. \\ W tym celu, po uruchomieniu należy wybrać kartę i rozpocząć przechwytywanie. Następnie wyświetli się lista przechwyconych wiadomości. Zaznaczenie jednej z nich spowoduje wyświetlenie jej w postaci rozkodowanej – rozwijalnego drzewa dla każdego z kolejnych użytych na różnych warstwach sieci protokołów. Dodatkowo treści wiadomości pokazywana jest szesnastkowo. ===== [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")