Reti di calcolatori - Network

Come effettuare il setup di una rete locale.

Indirizzi IPv4

Gli indirizzi IPv4 sono dei numeri lunghi 32 bit che identificano univocamente un dispositivo all'interno di una rete. Generalmente sono scritti in notazione puntata, dove ogni numero rappresenta un byte (8 bit).

1928 bit.1688 bit.18 bit.18 bit 110000008 bit.101010008 bit.000000018 bit.000000018 bit32 bit\begin{gather*} \underbrace{192}_{8\ bit}.\underbrace{168}_{8\ bit}.\underbrace{1}_{8\ bit}.\underbrace{1}_{8\ bit} \newline \space \newline \underbrace{\underbrace{11000000}_{8\ bit}.\underbrace{10101000}_{8\ bit}.\underbrace{00000001}_{8\ bit}.\underbrace{00000001}_{8\ bit}}_{32\ bit} \end{gather*}

Classi

La classificazione originale degli indirizzi IPv4 prevedeva una serie di classi. Queste determinano la lunghezza del prefisso che identifica la rete.

ClassePrefissoIndirizziHostsMaschera di rete
A023122^{31} - 222422^{24} - 2255.0.0.0255.0.0.0
B1023022^{30} - 221622^{16} - 2255.255.0.0255.255.0.0
C11022922^{29} - 22822^{8} - 2255.255.255.0255.255.255.0

Classless Inter-Domain Routing (CIDR)

Il CIDR è un sistema di notazione che permette di specificare la lunghezza del prefisso che identifica la rete in maniera più flessibile.

192.168.124 bit di mask.1 /24mask 11000000.10101000.0000000124 bit di mask.000000018 bit liberi /24mask\begin{gather*} \underbrace{192.168.1}_{24\ \text{bit di mask}}.1\ /\underbrace{24}_{\text{mask}} \newline \newline \space \newline \underbrace{11000000.10101000.00000001}_{24\ \text{bit di mask}}.\underbrace{00000001}_{8\ \text{bit liberi}}\ /\underbrace{24}_{\text{mask}} \end{gather*}

Notazione della maschera

Se posta alla fine di un indirizzo, generalmente si usa la versione con lo slash. Se invece viene scritta da sola, si usa la notazione puntata.

NotazioneEsempio
Slash/24
Puntata255.255.255.0
Binaria11111111.11111111.11111111.00000000
Slash/25
Puntata255.255.255.128
Binaria11111111.11111111.11111111.10000000

Albero delle sotto-reti

Una rete, individuata dalla parte dell'ip fissata dalla maschera, può essere ulteriormente divisa in sotto-reti che condividono la stessa sequenza iniziale, ma con una maschera più lunga.

Loading diagram...

Indirizzi speciali

Gli indirizzi speciali sono indirizzi che non possono essere assegnati a dispositivi, ma hanno un significato particolare. Questi sono alcuni degli indirizzi speciali più comuni.

IndirizzoDescrizione
127.0.0.0/8127.0.0.0/8Loopback
10.0.0.0/810.0.0.0/8Locali
192.0.0.0/24192.0.0.0/24, 192.168.0.0/16192.168.0.0/16Locali
224.0.0.0/4224.0.0.0/4Multicast
x.x.x.255/yx.x.x.255/yBroadcast

Indirizzi IPv6

Gli indirizzi IPv6 sono dei numeri lunghi 128 bit che identificano univocamente un dispositivo all'interno di una rete.

