Indirizzi IP, subnet e gateway: capire come funziona una rete
Quando un computer Linux si collega a una rete, non è sufficiente sapere che la scheda di rete è attiva.
Per capire davvero cosa sta succedendo dobbiamo sapere quale indirizzo IP possiede il computer, a quale rete appartiene e dove deve inviare i pacchetti destinati a una rete diversa.
Sono questi i concetti alla base di tre elementi che incontriamo continuamente quando lavoriamo con una rete:
indirizzo IP, subnet e gateway.
Capirli non significa necessariamente diventare amministratori di rete. Significa soprattutto riuscire a leggere una configurazione e capire perché, per esempio, un computer riesce a comunicare con un altro dispositivo della rete locale ma non riesce a raggiungere Internet.
Nella nostra guida sul networking di base su Linux abbiamo già visto strumenti come ip addr e ip route. Ora facciamo un passo in più e impariamo a interpretare le informazioni che questi comandi ci mostrano.
Che cos’è un indirizzo IP?
Un indirizzo IP identifica un’interfaccia di rete all’interno di una rete IP.
Nel caso di IPv4, l’indirizzo è composto da 32 bit, normalmente rappresentati come quattro numeri decimali separati da un punto.
Per esempio:
192.168.1.25Non dobbiamo però pensare all’indirizzo come a un semplice numero assegnato casualmente al computer.
Una parte dell’indirizzo identifica la rete, mentre un’altra identifica l’host all’interno di quella rete.
Ed è proprio qui che entra in gioco la subnet.
A cosa serve una subnet?
La subnet, o sottorete, permette di stabilire quale parte dell’indirizzo IP identifica la rete e quale parte identifica gli host appartenenti a quella rete.
Prendiamo questo esempio:
192.168.1.25/24Il /24 è la notazione CIDR e indica che i primi 24 bit dell’indirizzo rappresentano la parte di rete.
In questo caso la subnet mask equivalente è:
255.255.255.0Quindi possiamo rappresentare concettualmente l’indirizzo così:
192.168.1 | 25
rete | hostCon una rete /24, l’indirizzo di rete dell’esempio è:
192.168.1.0mentre 192.168.1.25 identifica uno specifico host all’interno di quella rete.
La documentazione Ubuntu utilizza proprio questo tipo di esempio per spiegare il rapporto tra indirizzo, netmask e network address.
Perché esiste questa separazione?
Perché il computer deve poter rispondere a una domanda fondamentale:
“La destinazione che sto cercando di raggiungere si trova nella mia rete locale oppure devo passare da un router?”
La subnet serve anche a questo.
Se, per esempio, abbiamo:
PC: 192.168.1.25/24
Server: 192.168.1.50/24entrambi appartengono alla stessa rete:
192.168.1.0/24Il computer può quindi raggiungere direttamente l’altro dispositivo attraverso la rete locale.
Se invece dobbiamo raggiungere:
8.8.8.8la destinazione non appartiene alla nostra rete 192.168.1.0/24.
A quel punto entra in gioco il gateway.
Che cos’è il gateway?
Il gateway è il dispositivo attraverso il quale il computer può raggiungere altre reti.
In una normale rete domestica, il gateway è generalmente il router che collega la rete locale a Internet.
Possiamo immaginare una configurazione del genere:
Internet
│
│
192.168.1.1
Router
│
┌────────────┼────────────┐
│ │ │
PC .25 Server .50 Laptop .70
Il router possiede l’indirizzo:
192.168.1.1e il nostro computer potrebbe avere:
192.168.1.25/24Quando il computer deve comunicare con 192.168.1.50, la destinazione appartiene alla rete locale e non è necessario utilizzare il gateway.
Quando invece deve comunicare con un indirizzo esterno, per esempio un server Internet, il traffico viene inviato al router.
Il gateway rappresenta quindi una sorta di porta di uscita dalla rete locale.
Tecnicamente, però, è importante non confondere il gateway con “Internet”: il gateway è semplicemente il prossimo punto a cui il sistema consegna il traffico quando la destinazione richiede una rete diversa.
La route di default
Questa decisione viene rappresentata nella tabella di routing del sistema.
Su Linux possiamo visualizzarla con:
ip route
Potremmo trovare qualcosa di simile:
default via 192.168.1.1 dev enp3s0
192.168.1.0/24 dev enp3s0 proto kernel scope link src 192.168.1.25
La prima riga è particolarmente importante:
default via 192.168.1.1Significa, semplificando, che quando non esiste una rotta più specifica per una destinazione, il traffico deve essere inviato al gateway 192.168.1.1.
La seconda riga dice invece che la rete:
192.168.1.0/24è direttamente raggiungibile attraverso enp3s0.
Il comando ip route permette proprio di visualizzare e interrogare la tabella di routing del kernel Linux.
Come Linux decide dove mandare un pacchetto?
Possiamo ora mettere insieme i concetti.
Supponiamo che il nostro computer abbia:
IP: 192.168.1.25
Subnet: /24
Gateway: 192.168.1.1Se dobbiamo raggiungere:
192.168.1.50Linux riconosce che l’indirizzo appartiene alla rete locale 192.168.1.0/24.
Se invece dobbiamo raggiungere:
10.0.0.20quell’indirizzo appartiene a un’altra rete.
Il sistema cerca quindi una rotta appropriata nella propria tabella di routing. Se non trova una rotta più specifica, utilizza la default route.
Il concetto può essere rappresentato così:
Destinazione
│
▼
È nella mia rete?
/ \
sì no
│ │
▼ ▼
rete gateway
locale │
▼
router
│
▼
altra rete
Questa distinzione è fondamentale per capire moltissimi problemi di rete.
Come verificare la configurazione su Linux
A questo punto possiamo utilizzare i comandi che abbiamo già introdotto nell’articolo sul networking di base, ma questa volta sappiamo cosa stiamo cercando.
Il primo controllo è:
ip addr
Cerchiamo l’interfaccia di rete e l’indirizzo associato.
Potremmo trovare:
inet 192.168.1.25/24Questo ci dice due cose contemporaneamente:
- l’indirizzo IP è
192.168.1.25; - la rete utilizza un prefisso
/24.
Successivamente possiamo controllare il routing:
ip route
e verificare che esista una route di default, ad esempio:
default via 192.168.1.1 dev enp3s0Non serve imparare a memoria l’output.
L’obiettivo è imparare a leggerlo:
IP + prefisso
↓
rete locale
default via
↓
gateway per le altre reti
Un comando particolarmente utile: ip route get
C’è poi un comando che può diventare molto utile quando iniziamo a fare troubleshooting:
ip route get 8.8.8.8
Invece di mostrarci genericamente tutta la tabella di routing, Linux ci dice quale percorso utilizzerebbe per raggiungere quella specifica destinazione.
Potremmo ottenere un risultato simile a:
8.8.8.8 via 192.168.1.1 dev enp3s0 src 192.168.1.25
Possiamo leggerlo in questo modo:
- destinazione:
8.8.8.8; - gateway utilizzato:
192.168.1.1; - interfaccia:
enp3s0; - indirizzo sorgente:
192.168.1.25.
Questo comando è particolarmente interessante perché ci permette di passare dalla teoria alla domanda concreta:
“Se Linux dovesse spedire adesso un pacchetto verso questo indirizzo, da dove lo farebbe passare?”
Il comando ip route get fa parte proprio delle funzionalità di interrogazione della tabella di routing offerte da iproute2.
E se due computer hanno IP apparentemente simili?
Immaginiamo questi due dispositivi:
PC 1: 192.168.1.20/24
PC 2: 192.168.1.80/24Sono nella stessa rete:
192.168.1.0/24Ma consideriamo invece:
PC 1: 192.168.1.20/24
PC 2: 192.168.2.80/24A prima vista gli indirizzi sembrano molto simili.
Non sono però nella stessa rete.
Il primo appartiene a:
192.168.1.0/24il secondo a:
192.168.2.0/24Di conseguenza, per comunicare tra loro sarà necessario un dispositivo di routing che sappia come raggiungere entrambe le reti.
Questa è una delle ragioni per cui guardare solamente l’indirizzo IP non è sufficiente.
Dobbiamo sempre considerarlo insieme al prefisso della subnet.
/24, /16 e /8: cosa significano?
La notazione CIDR può sembrare strana all’inizio, ma il principio è semplice.
Il numero indica quanti bit dell’indirizzo IPv4 appartengono alla parte di rete.
Per esempio:
/8
/16
/24indicano rispettivamente 8, 16 e 24 bit dedicati alla rete.
Per una rete /24:
192.168.1.0/24la subnet mask equivalente è:
255.255.255.0Per una /16:
192.168.0.0/16la mask è:
255.255.0.0Più aumenta il prefisso, più restringiamo l’insieme di indirizzi che appartengono direttamente alla stessa rete.
Non è necessario, almeno per ora, imparare a calcolare manualmente ogni subnet in binario. È più importante comprendere il principio: il prefisso determina quanto è grande la rete e quali indirizzi vengono considerati direttamente raggiungibili.
IP privato e IP pubblico
In una rete domestica incontriamo normalmente indirizzi IPv4 privati.
Tra gli intervalli riservati alle reti private troviamo:
10.0.0.0/8
172.16.0.0/12
192.168.0.0/16Un indirizzo come:
192.168.1.25può quindi essere utilizzato nella rete locale di casa senza essere direttamente un indirizzo pubblico su Internet.
Il router svolge normalmente il compito di collegare questa rete privata all’esterno, spesso utilizzando anche il NAT (Network Address Translation).
Il NAT, però, è un argomento sufficientemente importante da meritare un articolo dedicato, insieme a DNS e DHCP, che infatti abbiamo già previsto nel calendario editoriale.
Per questo qui ci fermiamo al concetto fondamentale: IP privato e IP pubblico hanno ruoli differenti e non sono intercambiabili semplicemente perché entrambi sono indirizzi IP.
IP statico o assegnato tramite DHCP?
Un altro concetto che incontreremo spesso è il modo in cui un dispositivo riceve la propria configurazione.
Possiamo configurare manualmente un indirizzo, oppure utilizzare DHCP, che permette a un server DHCP di assegnare automaticamente parametri come indirizzo IP, netmask, gateway e, normalmente, server DNS.
In una normale rete domestica è molto comune che sia il router a svolgere il ruolo di server DHCP.
Il computer si collega quindi alla rete e riceve automaticamente qualcosa di simile a:
IP: 192.168.1.25
Subnet: /24
Gateway: 192.168.1.1
DNS: ...Su Linux possiamo verificare il risultato con gli strumenti che abbiamo già visto:
ip addr
ip route
La configurazione concreta dipende poi dalla distribuzione e dal sistema di gestione della rete. Su Ubuntu, per esempio, la configurazione di rete viene normalmente descritta attraverso Netplan, mentre gli strumenti sottostanti possono variare in base al renderer utilizzato.
Per questo, in questo articolo non andiamo ancora a modificare manualmente la configurazione di rete: prima è importante capire cosa stiamo modificando.
IP e MAC address non sono la stessa cosa
Un’ultima distinzione è importante.
L’indirizzo IP appartiene al livello di rete e viene utilizzato per identificare e instradare il traffico IP.
Il MAC address, invece, identifica un’interfaccia a livello di collegamento di rete.
Per esempio, una scheda Ethernet potrebbe avere:
MAC:
00:11:22:33:44:55e contemporaneamente utilizzare:
IP:
192.168.1.25Sono quindi due identificatori diversi e con funzioni differenti.
Questo diventerà particolarmente importante quando parleremo di comunicazione all’interno della rete locale e di protocolli come ARP.
Troubleshooting… ovvero quando qualcosa non funziona
Con questi concetti possiamo già costruire una piccola procedura mentale per diagnosticare alcuni problemi.
Se il computer non comunica con la rete locale, possiamo iniziare verificando:
ip addr
e controllare se l’interfaccia possiede effettivamente un indirizzo.
Se l’indirizzo è presente, possiamo guardare la tabella di routing:
ip route
Se manca una route di default, il computer potrebbe non sapere dove inviare il traffico destinato alle reti esterne.
Possiamo poi chiedere direttamente a Linux quale percorso utilizzerebbe:
ip route get 8.8.8.8
Questa sequenza non risolve automaticamente ogni problema di rete, ma ci permette di separare almeno alcuni livelli:
Interfaccia
↓
indirizzo IP
↓
subnet
↓
rete locale
↓
routing
↓
gateway
↓
rete esterna
E questa è una delle competenze più importanti quando si comincia a fare troubleshooting di rete su Linux: non cercare subito una soluzione, ma capire prima in quale punto della comunicazione si trova il problema.
Capire la rete prima di configurarla
Indirizzo IP, subnet e gateway possono sembrare inizialmente tre informazioni indipendenti.
In realtà fanno parte dello stesso meccanismo.
L’indirizzo IP identifica l’interfaccia all’interno della rete IP.
Il prefisso della subnet permette al sistema di capire quali destinazioni appartengono direttamente alla rete locale.
Il gateway permette invece di raggiungere destinazioni che si trovano al di fuori di quella rete, attraverso un dispositivo che svolge funzioni di routing.
Quando questi concetti diventano familiari, anche un comando apparentemente semplice come ip route comincia a raccontare molte più cose.
Non vediamo più soltanto una serie di numeri, ma possiamo leggere:
quali reti sono direttamente raggiungibili, quale interfaccia viene utilizzata e dove viene inviato il traffico destinato altrove.
Ed è proprio da qui che possiamo continuare il nostro percorso sul networking Linux.
Nel prossimo approfondimento entreremo infatti in alcuni dei servizi che fanno funzionare concretamente una rete: DNS, DHCP e NAT. Tre acronimi molto comuni, ma con ruoli profondamente diversi.
LICENZA E CONDIZIONI D’USO
Questo How-to è rilasciato sotto licenza Creative Commons Attribution-NonCommercial 3.0 Italy.
CONTATTI DELL’AUTORE
Marco Ciammella marco@orvietolinux.it
Orvieto Linux User Group info@orvietolinux.it