A B C D

192.168.8.17 192.168.8.18 192.168.8.3 192.168.8.4

10.0.0.33 10.0.0.34 10.0.0.5 10.0.0.6

RETE p-p: 10.0.0.32 RETE p-p: 10.0.0.4

ESERCITAZIONE 1
Parte 1: IP FORWARDING A si stacca dalla rete 192.168.8.0: A: sudo ifconfig eth1 down B deve abilitare l’IP forwarding B: sudo sysctl –w net.ipv4.ip_forward=1 B deve diventare il default gateway di A in modo da reindirizzare i pacchetti verso C. A tal fine, l’host A imposta una nuova entry nella propria tabella. A: sudo route add –net 192.168.8.0 netmask 255.255.255.0 gw 10.0.0.34 dev eth0 –net 192.168.8.0 vogliamo raggiungere la rete (net) 192.168.8.0 gw 10.0.0.34 il gateway (B) dev’essere raggiunto con la rete punto-punto dev eth0 la rete punto-punto è appannaggio dell’interfaccia eth0 C vuole rispondere a 10.0.0.33 ma non sa come trovarlo, quindi dovrà trovare il modo di spedirlo a B per potervi accedere. C: sudo route add –host 10.0.0.33 gw 192.168.8.18 dev eth1 –host 10.0.0.33 vogliamo raggiungere l’host 10.0.0.33 gw 192.168.8.18 il gateway è B dev eth1 questa volta dobbiamo affidarci alla eth1 Parte 2: IP forwarding fra 2 (intere) reti IP A B C D C A B

C abilita il forwarding perché dovrà comunicare con D e instradargli i pacchetti verso A e B. C: sudo sysctl –w net.ipv4.ip_forward=1 D manda giù eth1 (è isolato rispetto alla rete “grande”) e aggiunge due entry nella route table, l’una per poter pingare B e l’altra per raggiungere A. D: sudo ifconfig eth1 down D: sudo route add –net 192.168.8.0 netmask 255.255.255.0 gw 10.0.0.5 dev eth0 –net 192.168.8.0 per raggiungere un qualsiasi PC della rete grande (ad esempio B) gw 10.0.0.5 D vuole usare C dev eth0 e per farlo usa l’interfaccia eth0 (collegamento p-p)

D: sudo route add –net 10.0.0.32 netmask 255.255.255.252 gw 10.0.0.5 dev eth0 –net 10.0.0.32 per raggiungere un qualsiasi PC della rete piccola (B, oppure A) gw 10.0.0.5 D vuole usare C dev eth0 e per farlo usa l’interfaccia eth0 (collegamento p-p) B trova il modo di collegarsi a D (o, meglio, alla rete di D) utilizzando C come gateway B: sudo route add –net 10.0.0.4 gw 192.168.8.3 dev eth1 –net 10.0.0.4 per raggiungere un qualsiasi PC della rete piccola (C, oppure D) gw 192.168.8.3 B vuole usare C dev eth0 e per farlo usa l’interfaccia eth0 (collegamento p-p) Ora D può essere potenzialmente in connessione con qualsiasi PC, tramite C. A mantiene il collegamento verso la rete globale (e quindi può contattare C) (A: sudo route add –net 192.168.8.0 netmask 255.255.255.0 gw 10.0.0.34 dev eth0) ma in più deve poter contattare D: A: sudo route add –net 10.0.0.4 netmask 255.255.255.252 gw 10.0.0.34 dev eth0 –net 10.0.0.4 A vuole raggiungere la rete (net) 10.0.0.4 gw 10.0.0.34 il gateway (B) dev’essere raggiunto con la rete punto-punto dev eth0 che è appannaggio dell’interfaccia eth0 Ora la connettività è completa. Parte 3: proxy-ARP C vuole sapere il MAC di A con l’illusione che quest’ultimo faccia parte della sua rete (altrimenti non si potrebbe fare l’ARP). In realtà è B, punto di riferimento per l’instradamento, che darà il MAC a C cosicché, se quest’ultimo vuole parlare con A, passerà attraverso B! C A B

