# SIECI Warsztaty 4-6 ###### tags: `Sieci` ### [-> Ćwiczenia 1-3 <-](https://hackmd.io/@lorakis/sieci2k21c1-3) ### [-> Warsztaty 1-3 <-](https://hackmd.io/@lorakis/sieci2k21w1-3) ### [-> Warsztaty 7-9 <-](https://hackmd.io/@lorakis/sieci2k21w7-9) # Warsztaty 4 ![](https://i.imgur.com/xFFHi8N.png) ![](https://i.imgur.com/293fhvp.png) `Vi$> startx` `V1$> sudo ip link set enp0s3 name enp-rem1 & sudo ip link set enp0s8 name enp-rem4 & sudo ip link set enp0s9 name enp-all` `V2$> sudo ip link set enp0s3 name enp-rem1 & sudo ip link set enp0s8 name enp-rem2 & sudo ip link set enp0s9 name enp-all` `V3$> sudo ip link set enp0s3 name enp-rem2 & sudo ip link set enp0s8 name enp-rem3 & sudo ip link set enp0s9 name enp-all` `V4$> sudo ip link set enp0s3 name enp-rem3 & sudo ip link set enp0s8 name enp-rem4 & sudo ip link set enp0s9 name enp-all` ![](https://i.imgur.com/p7R0548.png) * aktywacja: `V1$> sudo ip link set up dev enp-rem1 & sudo ip link set up dev enp-rem4` `V2$> sudo ip link set up dev enp-rem1 & sudo ip link set up dev enp-rem2` `V3$> sudo ip link set up dev enp-rem2 & sudo ip link set up dev enp-rem3` `V4$> sudo ip link set up dev enp-rem3 & sudo ip link set up dev enp-rem4` * przypisanie ip: `V1$> sudo ip addr add 192.168.1.1/24 dev enp-rem1 & sudo ip addr add 192.168.4.1/24 dev enp-rem4` `V2$> sudo ip addr add 192.168.1.2/24 dev enp-rem1 & sudo ip addr add 192.168.2.2/24 dev enp-rem2` `V3$> sudo ip addr add 192.168.2.3/24 dev enp-rem2 & sudo ip addr add 192.168.3.3/24 dev enp-rem3` `V4$> sudo ip addr add 192.168.3.4/24 dev enp-rem3 & sudo ip addr add 192.168.4.4/24 dev enp-rem4` ![](https://i.imgur.com/bg8NmRR.png) `Vi$> ip route` `V1$> ping -c 2 192.168.1.2` `V1$> ping -c 2 192.168.4.4` ## Tutorial #1 ![](https://i.imgur.com/89bRiPx.png) `V1$> sudo ip route add default via 192.168.1.2` `V2$> sudo ip route add default via 192.168.2.3` `V3$> sudo ip route add default via 192.168.3.4` `V4$> sudo ip route add default via 192.168.4.1` `Vi$> ip route` ![](https://i.imgur.com/Gw7eI99.png) `V1$> ping -c 2 192.168.3.4` `V2$> ping -c 2 192.168.2.3` `V3$> ping -c 2 192.168.1.2` `V4$> ping -c 2 192.168.4.1` Jeśli pingujemy połączone ze sobą bezpośrednio maszyny, to nie będzie żadnego cyklu. ![](https://i.imgur.com/7m2TSuq.png) `V1$> traceroute 192.168.2.3` ![](https://i.imgur.com/M8mtGoF.png) `Vi$> sudo ip route del default` `Vi$> ip route` ## Tutorial #2 ![](https://i.imgur.com/U15ZhKl.png) ![](https://i.imgur.com/SQHmuX1.png) `Vi$> sudo touch /etc/quagga/ospfd.conf && sudo touch /etc/quagga/zebra.conf && sudo touch /etc/quagga/vtysh.conf && sleep 1 && sudo systemctl start ospfd` `Vi$> systemctl status ospfd` ![](https://i.imgur.com/2a1IOJo.png) `Vi$> sudo vtysh` `virbian# show ip route` ![](https://i.imgur.com/EpYmvty.png) `virbian# configure terminal` `virbian(config)# router ospf` `virbian1(config-router)# network 192.168.1.0/24 area 0` `virbian1(config-router)# network 192.168.4.0/24 area 0` `virbian2(config-router)# network 192.168.1.0/24 area 0` `virbian2(config-router)# network 192.168.2.0/24 area 0` `virbian3(config-router)# network 192.168.2.0/24 area 0` `virbian3(config-router)# network 192.168.3.0/24 area 0` `virbian4(config-router)# network 192.168.3.0/24 area 0` `virbian4(config-router)# network 192.168.4.0/24 area 0` :::danger `virbian(config-router)# no network adres_sieci area 0` ::: ![](https://i.imgur.com/lFj0nSv.png) `virbian(config-router)# end` `virbian# show running-config` ![](https://i.imgur.com/C1jCmZ5.png) Pakiety porotokoły OSPF są osadzone w pakietach IP. ![](https://i.imgur.com/HpYM5bF.png) `virbian# show ip route` `Vi$> ip route` ![](https://i.imgur.com/Ki9wlJY.png) `V1$> ping -c 2 192.168.2.3` `V1$> ping -c 2 192.168.4.4` `V2$> ping -c 2 192.168.1.1` `V3$> ping -c 2 192.168.3.4` `V3$> ping -c 2 192.168.4.4` `V3$> ping -c 2 192.168.1.1` `V4$> ping -c 2 192.168.2.3` `V1$> traceroute 192.168.2.2` `V1$> traceroute 192.168.3.4` ![](https://i.imgur.com/pFkt7KS.png) `Vi$> sudo ip link set up dev enp-all` `V1$> sudo ip addr add 172.16.16.1/24 dev enp-all` `V2$> sudo ip addr add 172.16.16.2/24 dev enp-all` `V3$> sudo ip addr add 172.16.16.3/24 dev enp-all` `V4$> sudo ip addr add 172.16.16.4/24 dev enp-all` ![](https://i.imgur.com/0pJszma.png) `Vi$> sudo vtysh` `virbian# configure terminal` `virbian(config)# router ospf` `virbian(config-router)# network 172.16.0.0/16 area 0` `Vi$> ip route` ![](https://i.imgur.com/p7OVCmn.png) `Vi$> sudo systemctl stop ospfd` ## Wyzwanie ![](https://i.imgur.com/H2VowU4.png) * Skonfiguruj 4 maszyny wirtualne *Virbian1* – *Virbian4*, tak aby korzystały z sieci **local0** i **local1**, tak jak zaznaczono na rysunku powyżej. Nazwij ich interfejsy tak jak na rysunku (**enp0**, **enp1** i **enp-out**). `V1$> sudo ip link set enp0s3 name enp0` `V2$> sudo ip link set enp0s3 name enp0` `V3$> sudo ip link set enp0s3 name enp0 & sudo ip link set enp0s8 name enp1` `V4$> sudo ip link set enp0s3 name enp-out` `V1$> sudo ip link set up dev enp0` `V2$> sudo ip link set up dev enp0` `V3$> sudo ip link set up dev enp0 & sudo ip link set up dev enp1` `V4$> sudo ip link set up dev enp-out` * Przypisz trzem interfejsom podłączonym do wirtualnej sieci local0 adresy z sieci $192.168.1.0/24$ takie jak na rysunku. Przypisz dwóm interfejsom podłączonym do wirtualnej sieci **local1** adresy z sieci $192.168.2.0/24$ takie jak na rysunku. `V1$> sudo ip addr add 192.168.1.1/24 dev enp0` `V2$> sudo ip addr add 192.168.1.2/24 dev enp0` `V3$> sudo ip addr add 192.168.1.3/24 dev enp0 && sudo ip addr add 192.168.2.1/24 dev enp1` `V4$> sudo ip addr add 192.168.2.2/24 dev enp-out` * Poleceniem ping sprawdź wzajemną osiągalność maszyn podłączonych do tej samej sieci **local0** i maszyn podłączonych do tej samej sieci **local1**. `V1$> ping -c 2 192.168.1.2` `V1$> ping -c 2 192.168.1.3` `V3$> ping -c 2 192.168.2.2` `V4$> ping -c 2 192.168.2.1` * Na maszynach *Virbian1, Virbian2 i Virbian4* dodaj trasy domyślne, które na rysunku powyżej zaznaczone są przerywanymi strzałkami. Przykładowo trasa domyślna z maszyny *Virbian2* powinna prowadzić przez adres $192.168.1.3$. `V1$> sudo ip route add default via 192.168.1.2` `V2$> sudo ip route add default via 192.168.1.3` `V4$> sudo ip route add default via 192.168.2.1` * Włącz Wiresharka na wszystkich maszynach. Następnie z maszyny *Virbian1* pingnij maszynę *Virbian4*. `V1$> ping -c 2 192.168.2.2` Zaobserwuj, że maszyna jest osiągalna, ale oprócz komunikatów ICMP reply maszyna *Virbian1* otrzymuje również komunikaty ICMP redirect. Są one wysyłane przez maszynę *Virbian2* i informują o tym, że routing na maszynie *Virbian1* jest prawdopodobnie źle skonfigurowany. Odpowiedz na następujące pytania: * Jaka jest sugerowana przez maszynę *Virbian2* modyfikacja tablicy routingu na maszynie *Virbian1*? :::info V2 sugeruje zmiane defaulta na V3 ::: * Dlaczego taka zmiana ma sens? :::info Bo jest krótsza trasa. ::: * W jaki sposób maszyna *Virbian2* mogła wykryć powyższy problem? :::info Powrota trasa nie przechodzi przez nią. ::: # Warsztaty 5 ![](https://i.imgur.com/snvG9mM.png) `V0$> startx` `V0$> sudo ip link set enp0s3 name enp0` `V0$> sudo ip link set up dev enp0` ## Tutorial #1 ![](https://i.imgur.com/WQj6HEf.png) `V0$> sudo dhclient enp0` * Jakie komunikaty? - DHCP Request i DHCP ACK * Jaki jest źródłowy adres? - nie ma jeszcze przydzielonego IP, więc 0.0.0.0 ![](https://i.imgur.com/Nn9Bnmi.png) `V0$> sudo dhclient -r enp0` ![](https://i.imgur.com/AAa16kK.png) `V0$> sudo ip link set down dev enp0` ## Tutorial #2 ![](https://i.imgur.com/Aunt9gm.png) `V1/2$> sudo ip link set enp0s3 name enp0` ![](https://i.imgur.com/61EhLfY.png) `V1/2$> sudo ip link set up dev enp0` `V1$> sudo ip addr add 192.168.0.1/24 dev enp0` `V2$> sudo ip addr add 192.168.0.2/24 dev enp0` ![](https://i.imgur.com/pfQFntf.png) `V1/2$> ip link` `V1$> ping -c 2 192.168.0.2` * Adresy ramek ethernetowych pokrywają się z adresami MAC maszyn wirtualnych. * Są tam adresy IP maszyn. ![](https://i.imgur.com/1mHgabQ.png) `V1$> ping -bc 2 192.168.0.255` * W destination jest ff:ff:ff:ff:ff, a w source jest MAC Virbian1 * W destination jest 192.168.0.255, a w source jest IP Virbian1 ![](https://i.imgur.com/9diQgyK.png) Tablica ARP - do IP przypisany jest adres MAC `V1/2$> ip neigh` `V1/2$> sudo ip neigh flush all` ![](https://i.imgur.com/pVT9wMY.png) `V1$> ping -c 2 192.168.0.2` status zmienia się z STALE (nieświeży) na REACHABLE ![](https://i.imgur.com/RHy3Lam.png) * Jest tylko ramaka ethernet, nie ma ramki IP. Jest tam source(MAC Virbian1), oraz destination(brodcast sieci) * Na adres rozgłoszeniowy. * Do konkretnego kompa. ## Tutorial #3 ![](https://i.imgur.com/xj6NVNr.png) `V1$> ping 192.168.0.2` ![](https://i.imgur.com/zePpCrI.png) `V2$> sudo ip addr del 192.168.0.2/24 dev enp0 && sudo ip addr add 192.168.0.123/24 dev enp0` ![](https://i.imgur.com/IDdlPfI.png) * Virbian1 próbuje spingować 192.168.0.2, ale nie udaje mu się to. Brodcast nie odpowiada, kim jest 192.168.0.2, więc Virbian1 wie, że 192.168.0.2 jest nieosiągalny. ![](https://i.imgur.com/7W4WNdf.png) `V1/2$> sudo ip addr flush enp0` ## Wyzwanie ![](https://i.imgur.com/qO3rTnu.png) ![](https://i.imgur.com/Gb11MRy.png) ![](https://i.imgur.com/4vpscDv.png) `V3/4$> sudo ip link set enp0s3 name enp0` `V3/4$> sudo ip link set up dev enp0` `V1$> sudo ip addr add 192.168.1.1/24 dev enp0` `V2$> sudo ip addr add 192.168.1.2/25 dev enp0` `V3$> sudo ip addr add 192.168.1.129/24 dev enp0` `V4$> sudo ip addr add 192.168.1.130/25 dev enp0` ![](https://i.imgur.com/4qcX9vf.png) * V1: * 192.168.1.0/24 - adres sieci * 192.168.1.255 - broadcast * HostMin: 192.168.1.1 * HostMax: 192.168.1.254 * V2: * 192.168.1.0/25 - adres sieci * 192.168.1.127 - broadcast * HostMin: 192.168.1.1 * HostMax: 192.168.1.126 * V3: * 192.168.1.0/24 - adres sieci * 192.168.1.255 - broadcast * HostMin: 192.168.1.1 * HostMax: 192.168.1.254 * V4: * 192.168.1.128/25 - adres sieci * 192.168.1.255 - broadcast * HostMin: 192.168.1.129 * HostMax: 192.168.1.254 ![](https://i.imgur.com/gBV7YsB.png) `V1$> ping -bc 1 192.168.1.255` * Które maszyny otrzymały komunikat *ICMP echo request*? Które nie otrzymały i dlaczego? * Które maszyny wysłały w odpowiedzi komunikat *ICMP echo reply*? Które nie wysłały i dlaczego? * Które odpowiedzi dotarły do maszyny *Virbian1*? Które nie dotarły i dlaczego? Request otrzymały wszyskie Virbiany, ale odpowiedział tylko Virbian3, ponieważ tylko on jest w tej samej sieci co Virbian1. Virbian2 oraz Virbian4 otrzymuje request ale nie odpowiada na nie. Dotarły tylko te odpowiedzi które mają taki sam adres rozgłoszeniowy. IP Virbian1 nie jest w zakresie sieci Virbian4. ![](https://i.imgur.com/93iphS9.png) * V2 `V2$> ping -bc 1 192.168.1.127` Na wszystkich wyskakuje echo request, a na żadnej echo reply. Stało się tak ponieważ żadna z maszyn nie ma takiego samego adresu rozgłoszeniowego co Virbian2. * V3 `V3$> ping -bc 1 192.168.1.255` Wszystkie maszyny wykazały obecność echo request. Virbian1 oraz Virbian4 odopowiedział na zapytanie, ponieważ mają taki sam adres rozgłoszeniowy. Virbian 2 nie odpowiedział, bo ma inny adres rozgłoszeniowy. * V4 `V4$> ping -bc 1 192.168.1.127` Wszystkie maszyny otrzymały echo request. Ale nie odpowiedział Virbian2 ponieważ jego zakres nie obejmuje Virbian4. ![](https://i.imgur.com/mTE3iaX.png) # Warsztaty 6 ![](https://i.imgur.com/hex21hz.png) `V0$> sudo ip link set enp0s3 name enp0` `V0$> sudo ip link set up dev enp0` `V0$> sudo dhclient -v enp0` ## Tutorial #1 ![](https://i.imgur.com/ff4idtt.png) `V0$> dig www.debian.org` 130.89.148.77 ![](https://i.imgur.com/4E0heXs.png) `V0$> (while true; do netstat -tan | grep 130.89.148.77; done) | tee tcp_log` `V0$> wget http://130.89.148.77/` `V0$> trickle -d 10 wget http://130.89.148.77/` ![](https://i.imgur.com/lC5wW3j.png) * Jakie gniazda tworzone są do popbierania pliku przez HTTP? Jaki jest port źródłowy a jaki docelowy połączenia? Source Port: 80 Destination Port: 36912 Gniazda połączone. Są opisane między innymi przez lokalny IP, lokalny port, zdalny IP, zdalny port. Port serwera to 80, jest dobrze znany. U mnie system przydzielił port 42496, został losowo przydzielony, nie jest dobrze znany * Jakie z flag SYN / ACK / FIN są włączone dla danego segmentu? Które bajty (strumienia danych protokołu HTTP) są przesyłane w segmencie? Które bajty strumienia danych są potwierdzane danym segmentem? Na podstawie diagramu stanów TCP (https://en.wikipedia.org/wiki/File:Tcp_state_diagram.png), sprawdź jak zmienia się stan połączenia TCP (po stronie klienta i po stronie serwera) w momencie wysłania i odebrania danego segmentu. Pierwsze 3 segmenty to trójfazowe nawiązywanie połączenia. Na diagramie TCP z linku są to stany nad ESTABLISHED. Klient wysyła [SYN], dostaje [SYN, ACK] i odpowiada [ACK]. Nie ma tu wymiany danych przez HTTP. Teraz połączenie jest nawiązane. Na diagramie stanów TCP z linku jest to stan ESTABLISHED na zielonym tle. Kolejne segmenty to pobranie strony, po kolei: 4. Wysłanie żądanie GET pod wskazany adres IP, by pobrać stronę. Komunikacja HTTP. 5. Odpowiedź serwera [ACK], że otrzymał żądanie GET. 6. Otrzymanie strony w HTML od serwera. Komunikacja HTTP. 7. Wysłanie serwerowi potwierdzenia otrzymania strony [ACK]. Teraz następuje czterofazowe kończenie połączenia. Na diagramie TCP z linku są to stany pod ESTABLISHED w ramkach Active Close i Passive Close. Klient wysyła [FIN, ACK], Serwer odpowiada [ACK] oraz w drugim segmencie [ACK, FIN]. Klient teraz przechodzi w stan TIME WAIT. Wysyła serwerowi [ACK] otrzymania poprzednich flag. * Które z tych stanów są widoczne w pliku tcp log? W pliku tcp_log są widoczne stany z diagramu TCP: TIME_WAIT, SYN_SENT, ESTABILISHED, FIN_WAIT2. * Która strona wykonuje otwarcie aktywne, a która zamknięcie aktywne? Klient wykonuje otwarcie aktywne i zamknięcie aktywne. To on pierwszy wysyła segmenty do serwera. ## Tutorial 2 ![](https://i.imgur.com/UMMMWdW.png) `V0$> dig www.cs.uni.wroc.pl @198.41.0.4` -> pierwsze `V0$> dig www.cs.uni.wroc.pl @194.181.87.156` -> przez sfera pl `V0$> dig www.cs.uni.wroc.pl @156.17.254.3` -> wroc.pl `V0$> dig www.cs.uni.wroc.pl @156.17.93.253` -> przez uni.wroc.pl 156.17.93.253 -> cs.uni.wroc.pl ![](https://i.imgur.com/k6mmkni.png) `V0$> dig +trace www.cs.uni.wroc.pl @198.41.0.4` ![](https://i.imgur.com/VIGdLiW.png) `V0$> dig -t a ii.uni.wroc.pl` -> adres IP `V0$> dig -t ns ii.uni.wroc.pl` -> serwer nazw `V0$> dig -t mx ii.uni.wroc.pl` -> serwer obsługujący poczte ![](https://i.imgur.com/e6q5DTn.png) `V0$> dig -t ptr 11.4.17.156.in-addr.arpa` -> ii.uni.wroc.pl ## Tutorial 3 ![](https://i.imgur.com/kvYYOCd.png) `V0$> nc -u -l -p 10053` `V0$> dig -p 10053 www.wikipedia.pl @127.0.0.1 +tries=1` ![](https://i.imgur.com/pNMXFrx.png) `V0$> nc -u -l -p 10053 | tee dns_request` `V0$> hexdump -C dns_request` ![](https://i.imgur.com/KP3GV85.png) `V0$> nc -q 1 -u 8.8.8.8 53 < dns_request` ## Wyzwanie #1 * Uruchom usługę serwera WWW wyświetlającego prostą stronę służącą do dodawania wpisów uruchamiając polecenie `V0$> sudo systemctl start hydepark` * Wejdź przeglądarką na stronę http://virbian:8080/ i wykorzystując rozszerzenie przeglądarki HTTP Header Live sprawdź, co dzieje się, kiedy dodajesz jakiś wpis. Pojawiają się nowe rządania: 1. do http://virbian:8080/add POST: HTTP/1.0 302 FOUND z content=twója_treść 2. do http://virbian:8080/ POST: HTTP/1.0 200 OK 3. do virbian:8080/favicon.ico GET: HTTP/1.0 404 NOT FOUND * Uruchom program *nc* w trybie serwera TCP nasłuchującego na porcie 8888 poleceniem `V0$> nc -l -p 8888 | tee http_request` * Z menu przeglądarki wybierz pozycję Edit | Preferences, wyszukaj w opcjach Network settings i w okienku Connection Settings wybierz Manual proxy configuration. Następnie w polu HTTP proxy wpisz localhost, a w sąsiednim polu Port wpisz 8888. * Na stronie http://virbian:8080/ wpisz jakąś treść w polu „Dodaj jakiś komunikat” i kliknij przycisk „Wyślij”. Dlaczego przeglądarka wyświetla w pasku stanu komunikat Waiting for virbian, a odpowiedni wpis nie został dodany? Ponieważ server proxy jest nieznany. * Przerwij działanie programu nc. Co zapisał ten program do pliku http request? Wyłącz ustawienia serwera proxy w przeglądarce. Zapsiał rządanie do http://virbian:8080/add * Wyślij zapisane zapytanie do serwera WWW poleceniem `V0$> nc -q 3 virbian 8080 < http_request` i sprawdź przeglądarką, czy odpowiedni komunikat został dodany na stronie WWW `V0$> nc -q 3 virbian 8080 < http_request` * Zmień zawartość pliku http request, wpisując inny komunikat do umieszczenia na stronie. Odpowiednio zmodyfikuj pole Content-Length. Ponownie wyślij zapytanie do serwera WWW i upewnij się, że komunikat został dodany na stronie. Można wpisać content=ppp i lenght=11 * Zakończ działanie serwera WWW poleceniem `V0#> systemctl stop hydepark` Dezaktywuj kartę enp0 poleceniem ip link i wyłącz maszynę wirtualną