24 bit00116 bit:0db8:85a3:0000:0000:8a2e:0370:7334128 bit 00000100012001030011401005010160110701118100091001a1010b1011c1100d1101e1110f1111\begin{gather*} \underbrace{\underbrace{\underbrace{2}_{4 \ bit}001}_{16\ bit}:0db8:85a3:0000:0000:8a2e:0370:7334}_{128\ bit} \newline \space \newline \underbrace{0}_{0000} \underbrace{1}_{0001} \underbrace{2}_{0010} \underbrace{3}_{0011} \underbrace{4}_{0100} \underbrace{5}_{0101} \underbrace{6}_{0110} \underbrace{7}_{0111} \underbrace{8}_{1000} \underbrace{9}_{1001} \underbrace{a}_{1010} \underbrace{b}_{1011} \underbrace{c}_{1100} \underbrace{d}_{1101} \underbrace{e}_{1110} \underbrace{f}_{1111} \end{gather*}

Notazione compressa

La notazione compressa permette di omettere gli zeri iniziali di ogni gruppo di 4 cifre.

2001:0db8:85a3:0000:0000:8a2e:0370:73342001:db8:85a3:0:0:8a2e:370:7334\begin{gather*} 2001:0db8:85a3:0000:0000:8a2e:0370:7334 \newline 2001:db8:85a3:0:0:8a2e:370:7334 \end{gather*}

Inoltre, è possibile omettere una sola sequenza di zeri consecutivi.

2001:0db8:85a3:0000:0000:8a2e:0370:73342001:db8:85a3::8a2e:370:7334\begin{gather*} 2001:0db8:85a3:0000:0000:8a2e:0370:7334 \newline 2001:db8:85a3::8a2e:370:7334 \end{gather*}

Maschere in IPv6

Le maschere in IPv6 sono rappresentate da un numero che indica il numero di bit che compongono l'identificativo della rete.

2001:db8:85a3::8a2e96 bit di maschera:370:7334/96\underbrace{2001:db8:85a3::8a2e}_{96 \text{ bit di maschera}}:370:7334/96

Bisogna stare attenti a ricordare che ogni cifra esadecimale corrisponde a 4 bit. La maschera potrebbe anche dividere la cifra nel mezzo.

2001:db8:85a3::8a2e:03001103 bit di maschera170:7334/103\underbrace{2001:db8:85a3::8a2e:0\underbrace{3}_{001}}_{103 \text{ bit di maschera}}\underbrace{ }_{1}70:7334/103

Albero delle sotto-reti

Anche in IPv6 è possibile dividere una rete in sotto-reti, seguendo le stesse regole di IPv4 con una struttura ad albero.

Loading diagram...

Differenziare le reti noti il numero di host

Un altro metodo più semplice per differenziare le reti è quello di notare il numero di host che si vuole avere in ogni rete. Stabilito il numero di bit necessari ad identificarli, il resto dell'indirizzo sarà utilizzato per identificare la rete. Va però invertito l'ultimo bit catturato della maschera rispetto all'ip originale.
Finché tutte le reti hanno una maschera differente, non ci saranno conflitti.

Esempio

Si vuole dividere la rete 2:4::FFF0:0:0/96 in 4 reti con 500.000, 50.000, 2.500.000 e 700.000 di host.

0002:0004:0000:0000:0000:FFF0:0000:00000002:0004:0000:0000:0000:FFF0:0000:0000

log2500000=1912819=1090002:0004:0000:0000:0000:FFF0:000108 bit81000:0000/109\begin{gather*} \lceil\log_2{500000}\rceil = 19 \to 128 - 19 = 109 \newline \underbrace{0002:0004:0000:0000:0000:FFF0:000}_{108 \text{ bit}}\underbrace{8}_{1000}:0000 / 109 \end{gather*}
log250000=1612816=1120002:0004:0000:0000:0000:FFF0:000108 bit10001:0000/112\begin{gather*} \lceil\log_2{50000}\rceil = 16 \to 128 - 16 = 112 \newline \underbrace{0002:0004:0000:0000:0000:FFF0:000}_{108 \text{ bit}}\underbrace{1}_{0001}:0000 / 112 \end{gather*}

Esempio - continuazione