B deve abilitare l’IP forwarding B: sudo sysctl –w net.ipv4.ip_forward=1 B deve sostituire fare aliasing perché si richiede di contattarlo presso le 192.168.8.x/30 (reti piccoline di 2 PC sulle 192.168.8.x). B: sudo ifconfig eth0 192.168.8.201 netmask 255.255.255.252 broadcast 192.168.8.203 eth0 il nuovo indirizzo fa riferimento all’interfaccia eth0 192.168.8.201 ecco il nuovo indirizzo di B broadcast 192.168.8.203 ecco qual è l’indirizzo di broadcast della nuova rete inventata apposta per B L’host A deve fare lo stesso e darsi il .202, ovvero l’altro indirizzo disponibile della rete piccolina:

A: sudo ifconfig eth0 192.168.8.202 netmask 255.255.255.252 broadcast 192.168.8.203 eth0 il nuovo indirizzo fa riferimento all’interfaccia eth0 192.168.8.202 ecco il nuovo indirizzo di A broadcast 192.168.8.203 indirizzo di broadcast della nuova rete “inventata” per A e B In più, A butta giù la eth1, perché non deve essere direttamente in collegamento con C: A: sudo ifconfig eth1 down Dopodiché, B aggiunge una voce di proxy-ARP: B: sudo arp –I eth1 –s 192.168.8.202 –D eth1 pub arp voce di proxy-ARP –I eth1 eth1 è l’interfaccia da cui arrivano le richieste –s 192.168.8.202 l’indirizzo richiesto da chi vuole effettuare il proxy-arp (B risponderà col suo MAC quando qualcuno gli chiederà di 192.168.8.202) –D eth1 eth1 è l’interfaccia su cui rispondere alle richieste pub rende la cosa “pubblica” Con questa stringa B risponde con il suo MAC a chi chiede il MAC di A. C a questo punto fa il suo dovere: C: arping –I eth1 192.168.8.202 E tutto funziona!

A B C D

192.168.8.17 192.168.8.18 192.168.8.3 192.168.8.4

10.0.0.33 10.0.0.34 10.0.0.5 10.0.0.6

RETE p-p: 10.0.0.32 RETE p-p: 10.0.0.4

ESERCITAZIONE 2
Punto 1: visualizzare il contenuto della tabella filter di IPTABLES sudo iptables -L Punto 2. Impostare IPTABLES per scartare (DROP) i pacchetti ICMP in ingresso e verificarne il comportamento. sudo iptables –I INPUT 1 –p icmp –j DROP –I INPUT inserisci (I) per la chain riguardante i pacchetti in ingresso 1 come prima regola –p icmp per quanto riguarda il protocollo ICMP –j DROP rifiuta (drop, senza notifica) tutti i pacchetti Punto 3. Impostare IPTABLES per rifiutare (REJECT) i pacchetti ICMP in ingresso e verificarne il comportamento sudo iptables –I INPUT 1 –p icmp –j REJECT –I INPUT inserisci (I) per la chain riguardante i pacchetti in ingresso 1 come prima regola –p icmp per quanto riguarda il protocollo ICMP –j REJECT rifiuta (reject, con notifica) tutti i pacchetti Oppure, se si vuole sostituire la politica precedente: sudo iptables –R INPUT 1 –p icmp –j REJECT Punto 4. Impostare a DROP la policy di default per i pacchetti in transito e abilitare l’inoltro del traffico ssh. Verificarne il comportamento. sudo iptables –P FORWARD DROP –P imposta come politica predefinita FORWARD per i pacchetti in transito DROP il drop Eccezione per il traffico SSH (destinato alla porta 22): sudo iptables –I FORWARD -A –p tcp –-dport 22 –j ACCEPT –I FORWARD inserisci una nuova regola per la chain di forward ‒A e metti questa regola in coda –p tcp questa regola riguarda il protocollo TCP --dport 22 per i pacchetti diretti alla porta 22 (SSH) –j ACCEPT accetta questo traffico

Per impostare regime stateful: sudo iptables –I FORWARD –m state –I FORWARD –m state --state ESTABLISHED -j ACCEPT

-–state ESTABLISHED -j ACCEPT inserisci una nuova regola per la chain di forward e imponi lo stateful packet filter per i pacchetti accettati

