# 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


`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`

* 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`

`Vi$> ip route`
`V1$> ping -c 2 192.168.1.2`
`V1$> ping -c 2 192.168.4.4`
## Tutorial #1

`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`

`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.

`V1$> traceroute 192.168.2.3`

`Vi$> sudo ip route del default`
`Vi$> ip route`
## Tutorial #2


`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`

`Vi$> sudo vtysh`
`virbian# show ip route`

`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`
:::

`virbian(config-router)# end`
`virbian# show running-config`

Pakiety porotokoły OSPF są osadzone w pakietach IP.

`virbian# show ip route`
`Vi$> ip route`

`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`

`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`

`Vi$> sudo vtysh`
`virbian# configure terminal`
`virbian(config)# router ospf`
`virbian(config-router)# network 172.16.0.0/16 area 0`
`Vi$> ip route`

`Vi$> sudo systemctl stop ospfd`
## Wyzwanie

* 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

`V0$> startx`
`V0$> sudo ip link set enp0s3 name enp0`
`V0$> sudo ip link set up dev enp0`
## Tutorial #1

`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

`V0$> sudo dhclient -r enp0`

`V0$> sudo ip link set down dev enp0`
## Tutorial #2

`V1/2$> sudo ip link set enp0s3 name enp0`

`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`

`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.

`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

Tablica ARP - do IP przypisany jest adres MAC
`V1/2$> ip neigh`
`V1/2$> sudo ip neigh flush all`

`V1$> ping -c 2 192.168.0.2`
status zmienia się z STALE (nieświeży) na REACHABLE

* 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

`V1$> ping 192.168.0.2`

`V2$> sudo ip addr del 192.168.0.2/24 dev enp0 && sudo ip addr add 192.168.0.123/24 dev enp0`

* 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.

`V1/2$> sudo ip addr flush enp0`
## Wyzwanie



`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`

* 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

`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.

* 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.

# Warsztaty 6

`V0$> sudo ip link set enp0s3 name enp0`
`V0$> sudo ip link set up dev enp0`
`V0$> sudo dhclient -v enp0`
## Tutorial #1

`V0$> dig www.debian.org`
130.89.148.77

`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/`

* 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

`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

`V0$> dig +trace www.cs.uni.wroc.pl @198.41.0.4`

`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

`V0$> dig -t ptr 11.4.17.156.in-addr.arpa` -> ii.uni.wroc.pl
## Tutorial 3

`V0$> nc -u -l -p 10053`
`V0$> dig -p 10053 www.wikipedia.pl @127.0.0.1 +tries=1`

`V0$> nc -u -l -p 10053 | tee dns_request`
`V0$> hexdump -C dns_request`

`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ą