Corso Linux / Indirizzi IP, DNS e porte: come funziona una connessione

Un indirizzo IP (Internet Protocol) identifica un indirizzo di comunicazione in rete; il DNS (Domain Name System) cerca record associati ai nomi di dominio; una porta distingue un punto di comunicazione all’interno di un host. Per raggiungere un sito servono una risoluzione del nome funzionante, un percorso verso la destinazione e un servizio che accetti la connessione. Nessuno di questi elementi, da solo, dimostra che l’intero collegamento funzioni.

Dopo aver distinto indirizzi, nomi e porte, il corso sulla diagnostica delle connessioni di rete (in inglese) aiuta a separare i guasti dei diversi livelli.

Gli ambienti di riferimento sono macchine virtuali con installazioni ordinarie di Ubuntu 26.04 LTS o Rocky Linux 9. Container, Windows Subsystem for Linux (WSL) e altri rilasci possono differire per servizi e pacchetti. Prepara la console di recupero e annota le versioni seguendo il corso sull’ambiente di prova in macchina virtuale (in inglese). Le interrogazioni seguenti non modificano indirizzi, route o regole del firewall; le eventuali istruzioni di installazione dei programmi, invece, cambiano i pacchetti del sistema.

Indirizzo, nome e porta in una connessione web

Immagina di aprire https://example.com/. Browser e sistema operativo ottengono gli indirizzi secondo cache e configurazione del resolver, il componente che risolve i nomi; scelgono poi un percorso e contattano il server. HTTPS usa normalmente la porta 443. La comunicazione può usare TCP (Transmission Control Protocol) e TLS (Transport Layer Security), oppure QUIC, un trasporto sicuro basato su UDP (User Datagram Protocol), come nel caso di HTTP/3. Una risposta DNS corretta non garantisce che il sito sia raggiungibile.

Elemento Ruolo Esempio
Indirizzo IP Indirizzo a cui inviare pacchetti 192.0.2.10 o 2001:db8::10
DNS Cercare record associati a un nome Record A, AAAA e MX
Porta e protocollo Distinguere punti di comunicazione nell’host TCP 443 e UDP 443 sono distinti

192.0.2.0/24 e 2001:db8::/32 sono intervalli riservati alla documentazione, secondo RFC 5737 per IPv4 e RFC 3849 per IPv6. Non usarli come indirizzi di server reali per questa prova. TCP e UDP hanno spazi di porte separati: una regola del firewall deve specificare anche il protocollo. Il numero di porta non prova, da solo, quale applicazione risponda.

IPv4, IPv6 e indirizzi privati

IPv4 usa indirizzi di 32 bit, normalmente scritti in decimale con punti; IPv6 usa indirizzi di 128 bit, normalmente espressi in gruppi esadecimali separati da due punti. Un’interfaccia può avere più indirizzi e usare entrambe le famiglie. 127.0.0.1 e ::1 sono indirizzi di loopback, cioè riferiti alla macchina stessa. Un servizio in ascolto soltanto sul loopback non è direttamente accessibile da un altro computer.

Gli intervalli IPv4 privati sono 10.0.0.0/8, 172.16.0.0/12 e 192.168.0.0/16. Si possono riutilizzare nelle reti interne e non sono indirizzi pubblici instradati globalmente. Per l’accesso verso l’esterno può essere usata la traduzione degli indirizzi di rete, NAT (Network Address Translation). Non ridurre IPv6 a “IPv4 senza NAT” e non presumere che una regola del firewall per IPv4 protegga automaticamente anche IPv6.

Leggere prefissi e route predefinita

In 192.168.10.20/24, /24 indica un prefisso di rete lungo 24 bit nella notazione CIDR (Classless Inter-Domain Routing). In questo esempio la rete è 192.168.10.0/24. Il sistema cerca una route compatibile con la destinazione e, nella tabella pertinente, preferisce normalmente il prefisso più specifico. Una voce default via ... indica il prossimo nodo, o next hop, da usare quando non si applica una route più specifica. Gateway e server DNS possono avere lo stesso indirizzo, ma svolgono ruoli diversi.