log22500000=2212822=1060002:0004:0000:0000:0000:FFF0:00104 bit401000:0000/106\begin{gather*} \lceil\log_2{2500000}\rceil = 22 \to 128 - 22 = 106 \newline \underbrace{0002:0004:0000:0000:0000:FFF0:00}_{104 \text{ bit}}\underbrace{4}_{0100}0:0000 / 106 \end{gather*}
log2700000=2012820=1080002:0004:0000:0000:0000:FFF0:00104 bit100010:0000/108\begin{gather*} \lceil\log_2{700000}\rceil = 20 \to 128 - 20 = 108 \newline \underbrace{0002:0004:0000:0000:0000:FFF0:00}_{104 \text{ bit}}\underbrace{1}_{0001}0:0000 / 108 \end{gather*}

Indirizzi speciali

Gli indirizzi speciali sono indirizzi che non possono essere assegnati a dispositivi, ma hanno un significato particolare. Questi sono alcuni degli indirizzi speciali più comuni.

IndirizzoDescrizione
::1::1Loopback
::ffff:0:0/96::ffff:0:0/96Compatibile IPv4
ff00::/8ff00::/8Multicast
fe80::/10fe80::/10Link-local

Setup di una rete

Per fare un po' di pratica e vedere i concetti base, effettueremo il setup di una rete locale con tre macchine virtuali:

Loading diagram...

Creare le macchine virtuali

Prima di tutto è necessario creare le tre macchine virtuali. Per velocizzare il processo, è possibile crearne una e clonarla due volte, prima di aver fatto alcuna configurazione.

Da questo momento in poi, per comodità, le tre macchine verranno chiamate client, router e server.

Configurazione delle schede di rete

Le tre macchine dovranno essere poste in reti interne differenti: una condivisa tra client e router ed una tra router e server.
Se si vuole anche abilitare la connessione ad internet, il router dovrà avere una terza interfaccia che utilizza NAT.

VirtualBox

Configurare le interfacce

Prima di tutto, è bene controllare quale interfaccia si sta utilizzando con il comando

ip a

Per comodità utilizzeremo le interfacce enp0s3 per client, server e router. Quest'ultimo sfrutterà anche l'interfaccia enp0s8.

Client

La scheda di rete del client dovrà essere configurata in modo da usare la rete interna lan1.

Modificando il file /etc/network/interfaces con nano o vi, è possibile configurare l'interfaccia in modo che utilizzi un ip statico.

# Client /etc/network/interfaces
auto enp0s3
iface enp0s3 inet static
    address 10.0.1.1/24
    gateway 10.0.1.254

Fare il reboot della macchina per applicare le modifiche.

reboot

Router

Le due schede di rete del router dovrebbero essere impostate a

  1. la rete interna lan1
  2. la rete interna lan2

Modificare il file /etc/network/interfaces

# Router /etc/network/interfaces
# ...
auto enp0s3
iface enp0s3 inet static
    address 10.0.1.254/24

auto enp0s8
iface enp0s8 inet static
    address 192.168.1.254/24

Usare il routing

Per permettere al router di comportarsi come tale, e quindi di inoltrare i pacchetti diretti ad altre macchine, è necessario abilitare tale comportamento dal file /etc/sysctl.conf, rimuovendo il commento dalla riga net.ipv4.ip_forward=1.

# Router /etc/sysctl.conf
net.ipv4.ip_forward=1

Anche in questo caso, è necessario riavviare la macchina per applicare le modifiche.

reboot

Tabelle di routing

Se la topologia della rete è più complicata, potrebbe essere necessario inoltrare il pacchetto attraverso più router.
Ogni router dovrebbe conoscere la route per raggiungere ogni altra macchina della rete. Per le reti a cui non ha direttamente accesso, la route potrebbe dover essere impostata manualmente.

# Router /etc/network/interfaces
# ...
# Con questa regola di routing
# i pacchetti che diretti alla lan 172.0.1.0/24
# saranno inoltrati al router 10.0.1.253
up ip route add 172.0.1.0/24 via 10.0.1.253

Server