Impostiamo l’IP forwarding per poter fare la prova: B: sudo sysctl –w net.ipv4.ip_forward=1 Ora C può passare attraverso B per fare l’SSH su A (dopo aver modificato la tabella di routing, v. esercitazioni precedenti): C: ssh nomeutente@192.168.8.17 Punto 5. Impostare ad ACCEPT la policy di default per i pacchetti in transito e bloccare l’inoltro di tutti i pacchetti TCP dalla rete 192.168.8.0/24 alla 10.0.0.x/30 tranne quelli diretti alla porta 80. Verificarne il comportamento. sudo iptables –A FORWARD –s 192.168.8.0/24 –d 10.0.0.32/30 –p tcp -dport ! 80 –j DROP –A FORWARD inserisci una regola in coda alla chain di forward –s 192.168.8.0/24 per tutti i pacchetti che giungono dalla rete 192.168.8.0 –d 10.0.0.32/30 e che sono diretti alla rete 10.0.0.32 –p tcp aventi protocollo TCP --dport ! 80 e diretti a tutte le porte tranne l’80 –j DROP imposta il drop Per provare: telnet 10.0.0.5 80 6. Visualizzare il contenuto della tabella nat di IPTABLES sudo iptables –t nat -L 7. Impostare IPTABLES per realizzare un gateway NAT utilizzando un indirizzo aggiuntivo rispetto a quello già assegnato all’interfaccia esterna. B fa aliasing per poter dare un indirizzo ad A: B: sudo ifconfig eth1: 192.168.8.202 eth1: imposta sull’interfaccia eth1 192.168.8.202 l’indirizzo 192.168.8.202 Aggiungiamo una regola per poter dare ad A l’indirizzo: B: sudo iptables –t nat –A postrouting -s 10.0.0.33 -j SNAT –to-source 192.168.8.202 –t nat specifica una regola per il NAT –A postrouting per quanto riguarda la chain postrouting (da dentro a fuori la rete) -s 10.0.0.33 e per i pacchetti che arrivano da 10.0.0.33

-j SNAT--to-source

192.168.8.202

fai source-NAT (ovvero: sostituisci l’indirizzo a un PC “mascherato” dentro una rete privata e che vuole comunicare verso l’esterno) e assegna l’indirizzo 192.168.8.202

A questo punto A può fare il ping verso l’esterno: con wireshark si può verificare che la eth1 di B “comunica” fra il .202 e il .5 (cioè C) e viceversa, mentre la eth0 fa da intermediario fra la .33 (di A) e il .5 (sempre C). 8. Impostare IPTABLES per realizzare il port forwarding verso la porta ssh di un host sulla rete interna.

C A

B

B riceve qualcosa dalla rete esterna (tipo da C) sulla porta 22, e lo interpreta inoltrandolo tutto quanto verso A (che nel frattempo ha staccato eth1). B: sudo iptables –t nat –A PREROUTING –d 192.168.8.18 –p tcp --dport 22 –j DNAT -–to-destination 10.0.0.33 -t nat specifica una regola per il NAT –A PREROUTING per quanto riguarda la chain prerouting (da fuori a dentro la rete) –d 192.168.8.18 e per tutti i pacchetti che vanno verso 192.168.8.18 (cioè B) –p tcp con protocollo TCP --dport 22 e sono diretti alla porta 22 (sempre di B) –j DNAT --to-destination fai destination-NAT (ovvero, ciò che recapiti alla porta 22 va consegnato ad un PC che sta nella rete privata) 10.0.0.33 il PC al quale devi consegnare tutto è A (10.0.0.33) Se C vuole effettuare l’SSH su A (con B che fa il NAT): C: ssh [nome utente A]@192.168.8.18 Punto 9 A B C D 192.168.8.17 192.168.8.18 192.168.8.3 192.168.8.4 10.0.0.33 10.0.0.34 10.0.0.5 10.0.0.6 RETE p-p: 10.0.0.32 RETE p-p: 10.0.0.4

Realizzare la seguente configurazione: • B esegue NAT (considerare la rete 10.0.0.x/30 come privata) • C è un semplice gateway provvisto di firewall che o permette l’inoltro di traffico ICMP bidirezionale o permette l’inoltro di traffico HTTP, HTTPS, SSH, DNS solo da client appartenenti alla rete 10.0.0.y/30

o scarta tutto il resto • deve essere possibile connettersi da D e C via SSH a A e B contemporaneamente (4 connessioni contemporanee) Per le verifiche usare, oltre a ping e SSH: • telnet <indirizzo> <num_porta> per aprire connessioni TCP • uplog –f –p <num_porta> <indirizzo> per generare pacchetti UDP

