Cos'è una port e come funziona su Linux
Scopri come i servizi Linux utilizzano le port TCP e UDP per gestire il traffico. Impara a usare il comando ss per identificare i processi in ascolto.
Cos'è effettivamente una port
Una port è un numero che permette a un server di eseguire più servizi contemporaneamente senza che il traffico si mescoli. Il tuo VPS ha un unico indirizzo IP, ma potrebbe eseguire contemporaneamente un web server, un server SSH e un database. Quando arriva un pacchetto, il sistema operativo deve sapere a quale di essi è destinato. Il numero della port fornisce la risposta. Il traffico web va alla port 443, l'SSH alla port 22. L'indirizzo IP consegna il pacchetto al tuo server; la port lo consegna al programma corretto su quel server.
Una port è un numero a 16 bit: 16 bit permettono di avere valori da 0 a 65535; lo 0 è riservato, quindi in pratica le port vanno da 1 a 65535. Le port inferiori a 1024 sono le port "well-known" e richiedono i privilegi di root per essere aperte; per questo i servizi standard risiedono lì: 22 per SSH, 80 per HTTP, 443 per HTTPS, 53 per DNS. Qualsiasi valore superiore a 1024 è disponibile per i programmi ordinari.
Esistono due tipi, TCP e UDP, e il numero di una port in un protocollo è distinto dallo stesso numero nell'altro. TCP è il protocollo basato su connessione usato dalla maggior parte dei servizi, come SSH, HTTP e i database. UDP non è basato su connessione ed è usato per funzioni come DNS e alcune VPN. Quando si configura un firewall, solitamente si specifica quale protocollo si intende, ad esempio 22/tcp.
Listening significa che un programma è in attesa su una port
Un programma che deve ricevere connessioni richiede al kernel di "ascoltare" (listen) su una port. Da quel momento la port è aperta sulla macchina e il programma risponde a tutto ciò che arriva lì, sotto il controllo del firewall. Una port su cui non c'è nulla in ascolto rifiuta semplicemente le connessioni. Pertanto, la prima domanda in qualsiasi controllo di sicurezza è: cosa è in ascolto, e dove.
Il comando per rispondere a questa domanda è ss:
sudo ss -tlnpI flag significano TCP (t), solo socket in ascolto (l), port numeriche (n, così vedrai 22 invece di ssh), e il processo proprietario (p). Un risultato tipico:
State Recv-Q Local Address:Port Process
LISTEN 0 0.0.0.0:22 sshd
LISTEN 0 127.0.0.1:5432 postgres
LISTEN 0 [::]:80 nginxLa colonna Process indica quale programma possiede ogni port; questo è il modo per rintracciare qualcosa che non si è intenzionati di lasciare in esecuzione.
La colonna Local Address è la parte importante
Leggi attentamente l'indirizzo davanti a ogni port, perché determina chi può raggiungere il servizio. Vedrai costantemente tre casi.
0.0.0.0:22 significa "ascolta su ogni indirizzo IPv4 presente su questa macchina", incluso quello pubblico. Il servizio è raggiungibile da internet tramite IPv4, se il firewall lo permette.
[::]:80 significa la stessa cosa per IPv6: ascolta su ogni indirizzo IPv6, incluso quello pubblico. Molti programmi si legano (bind) qui di default, e su Linux un socket :: spesso accetta anche traffico IPv4.
127.0.0.1:5432 significa "ascolta solo su loopback". 127.0.0.1 è l'indirizzo che una macchina usa per comunicare con se stessa e non è raggiungibile da nessun altro posto. Un servizio legato qui è raggiungibile solo dallo stesso server, mai da internet, indipendentemente dalle impostazioni del firewall. La riga Postgres sopra è sicura per costruzione.
La regola pratica deriva direttamente da questo: un database, una cache o un pannello di amministrazione che deve essere usato solo dalle tue applicazioni deve essere legato a 127.0.0.1, non a 0.0.0.0. Se non ascolta mai su un indirizzo pubblico, non c'è nulla che un attaccante possa raggiungere.
Listening non è la stessa cosa che raggiungibile
Un'ulteriore distinzione evita molta confusione. Il fatto che una port sia aperta sulla macchina, ovvero che un programma sia in ascolto, è diverso dal fatto che quella port sia raggiungibile dall'esterno, ovvero che il firewall la permetta. Entrambe le condizioni devono essere vere affinché un client remoto possa connettersi.
Esistono quindi due livelli di controllo. Decidi cosa ascolta impostando l'indirizzo di bind di ogni servizio. Decidi cosa può raggiungere il mondo esterno tramite un firewall. Un server ben configurato usa entrambi: i servizi si legano solo dove necessario e un firewall nega tutto ciò che non è stato esplicitamente permesso. Leggere cosa è in ascolto con ss è il primo passo; decidere cosa permette il firewall è il secondo passo, trattato in firewalls 101 with UFW.
C'è una sottigliezza che crea problemi. IPv4 e IPv6 sono separati, e un firewall che copre solo IPv4 lascia i servizi [::] aperti su IPv6. Questo specifico rischio ha il suo articolo dedicato: the IPv6 firewall trap.
FAQ
Come posso vedere quali port sono aperte sul mio server Linux?
Esegui sudo ss -tlnp per TCP o sudo ss -ulnp per UDP. Questo elenca ogni socket in ascolto, la port, l'indirizzo locale a cui è legata e il processo proprietario. Leggi la colonna Local Address: 0.0.0.0 o [::] significa che il servizio è esposto sulla rete, mentre 127.0.0.1 significa che ascolta solo sulla macchina stessa.
Qual è la differenza tra 0.0.0.0 e 127.0.0.1?
0.0.0.0 significa "ascolta su tutti gli indirizzi IPv4", incluso quello pubblico, quindi il servizio può essere raggiunto dalla rete. 127.0.0.1 è il loopback, l'indirizzo che la macchina usa per comunicare con se stessa, e non è raggiungibile da nessun altro posto; quindi un servizio legato ad esso è raggiungibile solo localmente. Lega i servizi interni a 127.0.0.1 per evitare che siano esposti.
Devo aprire una port nel firewall affinché un servizio funzioni?
Solo per i servizi che devono essere raggiunti da altre macchine. Un servizio legato a 127.0.0.1 non richiede regole nel firewall perché nulla di esterno può raggiungerlo comunque. Un servizio su 0.0.0.0 o [::] richiede una regola nel firewall per permettere il traffico, e deve essere negato di default finché non ne aggiungi una.
Qual è la differenza tra una port TCP e una port UDP?
TCP è basato su connessione ed è usato dalla maggior parte dei servizi, come SSH, web server e database. UDP non è basato su connessione ed è usato da DNS e alcune VPN. Lo stesso numero in TCP e UDP corrisponde a port distinte, quindi 53/tcp e 53/udp sono diverse. Quando scrivi le regole del firewall, devi specificare il protocollo, ad esempio 22/tcp.