La scheda di rete del server dovrà essere configurata in modo da usare la rete interna lan2.

Modificare il file /etc/network/interfaces

# Server /etc/network/interfaces
auto enp0s3
iface enp0s3 inet static
    address 192.168.1.1/24
    gateway 192.168.1.254

Riavviare la macchina per applicare le modifiche.

reboot

Configurare gli hostnames

Invece di dover inserire ogni volta gli ip delle altre macchine, è possibile configurare gli hostnames. Aggiungendo le coppie ip-hostname al file /etc/hosts è possibile associare il nome di una macchina all'ip corrispondente.

# Client /etc/hosts/
10.0.1.1 router
10.0.5.2 server
# Router /etc/hosts/
10.0.1.2 client
10.0.5.2 server
# Server /etc/hosts/
10.0.5.1 router
10.0.1.2 client

Configurare il nome della macchina

Per comodità, è possibile configurare il nome della macchina in modo che sia più facile riconoscerla. Basta modificare il file /etc/hostname. Se lo fate, è bene aggiornare il file /etc/hosts così che il nuovo nome della macchina sia associato all'ip di loopback.

# Client /etc/hostname
client
# Client /etc/hosts
127.0.0.1 client
# Router /etc/hostname
router
# Router /etc/hosts
127.0.0.1 router
# Server /etc/hostname
server
# Server /etc/hosts
127.0.0.1 server

Risultati

Se tutti i passaggi sono stati eseguiti correttamente, ora dovrebbe essere possibile pingare le macchine tra loro. Usando il comando traceroute è possibile avere una visione più chiara della rete.

# dal client
traceroute 192.168.1.1
# dal server
traceroute 10.0.1.1

Extra: connettersi ad internet

Se si prova a accedere ad un server esterno, come google, da una delle VM che non sia il router, non si riceverà alcuna risposta. Questo è perché, per poter inoltrare i pacchetti, il router deve permettere il NATting. Per abilitare questa funzione, bisogna configurare correttamente le IPTABLES:

# Abilita il masquerading per l'interfaccia esterna
iptables --table nat --append POSTROUTING --out-interface enp0s3 -j MASQUERADE
# Abilita il forwarding dei pacchetti inoltrati
iptables --append FORWARD --in-interface enp0s3 -j ACCEPT

Cheatsheet

Una serie di comandi utili per configurare le reti su macchine debian.

Modificare le configurazioni dal terminale (modifiche temporanee)

Aggiungere un indirizzo ip ad un'interfaccia

# ip a add <ip>/<mask> dev <interface>
ip a add 10.0.1.5/24 dev enp0s8

Impostare un'interfaccia come up o down

# ip link set dev <interface> (up|down)
ip link set dev enp0s8 up

Routing

Aggiungere, sostituire o rimuovere una route per una rete, specificando l'interfaccia o l'ip

# ip route (add|replace|del) <ip>/<mask> dev <interface>
ip route add 10.0.1.0/24 dev enp0s8
# ip route (add|replace|del) <ip>/<mask> via <ip>
ip route add 10.0.1.0/24 via 192.168.1.1

Aggiungere un gateway di default per ogni ip che non ha una route più specifica, specificando l'interfaccia o l'ip

# ip route (add|replace|del) default dev <interface>
ip route add default dev enp0s8
# ip route (add|replace|del) default via <ip>
ip route add default via 192.168.1.1

Modificare la configurazione di rete dal file (modifiche persistenti)

Modificare il file /etc/network/interfaces. Si può usare qualsiasi editor di testo disponibile, ma probabilmente troverete già installati vi o nano.