A modifica il default gateway e imposta B per andare ovunque. A: sudo route add default gw 10.0.0.34 A disabilita eth1, tanto non gli serve. A: sudo ifconfig eth1 down D fa la stessa cosa e imposta come C default gateway. D: sudo ifconfig eth1 down D: sudo route add default gw 10.0.0.35 B e C abilitano il forwarding. B aggiunge nella tabella di routing: B: sudo route add –net 10.0.0.4 netmask 255.255.255.252 gw 192.168.8.3 dev eth1 Ovvero: B (oppure A, attraverso B) è costretto ad utilizzare C per raggiungere la rete privata di C e D. Facciamo la stessa cosa ma anche nel senso inverso C: sudo route add –net 10.0.0.32 netmask 255.255.255.252 gw 192.168.8.18 dev eth1 Ovvero: C (oppure D, attraverso C) è costretto ad utilizzare B per raggiungere la rete private di A e B. A questo punto abbiamo risolto il problema connettività e i 4 PC possono comunicare come indicato in figura. Concentriamoci ora sul NAT. B deve crearsi un indirizzo nuovo con l’alias B: sudo ifconfig eth1:0 192.168.8.100 Dopodiché si devono specificare le istruzioni per il NAT, in modo da sapere come si sostituiscono gli indirizzi: B: sudo iptables –t nat –A POSTROUTING –s 10.0.0.33 –j SNAT --to-source 192.168.8.100 –t nat specifica una regola per il NAT –A postrouting per quanto riguarda la chain postrouting (da dentro a fuori la rete) -s 10.0.0.33 e per i pacchetti che arrivano da 10.0.0.33 -j SNAT--to-source fai source-NAT (ovvero: sostituisci l’indirizzo a un PC “mascherato” dentro una rete privata e che vuole comunicare verso l’esterno) 192.168.8.100 e assegna l’indirizzo 192.168.8. 100

B: sudo iptables –t nat –A PREROUTING –d 192.168.8.100 –j DNAT --todestination 10.0.0.33 -t nat specifica una regola per il NAT –A PREROUTING per quanto riguarda la chain prerouting (da fuori a dentro la rete) –d 192.168.8.100 e per tutti i pacchetti che vengono mandati a 192.168.8.100 –j DNAT --to-destination fai destination-NAT 10.0.0.33 il PC al quale devi consegnare tutto è A (10.0.0.33) C è un semplice gateway provvisto di firewall. Di default imposta una policy drop: C: sudo iptables -P FORWARD DROP Fatto questo, C imposta le eccezioni: • (ICMP bidirezionale) C: sudo iptables –A FORWARD –p icmp –j ACCEPT • (regola per HTTP provenienti dalla rete di C e D) C: sudo iptables –A FORWARD -s 10.0.0.4/30 –p tcp --dport 80 -j ACCEPT • (regola per l’SSH) C: sudo iptables –A FORWARD -s 10.0.0.4/30 –p tcp --dport 22 -j ACCEPT • (regola per l’HTTPS) C: sudo iptables –A FORWARD -s 10.0.0.4/30 –p tcp --dport 443 -j ACCEPT • (regola per il DNS) C: sudo iptables –A FORWARD -s 10.0.0.4/30 –p udp --dport 53 -j ACCEPT D ora può comunicare con l’esterno, ma non riceve risposta perché dobbiamo impostare lo stateful. C: sudo iptables -I FORWARD 1 -m state --state ESTABLISHED -j ACCEPT A questo punto l’esercizio è risolto!

A B C D

192.168.8.17 192.168.8.18 192.168.8.3 192.168.8.4

10.0.0.33 10.0.0.34 10.0.0.5 10.0.0.6

RETE p-p: 10.0.0.32 RETE p-p: 10.0.0.4

ESERCITAZIONE 3
Impostare il tagging 802.1Q sulle interfacce punto-punto di due host scegliendo un VLAN ID tra 2 e 254. Assegnare alle sub-interfacce appena create un IP della rete 172.16.X.0/24, dove X = VLAN ID: • verificare la connettività tra i due host • analizzare il traffico tra i due host sia sull’interfaccia principale che sulla sub-interfaccia Anzitutto dobbiamo creare la LAN, in due passi: prima creiamo le sub-interfacce, dopodiché vi assegniamo gli indirizzi IP. A: sudo vconfig add eth0 200 B: sudo vconfig add eth0 200 A: sudo ifconfig eth0.200 up B: sudo ifconfig eth0.200 up A: sudo ifconfig eth0.200 172.16.200.2/24 B: sudo ifconfig eth0.200 172.16.200.1/24 Ora il ping funziona su tutte le interfacce! Eliminare la sub-interfaccia da uno degli host e assegnare il suo IP ad un alias dell’interfaccia punto-punto: • verificare la perdita di connettività e analizzare il traffico Eliminiamo la sub-interfaccia: B: sudo vconfig rem eth0.200 Assegniamo l’IP ad un alias di eth0, che è l’interfaccia p-p. B: sudo ifconfig eth0 172.16.200.1/24 A questo punto, facendo opportuni tentativi, ci accorgiamo che la perdita di connettività è totale!

