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).
Classi
La classificazione originale degli indirizzi IPv4 prevedeva una serie di classi. Queste determinano la lunghezza del prefisso che identifica la rete.
Classe | Prefisso | Indirizzi | Hosts | Maschera di rete |
---|---|---|---|---|
A | 0 | |||
B | 10 | |||
C | 110 |
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.
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.
Notazione | Esempio |
---|---|
Slash | /24 |
Puntata | 255.255.255.0 |
Binaria | 11111111.11111111.11111111.00000000 |
Slash | /25 |
Puntata | 255.255.255.128 |
Binaria | 11111111.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.
Indirizzo | Descrizione |
---|---|
Loopback | |
Locali | |
, | Locali |
Multicast | |
Broadcast |
Indirizzi IPv6
Gli indirizzi IPv6 sono dei numeri lunghi 128 bit che identificano univocamente un dispositivo all'interno di una rete.
Notazione compressa
La notazione compressa permette di omettere gli zeri iniziali di ogni gruppo di 4 cifre.
Inoltre, è possibile omettere una sola sequenza di zeri consecutivi.
Maschere in IPv6
Le maschere in IPv6 sono rappresentate da un numero che indica il numero di bit che compongono l'identificativo della rete.
Bisogna stare attenti a ricordare che ogni cifra esadecimale corrisponde a 4 bit. La maschera potrebbe anche dividere la cifra nel mezzo.
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.
Esempio - continuazione
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.
Indirizzo | Descrizione |
---|---|
Loopback | |
Compatibile IPv4 | |
Multicast | |
Link-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.
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
- la rete interna lan1
- 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.
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