ip -brief address
ip route
ip -6 route
getent ahosts example.com

ip appartiene al progetto iproute2, ma il nome del pacchetto varia: iproute2 su Ubuntu 26.04 e iproute su Rocky Linux 9. I primi tre comandi mostrano indirizzi delle interfacce e route IPv4 o IPv6; l’ultimo interroga il servizio di risoluzione dei nomi del sistema. getent può usare /etc/hosts e altre fonti configurate oltre al DNS, quindi non equivale a una richiesta DNS diretta. Indirizzi e nomi delle interfacce dipendono dalla macchina; l’assenza di una route IPv6 va interpretata in base alla connettività prevista.

Verifica pacchetto e versione con dpkg-query -W iproute2 su Ubuntu o rpm -q iproute su Rocky. Il nome è confermato dalla pagina ufficiale del pacchetto Ubuntu iproute2 e dal repository ufficiale Rocky Linux 9 BaseOS. Su immagini minime alcuni strumenti possono mancare; Git Bash su Windows non fornisce l’ambiente Linux richiesto da questi comandi.

Separare la risoluzione dei nomi dall’accesso al servizio

Nel DNS Internet un record A contiene un indirizzo IPv4; un record AAAA contiene un indirizzo IPv6. Un record MX individua invece un server di posta. Lo stesso nome può restituire più indirizzi, e cache e tempo di validità dei record possono influenzare il risultato. Se il sistema usa systemd-resolved, il primo comando seguente mostra la configurazione del resolver, inclusi i dati per interfaccia. Se non è disponibile, esamina la configurazione di NetworkManager o del resolver effettivamente usato.

resolvectl status
ss -lnt
curl -I --connect-timeout 5 --max-time 15 https://example.com/

ss -lnt mostra i socket TCP in ascolto su questo computer, con indirizzi e porte in forma numerica, senza risolverli in nomi: non elenca le porte del sito remoto. Il comando curl invia una richiesta HTTP HEAD tramite HTTPS per ottenere le intestazioni. --connect-timeout 5 limita a cinque secondi la fase di connessione, che comprende risoluzione del nome e handshake; --max-time 15 limita l’intera operazione a quindici secondi.

Leggi sia lo stato d’uscita di curl sia il codice HTTP: senza opzioni aggiuntive, una risposta HTTP di errore può comunque accompagnarsi a uno stato d’uscita zero. Alcuni server rifiutano HEAD pur consentendo una normale richiesta GET; questo caso non dimostra da solo che il sito sia irraggiungibile. Proxy, certificati e politiche di rete possono cambiare il risultato. Se curl manca, l’installazione si effettua con sudo apt install curl su Ubuntu o sudo dnf install curl su Rocky, dopo aver controllato la transazione e le autorizzazioni.

Scegliere il controllo successivo dai risultati

  1. Se manca l’indirizzo necessario, esamina interfaccia e connessione di rete della macchina virtuale.
  2. Se l’indirizzo esiste ma manca una route utilizzabile, verifica instradamento e gateway.
  3. Se fallisce soltanto la risoluzione del nome, controlla configurazione del resolver e servizi dei nomi.
  4. Se nome e percorso sono corretti ma l’accesso fallisce, distingui ascolto sulla porta, filtraggio, errori TLS ed errori applicativi. Per un servizio remoto servono verifiche sul server o informazioni del suo amministratore: l’elenco locale di ss non basta.

Questi controlli diagnostici non cambiano la configurazione di rete, anche se le interrogazioni dei nomi e la richiesta HTTPS generano traffico. Non sovrascrivere i file del resolver e non disabilitare il firewall come prima risposta a un errore. Individua il livello interessato e usa l’evidenza raccolta per scegliere una modifica mirata.

Documentazione di riferimento