Table of Contents
Konfiguracja do zajęć
Zadanie 1 Na początku zajęć, pracując w grupach, połączcie cztery komputery jak na schemacie:
┌───┐ p4p1┌───┐ p4p1┌───┐ p4p1┌───┐ │PC1├···········┤PC2├···········┤PC3├···········┤PC4│ └───┘p4p1 └───┘p4p2 └───┘p4p2 └───┘
Zadanie 2 Następnie skonfigurujcie każdy z tych komputerów poniższymi gotowymi
komendami:
(można je po prostu skopiować i wkleić do powłoki pracującej z uprawnieniami roota):
PC1
ethtool --offload p4p1 gro off gso off tso off ufo off ip link set p4p1 address 02:00:00:00:01:01 ip link set p4p1 up ip address add 10.1.2.1/24 dev p4p1 ip address add fd00:1:2::1/64 dev p4p1 ip route add 10.2.3.0/24 via 10.1.2.2 ip route add 10.3.4.0/24 via 10.1.2.2 ip route add fd00:2:3::/64 via fd00:1:2::2 ip route add fd00:3:4::/64 via fd00:1:2::2
PC2
ethtool --offload p4p1 gro off gso off tso off ufo off ethtool --offload p4p2 gro off gso off tso off ufo off ip link set p4p1 address 02:00:00:00:02:01 ip link set p4p1 up ip link set p4p2 address 02:00:00:00:02:02 ip link set p4p2 up ip address add 10.1.2.2/24 dev p4p1 ip address add fd00:1:2::2/64 dev p4p1 ip address add 10.2.3.2/24 dev p4p2 ip address add fd00:2:3::2/64 dev p4p2 sysctl net.ipv4.conf.all.forwarding=1 sysctl net.ipv6.conf.all.forwarding=1 ip route add 10.3.4.0/24 via 10.2.3.3 ip route add fd00:3:4::/64 via fd00:2:3::3
PC3
ethtool --offload p4p1 gro off gso off tso off ufo off ethtool --offload p4p2 gro off gso off tso off ufo off ip link set p4p1 address 02:00:00:00:03:01 ip link set p4p1 up ip link set p4p2 address 02:00:00:00:03:02 ip link set p4p2 up ip address add 10.2.3.3/24 dev p4p1 ip address add fd00:2:3::3/64 dev p4p1 ip address add 10.3.4.3/24 dev p4p2 ip address add fd00:3:4::3/64 dev p4p2 sysctl net.ipv4.conf.all.forwarding=1 sysctl net.ipv6.conf.all.forwarding=1 ip route add 10.1.2.0/24 via 10.2.3.2 ip route add fd00:1:2::/64 via fd00:2:3::2
PC4
ethtool --offload p4p1 gro off gso off tso off ufo off ip link set p4p1 address 02:00:00:00:04:01 ip link set p4p1 up ip address add 10.3.4.4/24 dev p4p1 ip address add fd00:3:4::4/64 dev p4p1 ip route add 10.2.3.0/24 via 10.3.4.3 ip route add 10.1.2.0/24 via 10.3.4.3 ip route add fd00:2:3::/64 via fd00:3:4::3 ip route add fd00:1:2::/64 via fd00:3:4::3
Komenda ethtool --offload … użyta w powyższych poleceniach konfiguruje kartę
sieciową tak by ta przekazywała do systemu operacyjnego takie ramki ethernetowe
jak przyszły z sieci. Karty sieciowe potrafią dla popularnych protokołów warstwy
sieci i transportu rozpoznać że jedna wysłana wiadomość aplikacyjna została
podzielona na kilka ramek i zamiast przekazać te prawdziwe ramki, przekazują
sztucznie stworzoną, nierzeczywistą ramkę z tą samą wiadomością aplikacyjną.
To zmniejsza ilość ramek które musi przetworzyć system operacyjny, dzięki czemu
potrzeba cykli procesora do przetworzenia tych samych danych.
Użycie adresów MAC i IP przy przesyłaniu pakietów
Zadanie 3 Uruchom program wireshark na każdym z komputerów dla każdego wcześniej
skonfigurowanego interfejsu sieciowego (czyli np. PC2 musi uruchomić raz program
wireshark dla p4p1 i drugi raz dla p4p2).
Z PC1 wykonaj ping -c1 10.3.4.4 lub ping -c1 fd00:3:4::4, a następnie
sprawdź jakie adresy MAC i IP ma ta sama wiadomość ping (ICMP echo request) na
każdej karcie sieciowej każdego z komputerów.
Czy adresy IP się zmieniają? Czy adresy MAC się zmieniają?
Szukanie MAC dla IP
Aplikacje informują system operacyjny tylko z jakim adresem IP chcą się
komunikować. Wysyłając ramkę, system operacyjny musi sam uzupełnić pole adresu
MAC odbiorcy.
W tym celu najpierw system operacyjny przegląda tablicę tras i ustala która
trasa zostanie użyta, tj. wykonuje trasowanie (routing). Po wybraniu
trasy ustala adres IP bezpośrednio połączonego urządzenia które ma dostać tę
wiadomość i interfejs którym ją wyśle.
Następnie musi znaleźć adres MAC tego bezpośrednio połączonego urządzenia
(na razie ustalił tylko jego adres IP). Zauważ że tym urządzeniem będzie albo
odbiorca, albo kolejny router na trasie do odbiorcy.
Do znajdowania adresów MAC dla podanego adresu IPv4 służy protokół ARP.
Do znajdowania adresów MAC dla podanego adresu IPv6 służy protokół NDP.
System operacyjny trzyma odwzorowania adresów IP na adresy MAC przez określony
czas w pamięci podręcznej (żeby nie musieć ciągle wyszukiwać MAC dla IP z którym
często wymienia dane).
Informacje o tym jakie odwzorowania IP na MAC zna system operacyjny można
wyświetlić komendą ip neighbour (działa też pisownia ip neighbor).
Do wyświetlenia odwzorowań adresów IPv4 na MAC można użyć starszej komendy arp.
Listę znanych odwzorowań można wyczyścić komendą ip neighbour flush {all|dev <ifname>}.
Zadanie 4 Upewnij się że wiresharkiem przechwytujesz pakiety sieciowe na p4p1 / p4p2. Następnie:
- wyczyść listę odwzorowań IP na MAC na każdym komputerze,
- wykonaj z PC4
ping -c1 10.1.2.1orazping -c1 fd00:1:2::1, - wyświetl listę odwzorowań adresów IP na adresy MAC po wykonaniu tych komend
- znajdź w przechwyconych wiresharkiem pakietach te odpowiadające za wyszukanie adresów MAC dla wskazanych IP.
O adresy MAC odpowiadające jakim adresom IP pytał PC4 i PC3? Dlaczego pytał konkretnie o te adresy IP?
Komenda arping pozwala wysłać żądanie protokołu ARP:
arping -I <nazwa interfejsu> <adres IPv4>
np. arping -I p4p2 10.2.3.3
Komenda ndisc6 pozwala wysłać wiadomość Neighbor Solicitation protokołu NDP:
ndisc6 <adres IPv6> <nazwa interfejsu>
np. ndisc6 fd00:2:3::2 p4p1
Zadanie 5 Ręcznie odpytaj o adres MAC urządzenia o adresie IPv4 osoby siedzącej obok, a następnie o MAC urządzenia o adresie IPv6 tej samej osoby siedzącej obok.
Zadanie 6 Kiedy można używać komendy ping i arping/ndisc6
praktycznie wymiennie do sprawdzania czy jest łączność?
Kiedy jednej z nich nie da się do tego wykorzystać?
Czy sieć może działać jeżeli komenda ping wykonana dla adresu sąsiedniego urządzenia nie dostaje odpowiedzi?
Czy sieć może działać jeżeli komenda arping wykonana dla adresu sąsiedniego urządzenia nie dostaje odpowiedzi?
Szukanie MAC, przełączanie, trasowanie – ilustracja
Protokoły warstwy transportu
Protokoły warstwy sieci (np. IPv4 czy IPv6) zapewniają komunikację między dowolnymi urządzeniami w sieci.
Jednym z głównych zadań protokołów warstwy transportu jest dostarczenie wiadomości sieciowych do właściwego procesu (czyt. uruchomionego programu) działającego na docelowym urządzeniu (i zapewnienie żeby odpowiedzi też wracały do właściwego procesu).
W internecie na warstwie transportu używa się głównie protokołów TCP i UDP.
Model klient-serwer
Programy sieciowe zwykle pełnią rolę serwera lub klienta.
Serwer to program który czeka (nasłuchuje) na nowe połączenia lub wiadomości od nowych klientów.
Klient to program który łączy się do serwera lub pierwszy wysyła do niego wiadomość.
Program może jednocześnie pełnić rolę serwera i klienta – czekać na połączenia od klientów, ale też samemu inicjować komunikację. Np. serwer WWW czeka na połączenie od klientów (przeglądarek internetowych), ale do obsługi niektórych zapytań może potrzebować połączyć się (jako klient) z serwerem bazy danych.
Adresacja na warstwie transportowej
Protokoły warstwy transportowej spójnie używają 16-bitowej liczby jako adres.
Adres warstwy transportowej nazywa się numerem portu.
System operacyjny po otrzymaniu wiadomości biorąc pod uwagę:
- adresu warstwy sieci (np. IP) źródłowy (zdalny),
- adresu warstwy sieci (np. IP) docelowy (lokalny),
- użyty protokół warstwy transportowej,
- adresu warstwy transportowej (np. port) źródłowy (zdalny),
- adresu warstwy transportowej (np. port) docelowy (lokalny),
sprawdza czy wiadomość należy do już istniejącego połączenia (i wtedy dostarcza dane do tego połączenia), a jeśli nie, to czy jakiś program czeka na nowe połączenie / wiadomości pod docelowym adresem IP i docelowym portem użytego protokołu warstwy transportowej.
Znane numery portów
Konkretne numery portów są zwyczajowo używane do adresowania konkretnych
programów.
Np. port 80 i 443 jest używany przez serwery stron
internetowych, a porty 25, 465 lub 587 przez serwery poczty internetowej
(e-mail).
Lista takich numery portów, wraz z przypisanymi do nich słownymi nazwami i
informacją do czego są (albo były w przeszłości) używane
jest utrzymywana
przez organizację IANA.
W Linuksie dodatkowo taka lista jest tradycyjnie dostępna w pliku /etc/services.
Zakresy numerów portów
Zakres numerów portów jest podzielony na porty [RFC6335]:
- uprzywilejowane (system / well-known / privileged) – 1÷1023
jako lokalne porty mogą być używane tylko przez uprzywilejowanego użytkownika (root / administrator), - zarejestrowane 1) (user / registered) – 1024÷49151
mogą zostać zarejestrowane (tzn. przypisane do konkretnego zastosowania w rejestrze utrzymywanym przez IANA), - efemeryczne (dynamic / private / ephemeral) – 49152÷65535
używane kiedy program nie potrzebuje stałego numeru portu (czyli zwykle kiedy program nawiązuje połączenie).
W implementacjach systemów operacyjnych zwykle granica między user ports a ephemeral jest niższa, np. w Linuksie zakres portów efemerycznych można odczytać wykonując jedną z komend:
sysctl net.ipv4.ip_local_port_range / cat
/proc/sys/net/ipv4/ip_local_port_range.
Monitorowanie bieżących połączeń
Polecenia netstat i ss wyświetlają listę połączeń (nie tylko
sieciowych) których stroną jest ten komputer oraz (po podaniu odpowiedniej opcji)
informacje na jakich adresach IP i portach procesy na tym komputerze czekają na
połączenia bądź wiadomości.
Oba programy domyślnie pokazują też
połączenia uniksowe do komunikacji międzyprocesowej,
więc używając tych programów prawie zawsze warto dodawać przełącznik -t i/lub -u.
Pliki /proc/net/(tcp|udp|…) zawierają informacje o połączeniach w
formacie przystępnym dla maszynowego przetwarzania.
Wybrane przełączniki dla netstat / ss: ┌ (domyślnie) tylko już nawiązane połączenia │ -l nasłuchujące porty (procesy czekające aż ktoś do nich się połączy) └ -a nasłuchujące porty + nawiązane połączenia ┌ (domyślnie) wszystkie wspierane protokoły sieciowe │ -t połączenia protokołu TCP └ -u połączenia protokołu UDP ┌ -4 wybiera IPv4 └ -6 wybiera IPv6 -p nazwa i pid programu do którego należy połączenie -n pokazywanie wszystkich wartości numerycznie, np. '22' zamiast 'ssh' -W [tylko netstat] wyłącza przycinanie adresów IP / nazw domenowych do szerokości kolumny
Dodatkowo ss pozwala filtrować wyniki między innymi po adresach ip (src i dst)
oraz numerach portów (sport i dport), np:
ss -t dport 443 ss -aut src 127.0.0.1 or src 150.254.0.0/24
Więcej opcji znajdziesz w pomocy wbudowanej (netstat -h / ss -h) i
podręczniku systemowym (man netstat / man ss).
Przykładowy wynik polecenia netstat:
# netstat -atunp Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 13830/sshd tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN 28693/exim4 tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 26745/cupsd tcp 0 780 10.0.1.1:22 150.254.33.66:38126 ESTABLISHED 19424/sshd: usernam tcp 0 0 10.0.1.1:38596 150.254.30.199:443 ESTABLISHED 19481/weechat tcp6 0 0 :::22 :::* LISTEN 13830/sshd udp 0 0 0.0.0.0:68 0.0.0.0:* 14541/dhclient udp 0 0 10.0.1.1:53 0.0.0.0:* 22173/named udp 768 0 0.0.0.0:35722 0.0.0.0:* 21533/snmpwalk
Testowanie łączności na warstwie aplikacji
netcat (czasami dostępny jako nc)
to szeroko rozpowszechnione narzędzie potrafiące nawiązać proste połączenia
sieciowe bądź stworzyć prosty serwer (używając protokołu TCP bądź UDP).
Uwaga: netcat ma wiele wersji różniących się możliwościami, przełącznikami i zachowaniem!
socat to rozbudowany i wciąż rozwijany
program pozwalający testować rozmaite "połączenia" sieciowe.
socat zawsze łączy dwa "strumienie" ze sobą np. standardowe wejście/wyjście
z połączeniem sieciowym.
Można też łączyć np. jedno połączenie sieciowe z drugim, czy połączenie
sieciowe z programem.
| Serwer | Klient | |
|---|---|---|
| TCP | nc -l -p 12345 | nc 10.0.0.1 12345 |
socat TCP-LISTEN:12345 STDIO | socat STDIO TCP:10.0.0.1:12345 |
|
| UDP (pseudo-połączeniowe) | nc -u -l -p 12345 | nc -u 10.0.0.1 12345 |
socat UDP-LISTEN:12345 STDIO | socat STDIO UDP:10.0.0.1:12345 |
|
| UDP (zorientowane na wiadomość) | socat UDP-RECV:12345 STDIO | socat STDIO UDP-SENDTO:10.0.0.1:12345 |
Komendy dla UDP zorientowanego na wiadomość pozwalają tylko wysyłać albo
tylko odbierać dane. Możesz dodać przełącznik -u żeby wyciszyć ostrzeżenia
i błędy przy próbie komunikacji w drugą stronę.
netcat nie potrafi korzystać z UDP w trybie zorientowanym na wiadomość.
W programie socat zamiast STDIO można podać - (dodatkowo w większości
dystrybucji można też skorzystać z readline).
socat nie rozróżnia wielkości liter, pozwala na skróty – np.
udp-l jako udp-listen czy tcp jako tcp-connect
Adresy IPv6 podaje się w nawiasach kwadratowych, np. [::1]
Zadanie 7 Pracując w parach:
- jedna osoba uruchamia dwa serwery TCP na dwóch różnych portach (programem
netcatlubsocat), - sprawdzacie (np. programem
netstat) jak informacje o tych serwerach są widoczne w systemie, - druga osoba łączy się do jednego z tych serwerów (też programem
netcatlubsocat) podając odpowiedni adres IP i port, a następnie przesyła dane (wpisując je z klawiatury i wciskając enter), - bez przerywania połączenia sprawdzacie (np. programem
netstat) jak informacje o tym połączeniu są widoczne w systemie.
Zadanie 8
Połącz się (programem netcat lub socat) po TCP na adres 150.254.30.26
i port 80, a następnie wyślij
GET /SK/ HTTP/1.0
i pustą linię. Co dostajesz w odpowiedzi?
To zadanie da się wykonać tylko z sal laboratoryjnych.
Zadanie 9
Z uprawnieniami roota uruchom serwer TCP (programem netcat lub socat)
działający na porcie 80. Następnie w przeglądarce internetowej wejdź na adres
http://localhost/plik.txt. Co pojawiło się po stronie serwera? Odpisz coś
przeglądarce i przerwij połączenie ze strony serwera. Co pojawiło się po stronie
przeglądarki?
Po zapewnieniu łączności między procesami (czyli na warstwie transportowej) kończy się rola systemu operacyjnego – to jak przesyłane dane są interpretowane zależy już od twórcy aplikacji. Aplikacje nie są w stanie stwierdzić jaki program jest po drugiej stronie połączenia – widzą tylko przesyłane dane.
Skąd wiadomo które protokoły są używane
Dane odebrane przez ethernetową kartę sieciową mogą być tylko ramką ethernetową (o z góry znanej strukturze).
W ramce ethernetowej jest miejsce na wpisanie jaki protokół warstwy sieci (np. IPv4, IPv6, ARP, …) jest używany w danych tej ramki.
Jeżeli dane z ramki używają protokołu IPv4 lub IPv6, to w nagłówku tego protokołu jest miejsce określające jaki protokół warstwy transportowej ma być użyty do zinterpretowania danych (np. TCP, UDP, …).
Protokoły warstwy transportu wskazują z kolei numerem portu który proces działający w systemie ma dostać dane do dalszego zinterpretowania.
Zadanie 10 Znajdź w wiresharku wiadomość protokołu HTTP (możesz ją wygenerować wchodząc na http://sirius.cs.put.poznan.pl/~jkonczak/hello.html). Określ jakie protokoły warstwy łącza danych, sieci, transportu i aplikacji używa ta wiadomość.
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.
Zadanie 11 Uruchom na jednym z komputerów (np. PC4) komendę czekającą na wiadomości UDP na wybranym porcie:
Duża wiadomość UDP
do skopiowania:
0...................................................................................................100.................................................................................................200.................................................................................................300.................................................................................................400.................................................................................................500.................................................................................................600.................................................................................................700.................................................................................................800.................................................................................................900.................................................................................................1000................................................................................................1100................................................................................................1200................................................................................................1300................................................................................................1400................................................................................................1500................................................................................................1600................................................................................................1700................................................................................................1800................................................................................................1900................................................................................................2000................................................................................................2100................................................................................................2200................................................................................................2300................................................................................................2400................................................................................................2500................................................................................................2600................................................................................................2700................................................................................................2800................................................................................................2900................................................................................................3000................................................................................................3100................................................................................................3200................................................................................................3300................................................................................................3400................................................................................................3500................................................................................................3600................................................................................................3700................................................................................................3800................................................................................................3900................................................................................................
socat -u udp6-recv:2222 stdout
Następnie wyślij do tego komputera (np. z PC1) dużą wiadomość UDP – linię zawierającą ponad 3000 znaków, kolejno komendami:
socat stdin udp-sendto:10.3.4.4:2222
socat -u stdin udp-sendto:[fd00:3:4::4]:2222
Obejrzyj wygenerowany ruch w programie wireshark.
Pętle w sieci; TTL / Hop Limit
Jednym z błędów konfiguracji w sieciach jest stworzenie pętli – zmuszenie wiadomości do krążenia w zamkniętym cyklu.
Wykonanie takiej pętli między
switchami (czyli w jednej domenie rozgłoszeniowej) jest katastrofalne w skutkach
– każda ramka wysłana na adres rozgłoszeniowy będzie krążyć w tej pętli w
nieskończoność, zapychając sobą sieć. (Na taki adres są wysyłane np. wiadomości
szukające adresu MAC dla podanego adresu IP.)
Jedynym sposobem na przywrócenie normalnej pracy jest zlikwidowanie pętli,
zwykle przez wypięcie jednego z tworzących ją kabli.
Powstawaniu pętli mają zapobiegać
protokoły drzewa rozpinającego
(STP, RSTP, PVSTP (cisco), MSTP), które automatycznie wykrywają
czy każde nowe połączenie może stworzyć pętle i jeżeli tak, to wyłączają to
połączenie.
Innym rodzajem pętli jest ustawienie
tablic tras na różnych urządzeniach w taki sposób, że pakiet IP "wraca" do urządzenia
które wcześniej już minął na trasie.
Żeby taki pakiet IP nie krążył w nieskończoność, w nagłówkach protokołów IPv4 /
IPv6 jest pole TTL / hop limit. Kiedy router przekazuje przez jeden interfejs
pakiet otrzymany wcześniej na innym interfejsie, to zmniejsza o jeden wartość
tego pola. Kiedy wartość TTL / hop limitu spadnie do 0, pakiet nie jest dalej
przekazywany.
Zadanie 12
Wykonaj z PC1 ping -c1 10.3.4.4 oraz ping -c1 fd00:3:4::4 i zobacz jak
zmienia się wartość TTL / hop limit na kolejnych komputerach.
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 IPv4 (ICMP) i dla 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)
Zadanie 13 Uruchom nasłuchiwanie programem wireshark na interfejsie br0.
Następnie zobacz jakie pakiety protokołu ICMP pojawią się przy próbie wykonania polecenia:
ping -c1 1.1.1.1ping -c3 150.254.32.180ping -c3 2001:808:201:101::2socat shell:echo udp-sendto:150.254.32.65:13traceroute -nTN 1 -q 1 man.poznan.pl