A B C D

192.168.8.17 192.168.8.18 192.168.8.3 192.168.8.4

10.0.0.33 10.0.0.34 10.0.0.5 10.0.0.6

RETE p-p: 10.0.0.32 RETE p-p: 10.0.0.4

ESERCITAZIONE 4

ipsec newhostkey --bits 512 --output /home/[nometente]/Desktop/chiave512 ipsec newhostkey --bits 2048 --output /home/[nometente]/Desktop/chiave2048

La chiave a 2048 bit è chiaramente più difficile da creare, dunque il calcolatore impiega più tempo per farlo.

A

B

C

D

Usiamo una chiave a 512 bit (dovranno crearla B e C): sudo ipsec newhostkey --bits 1024 --output /etc/ipsec.secrets Per visualizzare le chiavi basta digitare: sudo ipsec showhostkey --left (sul terminale left, B) sudo ipsec showhostkey --right (sul terminale right, C) A e D abbattono le interfacce eth1: sudo ifconfig eth1 down B e C vanno ad aprire /etc/ipsec.conf Modifiche di B al file (come pure di C, i due file sono uguali su entrambi gli host): conn net-to-net left=192.168.8.18 leftnexthop=192.168.8.3 leftsubnet=10.0.0.32/30 right=192.168.8.3 rightnexthop=192.168.8.18 rightsubnet=10.0.0.4/30

(pubblico di B) (pubblico di C) (sottorete p-p di A e B) (pubblico di C) (pubblico di B) (sottorete p-p di C e D)

… leftrsasigkey= [chiave di B] rightrsasigkey= [chiave di C] Facciamo partire la connessione su B e C sudo /etc/init.d/ipsec start sudo ipsec auto --up net-to-net  Questo comando solo uno dei due

A

B

C

D

B fa solamente il router (quindi abilità il forwarding, come C), ora il left (host) è A. A si assegna una chiave (che poi passerà a C) sudo ipsec newhostkey --bits 1024 --output /etc/ipsec.secrets Modifiche di C e di A al file /etc/ipsec.conf: conn host-to-net left=10.0.0.33 leftnexthop=10.0.0.34 right=192.168.8.3 rightsubnet=10.0.0.4/30 rightnexthop=192.168.8.18 leftrsasigkey= [chiave di A] rightrsasigkey= [chiave di C] Facciamo partire la connessione su A e C sudo /etc/init.d/ipsec start sudo ipsec auto --up host-to-net  Questo comando solo uno dei due

A

B

C

D

A butta giù eth1 e imposta B come default gateway; B, a sua volta, abilita il forwarding.

A e C creano le loro chiavi: sudo ipsec newhostkey --bits 1024 --output /etc/ipsec.secrets Al solito, per vederle: sudo ipsec showhostkey --left (sul terminale left, A) sudo ipsec showhostkey --right (sul terminale right, C) Modifiche di A sul proprio file di configurazione ipsec: … nat_trasversal = yes … conn host-to-net left=10.0.0.33 leftnexthop=10.0.0.34 leftid=@left-peer right=192.168.8.3 rightsubnet=10.0.0.4/30 rightnexthop=192.168.8.18 righted=@right-peer … leftrsasigkey= [chiave di A] rightrsasigkey= [chiave di C] Modifiche di C sul proprio file di configurazione ipsec (questa volta i due file sono diversi!): … nat_trasversal = yes … conn host-to-net left=%any leftsubnet=10.0.0.32/30 leftnexthop=10.0.0.34 leftid=@left-peer right=192.168.8.3 rightsubnet=10.0.0.4/30 rightnexthop=192.168.8.18 righted=@right-peer … leftrsasigkey= [chiave di A] rightrsasigkey= [chiave di C] B effettua il NAT: iptables -t NAT 192.168.8.18

-A

POSTROUTING

-s

10.0.0.33/32

-j

SNAT

--to-source

Facciamo partire la connessione su A e C sudo /etc/init.d/ipsec start sudo ipsec auto --up host-to-net  Questo comando solo uno dei due