# /etc/network/interfaces
auto <interface>
iface <interface> inet static       # se impostato a 'dhcp', l'ip verrà assegnato dinamicamente
    address <ip>                    # ip della macchina legato a questa interfaccia. Si può aggiungere anche la mask /n
    netmask <mask>                  # maschera della rete (la parte /n)
    gateway <router ip>             # [SOLO SU UNA INTERFACCIA] imposta il gateway di default
    network <network>               # [OPZIONALE] definizione dalla rete. Default: ip/mask
    broadcast <broadcast address>   # [OPZIONALE] indirizzo di broadcast. Default: ip.255
    up <route up>                   # [OPZIONALE] operazioni da fare quando l'interfaccia è messa su
    post-up <route up>              # [OPZIONALE] operazioni da fare dopo che l'interfaccia è messa su
    per-down <route down>           # [OPZIONALE] operazioni da fare quando l'interfaccia è messa giù

Esempi di file di configurazione

File /etc/network/interfaces:

auto enp0s3
iface enp0s3 inet dhcp
auto enp0s8
iface enp0s8 inet static
    address 10.0.1.2/24
    gateway 10.0.1.1
    up ip route add 192.168.1.1/24 via 10.0.1.254
auto enp0s9
iface enp0s9 inet static
    address 10.0.1.2
    netmask 255.255.255.0
    gateway 10.0.1.1
    network 10.0.1.0
    broadcast 10.0.1.255
    post-up route add -net 10.0.1.0 netmask 255.255.255.0 gw 10.0.1.1 dev enp0s8
    per-down route del -net 10.0.1.0 netmask 255.255.255.0 gw 10.0.1.1 dev enp0s8

Impostare gli hostnames

Per aggiungere dei nomi da associare agli ip, si può modificare il file /etc/hosts, aggiungendo le coppie ip-hostname sotto le righe già presenti

127.0.0.1       localhost
::1             localhost ip6-localhost
127.0.0.1       <hostname>

# <ip> <hostnames>
10.0.0.1 router
192.168.1.2 server

Troubleshooting

Anche se vorremmo che tutto funzionasse al primo colpo, non è sempre così. Vediamo alcuni passaggi che possono essere utili per individuare e risolvere i problemi.

Verificare la configurazione di rete da VirtualBox

La prima cosa da controllare è che le macchine siano collegate alla rete corretta.
Se due macchine non sono inserite nella stessa rete interna, non potranno mai raggiungersi direttamente.

VirtualBox

Verificare la configurazione di rete dei router da VirtualBox

Per poter svolgere il loro compito, i router devono avere tante interfacce quante sono le reti per cui devono inoltrare i pacchetti.

L'ordine in cui sono collegate le interfacce è importante, perché determina quale interfaccia sarà collegata a quale rete.

Verificare la configurazione IP

Dopo aver configurato l'ip di una macchina, usando i comandi da riga di comando ip a add o modificando il file /etc/network/interfaces, è una buona idea accertarsi, che la configurazione sia stata applicata correttamente.

Per farlo, si può usare il comando ip a.

ip a

Verificare la configurazione di routing

Dopo aver configurato le rotte di una macchina, usando i comandi da riga di comando ip r add o modificando il file /etc/network/interfaces, è una buona idea accertarsi, che la configurazione sia stata applicata correttamente.

Per farlo, si può usare il comando ip r.

ip r

Utilizzare il comando ping

Il comando ping è un ottimo strumento per verificare la connettività tra due macchine.

ping <ip>

Il primo step è verificare che le macchine nella stessa rete siano raggiungibili. In particolare, che il router sia raggiungibile da tutte le macchine collegate ad esso.

Problemi con il ping

Se la risposta è che l'host è irraggiungibile, allora probabilmente manca il gateway di default.

Se non si riceve risposta, la macchina di destinazione potrebbe essere spenta, o il router potrebbe non aver abilitato il forwarding dei pacchetti.

Un'altra opzione sarebbe che il destinatario non abbia modo di fare il percorso inverso per rispondere al ping (magari non ha un gateway impostato).

Utilizzare il comando traceroute

Il comando traceroute è un ottimo strumento che permette di tracciare il percorso che un pacchetto compie per raggiungere una destinazione.

traceroute <ip>

Challenge

  • Sistemare il routing per ipv6