Comando ss: controllare porte e processi su Linux, confronto con netstat

Ambiente di testFamiglia DebianDebian 12iproute2 6.1.0account utente normaleVerificato il 2026-11-04
Comandi di retessPosizione/usr/bin/ss

Su un server Linux, il comando ss mostra quali porte sono aperte e chi è connesso. ss è lo strumento di consultazione dei socket di iproute2 che sostituisce netstat. Interrogando con ss le porte in ascolto (LISTEN) e le connessioni su un server Debian 12, abbiamo verificato che da un account normale il nome dei programmi avviati da altri account non compare nella colonna Process, nemmeno con -p.

L'output qui sotto è stato ottenuto con una locale inglese. Gli indirizzi del server e dell'altra parte sono indicati come indirizzi di esempio.

1️⃣ Uso di base del comando ss e colonne dell'output

Se esegui ss senza opzioni, le porte in ascolto restano fuori e compaiono solo i socket con una connessione stabilita. Sul server di prova, le prime righe erano tutte socket Unix (u_str, u_dgr) che i programmi del server usano per comunicare tra loro.

ss | head -n 5
Netid State Recv-Q Send-Q                              Local Address:Port       Peer Address:Port    Process
u_str ESTAB 0      0                                               * 1013903               * 1013904
u_dgr ESTAB 0      0                                               * 1013960               * 13394
u_str ESTAB 0      0                                               * 1013907               * 1013908
u_str ESTAB 0      0                                               * 46066198              * 46066199

Per vedere solo le connessioni TCP, quindi, aggiungi -t. I socket Unix spariscono e al posto del numero di porta compaiono nomi di servizio come ssh e https.

ss -t
State Recv-Q Send-Q Local Address:Port  Peer Address:Port Process
ESTAB 0      0       203.0.113.10:ssh   198.51.100.7:51114
ESTAB 0      0       203.0.113.10:26676   192.0.2.15:https
ESTAB 0      0       203.0.113.10:29714   192.0.2.16:https

Se aggiungi anche -n, i numeri di porta restano tali e non vengono convertiti in nomi di servizio.

ss -tn
State Recv-Q Send-Q Local Address:Port  Peer Address:Port Process
ESTAB 0      0       203.0.113.10:22    198.51.100.7:51114
ESTAB 0      0       203.0.113.10:26676   192.0.2.15:443
ESTAB 0      0       203.0.113.10:29714   192.0.2.16:443

Le colonne Recv-Q e Send-Q hanno significati diversi a seconda dello stato del socket. Su un socket connesso, Recv-Q è il numero di byte ricevuti che il programma non ha ancora letto, mentre Send-Q è il numero di byte inviati di cui l'altra parte non ha ancora confermato la ricezione.

Su un socket in ascolto, Recv-Q è il numero di connessioni in coda e Send-Q la dimensione massima della coda. Questi significati vengono dalla pagina man netstat(8) di net-tools.

2️⃣ Controllare le porte su Linux (-tln, -uln, -tulpn)

L'output senza opzioni non mostra le porte in attesa di connessioni, quindi per controllare le porte aperte aggiungi -l, che seleziona solo i socket in ascolto. [ss -tln] mostra le porte TCP in ascolto come numeri.

ss -tln
State  Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0      128          0.0.0.0:22        0.0.0.0:*
LISTEN 0      511          0.0.0.0:80        0.0.0.0:*
LISTEN 0      511          0.0.0.0:443       0.0.0.0:*
LISTEN 0      511        127.0.0.1:8080      0.0.0.0:*
LISTEN 0      128             [::]:22           [::]:*
LISTEN 0      511             [::]:80           [::]:*
LISTEN 0      511             [::]:443          [::]:*

Se Local Address è 0.0.0.0, il socket accetta le connessioni che arrivano su tutti gli indirizzi IPv4 del server; se è 127.0.0.1, ci si può connettere solo dall'interno del server. [::] indica tutti gli indirizzi IPv6, quindi le porte 22, 80 e 443 sono aperte sia su IPv4 sia su IPv6.

Senza -n, i numeri di porta diventano nomi di servizio. La porta 8080 compare come http-alt.

ss -tl
State  Recv-Q Send-Q Local Address:Port     Peer Address:PortProcess
LISTEN 0      128          0.0.0.0:ssh           0.0.0.0:*
LISTEN 0      511          0.0.0.0:http          0.0.0.0:*
LISTEN 0      511          0.0.0.0:https         0.0.0.0:*
LISTEN 0      511        127.0.0.1:http-alt      0.0.0.0:*
LISTEN 0      128             [::]:ssh              [::]:*
LISTEN 0      511             [::]:http             [::]:*
LISTEN 0      511             [::]:https            [::]:*

UDP non stabilisce connessioni, quindi nemmeno i suoi socket in ascolto hanno lo stato LISTEN. Nell'output di [ss -uln] la colonna dello stato riportava UNCONN su tutte le righe. La porta 68 (bootpc) è il client DHCP e la porta 123 (ntp) è quella della sincronizzazione dell'ora.

ss -uln
State  Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
UNCONN 0      0            0.0.0.0:68        0.0.0.0:*
UNCONN 0      0       203.0.113.10:123       0.0.0.0:*
UNCONN 0      0          127.0.0.1:123       0.0.0.0:*
UNCONN 0      0            0.0.0.0:123       0.0.0.0:*
UNCONN 0      0              [::1]:123          [::]:*
UNCONN 0      0               [::]:123          [::]:*

Per vedere TCP e UDP insieme, unisci le opzioni come in [ss -tulpn]. Quando i tipi sono più di uno, all'inizio si aggiunge la colonna Netid.

ss -tulpn
Netid State  Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
udp   UNCONN 0      0            0.0.0.0:68        0.0.0.0:*
udp   UNCONN 0      0       203.0.113.10:123       0.0.0.0:*
udp   UNCONN 0      0          127.0.0.1:123       0.0.0.0:*
udp   UNCONN 0      0            0.0.0.0:123       0.0.0.0:*
udp   UNCONN 0      0              [::1]:123          [::]:*
udp   UNCONN 0      0               [::]:123          [::]:*
tcp   LISTEN 0      128          0.0.0.0:22        0.0.0.0:*
tcp   LISTEN 0      511          0.0.0.0:80        0.0.0.0:*
tcp   LISTEN 0      511          0.0.0.0:443       0.0.0.0:*
tcp   LISTEN 0      511        127.0.0.1:8080      0.0.0.0:*
tcp   LISTEN 0      128             [::]:22           [::]:*
tcp   LISTEN 0      511             [::]:80           [::]:*
tcp   LISTEN 0      511             [::]:443          [::]:*

3️⃣ Controllare i processi con il comando ss (-p)

-p è l'opzione che mostra nella colonna Process il programma che usa ciascun socket. Eppure, eseguendo [ss -tlnp] da un account normale del server di prova, la colonna Process è rimasta vuota come qui sotto, come se l'opzione non avesse effetto.

ss -tlnp
State  Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0      128          0.0.0.0:22        0.0.0.0:*
LISTEN 0      511          0.0.0.0:80        0.0.0.0:*
LISTEN 0      511          0.0.0.0:443       0.0.0.0:*
LISTEN 0      511        127.0.0.1:8080      0.0.0.0:*
LISTEN 0      128             [::]:22           [::]:*
LISTEN 0      511             [::]:80           [::]:*
LISTEN 0      511             [::]:443          [::]:*

ss trova il processo che usa un socket leggendo la cartella fd di ogni processo sotto /proc. Un account normale non può aprire la cartella fd di un processo avviato da un altro account, quindi il nome di quel programma non entra nella colonna. Se da un account normale apri la cartella del processo 1, avviato da root, ottieni un errore di permessi.

ls /proc/1/fd
ls: cannot open directory '/proc/1/fd': Permission denied

I programmi avviati con il tuo account compaiono nella colonna Process anche da un account normale. L'abbiamo verificato avviando il semplice server web di python3 sulla porta 8000 di 127.0.0.1.

python3 -m http.server 8000 --bind 127.0.0.1 &

Una volta avviato, aggiungi [sport = :8000] per vedere solo la riga della porta 8000.

ss -tlnp sport = :8000
State  Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0      5          127.0.0.1:8000      0.0.0.0:*    users:(("python3",pid=343015,fd=3))

Nelle parentesi dopo users compaiono, in ordine, il nome del programma, il pid e il numero del descrittore di file (fd).

Finita la verifica, ferma il semplice server web con [kill %1]. Se poi esegui di nuovo [ss -tln sport = :8000], resta solo la riga di intestazione e la riga della porta 8000 non compare più.

Dall'account root, ss può leggere le informazioni di tutti i processi, quindi la colonna Process si riempie. Quando più processi sono in ascolto insieme sulla stessa porta, nelle parentesi di users compare una voce per ciascuno. I nomi dei programmi e i pid dell'output di root qui sotto sono valori di esempio.

ss -tlnp sport = :443
State  Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0      511          0.0.0.0:443       0.0.0.0:*    users:(("app",pid=2101,fd=6),("app",pid=2100,fd=6))
LISTEN 0      511             [::]:443          [::]:*    users:(("app",pid=2101,fd=7),("app",pid=2100,fd=7))

Per trovare un programma dal numero di porta, puoi usare anche il comando lsof nella forma [lsof -i :443].

Nel diagramma qui sotto puoi cambiare account e confrontare come cambia la colonna Process a seconda dell'account.

🧭 ss -p e gli account: quando si riempie la colonna Process
Diagramma esplicativo
👤 Account
$# ss -tlnp
Socket in ascoltoInformazioni sul processoColonna Process
0.0.0.0:22LISTEN
➜
/proc/812/fdProprietario: root
➜
Processi di altri account: non leggibiliroot: legge tutti i processiColonna Process vuotausers:(("sshd",pid=812,fd=3))
127.0.0.1:8080LISTEN
➜
/proc/2100/fdProprietario: root
➜
Processi di altri account: non leggibiliroot: legge tutti i processiColonna Process vuotausers:(("app",pid=2100,fd=3))
127.0.0.1:8000LISTEN
➜
/proc/343015/fdProprietario: user
➜
Processi del mio account: leggibiliroot: legge tutti i processiusers:(("python3",pid=343015,fd=3))
Un account normale non può leggere le informazioni /proc dei processi avviati da altri account, quindi la colonna Process di quelle righe resta vuota e si riempie solo la riga di python3 avviato con il tuo account.
root può leggere le informazioni di tutti i processi, quindi per ogni socket in ascolto il nome del programma e il pid compaiono nella colonna Process.

4️⃣ Opzioni di filtro per stato e porta di ss

  • ↪️ state, dport, sport

Anche dopo aver controllato le porte aperte, devi filtrare a parte chi è connesso a quelle porte in questo momento. ss lascia solo le righe che ti servono quando aggiungi condizioni di filtro dopo le opzioni.

Se scrivi il nome di uno stato dopo state, restano solo i socket in quello stato. L'output di [ss -tn state established] non ha la colonna State e inizia dalla colonna Recv-Q.

ss -tn state established
Recv-Q Send-Q Local Address:Port  Peer Address:Port Process
0      0       203.0.113.10:22    198.51.100.7:51114
0      0       203.0.113.10:26676   192.0.2.15:443
0      0       203.0.113.10:29714   192.0.2.16:443

Le porte si filtrano con dport (porta dell'altra parte) e sport (porta locale). Le connessioni in uscita dal server verso server https esterni si selezionano con [dport = :443].

ss -tn dport = :443
State Recv-Q Send-Q Local Address:Port  Peer Address:PortProcess
ESTAB 0      0       203.0.113.10:26676   192.0.2.15:443
ESTAB 0      0       203.0.113.10:29714   192.0.2.16:443

Usando sport insieme a -l puoi controllare solo se quella porta è in ascolto.

ss -tln sport = :22
State  Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0      128          0.0.0.0:22        0.0.0.0:*
LISTEN 0      128             [::]:22           [::]:*

Raggruppa più condizioni con parentesi e or, e racchiudile tra apici singoli perché la shell non interpreti prima le parentesi. Qui sotto c'è il risultato della selezione delle sole connessioni ssh, secondo l'esempio della pagina man.

ss -tn state established '( dport = :ssh or sport = :ssh )'
Recv-Q Send-Q Local Address:Port Peer Address:Port Process
0      0       203.0.113.10:22   198.51.100.7:51114

TIME-WAIT è lo stato in cui una connessione resta per poco dopo essere stata chiusa. Non compare nell'output predefinito, quindi per vederlo devi selezionarlo a parte con [state time-wait].

ss -tn state time-wait
Recv-Q Send-Q Local Address:Port  Peer Address:PortProcess
0      0          127.0.0.1:28750    127.0.0.1:80
0      0          127.0.0.1:57698    127.0.0.1:8080
0      0              [::1]:31936        [::1]:80

Se sbagli il nome dello stato, il comando termina subito lasciando una sola riga di errore [wrong state name]. Qui sotto c'è il risultato ottenuto inserendo foo di proposito. I nomi utilizzabili si trovano nella riga TCP-STATES dell'output di [ss -h].

ss -tn state foo
ss: wrong state name: foo

📌 Opzioni principali: risultati di questo articolo

OpzioneCompitoRisultato in questo articolo
-tMostra solo i socket TCPI socket Unix spariscono e al posto della porta compaiono nomi di servizio come ssh e https
-nMostra i numeri di porta invece dei nomi di servizioIn ss -tn, ssh compare come 22 e https come 443
-lMostra solo i socket in ascolto (LISTEN)ss -tln mostra porte in ascolto come 22, 80 e 443
-uMostra solo i socket UDPLa colonna dello stato di ss -uln è UNCONN su tutte le righe
-pMostra nella colonna Process il programma che usa ciascun socketDa un account normale solo il python3 avviato dal mio account mostra nome e pid; i programmi degli altri account restano vuoti
-sRiassume il numero per tipo invece di elencare i socketestab 9 nella riga TCP coincide con le 9 righe dell'output di state established senza intestazione
-4Mostra solo i socket IPv4In ss -t4ln spariscono le righe che iniziano con [::]
-6Mostra solo i socket IPv6In ss -t6ln spariscono le righe che iniziano con 0.0.0.0 e 127.0.0.1
-HMostra solo le righe dei socket, senza intestazioneIl conteggio delle righe di ss -H -tln | wc -l non include l'intestazione
state STATOLascia solo i socket in quello statoL'output di state established inizia da Recv-Q senza colonna State; un nome inesistente dà [wrong state name: foo]
dport = :PORTAFiltra per la porta dell'altra partedport = :443 mostra due righe di connessioni in uscita verso server https esterni
sport = :PORTAFiltra per la porta localesport = :22 con -l mostra due righe in ascolto sulla porta 22, IPv4 e IPv6
src INDIRIZZOLascia solo i socket di quell'indirizzoss -tln src 127.0.0.1 mostra solo le porte su 127.0.0.1, che accettano connessioni solo dall'interno del server

📎 Altre opzioni: secondo il manuale ufficiale

OpzioneCompito
-a, --allMostra insieme i socket in ascolto e quelli connessi
-r, --resolveRisolve indirizzi e numeri di porta in nomi
-e, --extendedMostra per ogni socket informazioni dettagliate come uid e inode
-o, --optionsMostra informazioni sui timer, come la ritrasmissione TCP e keepalive
-m, --memoryMostra la memoria usata da ciascun socket
-i, --infoMostra informazioni interne di TCP (rtt, cwnd ecc.)
-x, --unixMostra solo i socket di dominio Unix
-w, --rawMostra solo i socket RAW
-f FAMIGLIASeleziona per famiglia di socket, come unix, inet, inet6, link o netlink
-Q, --no-queuesMostra l'output senza le colonne Recv-Q e Send-Q
-K, --killChiude forzatamente i socket che corrispondono al filtro; quelli non supportati dal kernel vengono saltati
-E, --eventsContinua a mostrare i socket man mano che vengono chiusi
-V, --versionStampa le informazioni sulla versione

🔲 Simulatore del comando ss

Nel simulatore qui sotto puoi digitare tu stesso le opzioni e i filtri visti finora e confrontare l'output con quello di [netstat -tln].

Simulatore del comando ssiproute2 6.1.0
[root@server work]#
È una schermata di account normale (user) che funziona solo nel browser; con ↑↓ richiami i comandi digitati prima.

5️⃣ Riepilogo dei socket con ss (-s)

-s mostra un riepilogo del numero per tipo invece dell'elenco dei socket. Secondo la pagina man, non conta l'elenco uno per uno ma raccoglie i numeri da varie statistiche.

ss -s
Total: 340
TCP:   48 (estab 9, closed 15, orphaned 0, timewait 13)

Transport Total     IP        IPv6
RAW       0         0         0
UDP       8         4         4
TCP       33        25        8
INET      41        29        12
FRAG      0         0         0

estab nella riga TCP è il numero di connessioni stabilite in questo momento. Per questo puoi confrontarlo con il numero di righe mostrate da [state established] nello stesso istante.

ss -tn state established | wc -l
10

Togliendo la riga di intestazione dalle 10 righe di output ne restano 9, come l'estab 9 di -s. timewait 13 è il numero di socket TIME-WAIT, visibili solo selezionandoli con [state time-wait].

6️⃣ Comando ss a confronto con netstat

netstat fa parte del pacchetto net-tools, la cui pagina man descrive netstat come un programma ormai quasi in disuso (mostly obsolete) e consiglia di usare ss al suo posto. Gli script scritti per il formato di output di netstat, però, non riescono a leggere l'output di ss così com'è, perché l'ordine delle colonne e la notazione degli indirizzi sono diversi.

Mostrando con i due comandi le porte TCP in ascolto dello stesso server, netstat ha messo lo stato in fondo e ha scritto gli indirizzi IPv6 come :::22.

netstat -tln
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:443             0.0.0.0:*               LISTEN
tcp        0      0 127.0.0.1:8080          0.0.0.0:*               LISTEN
tcp6       0      0 :::22                   :::*                    LISTEN
tcp6       0      0 :::80                   :::*                    LISTEN
tcp6       0      0 :::443                  :::*                    LISTEN

In ss lo stato viene per primo e gli indirizzi IPv6 sono racchiusi tra parentesi quadre, come [::]:22.

ss -tln
State  Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0      128          0.0.0.0:22        0.0.0.0:*
LISTEN 0      511          0.0.0.0:80        0.0.0.0:*
LISTEN 0      511          0.0.0.0:443       0.0.0.0:*
LISTEN 0      511        127.0.0.1:8080      0.0.0.0:*
LISTEN 0      128             [::]:22           [::]:*
LISTEN 0      511             [::]:80           [::]:*
LISTEN 0      511             [::]:443          [::]:*

Le opzioni di netstat più usate corrispondono ai seguenti comandi ss e ip.

netstatComando sostitutivo / cosa mostra
netstat -tlnss -tlnPorte TCP in ascolto, come numeri
netstat -tulpnss -tulpnPorte TCP e UDP in ascolto con i relativi programmi
netstat -tanss -tanTutti i socket TCP, come numeri
netstat -rip routeTabella di routing
netstat -iip -s linkStatistiche delle interfacce di rete
I comandi ip che sostituiscono netstat -r e netstat -i sono indicati nella sezione NOTES della pagina man netstat(8) di net-tools.

🔢 FAQ & contenuti consigliati

Con -4 restano solo i socket IPv4, con -6 solo quelli IPv6. In [ss -t4ln] sono sparite le righe che iniziano con [::], e in [ss -t6ln] quelle che iniziano con 0.0.0.0 e 127.0.0.1.

Se scrivi un indirizzo dopo src, restano solo i socket in ascolto su quell'indirizzo. [ss -tln src 127.0.0.1] ha mostrato solo le porte su 127.0.0.1, non raggiungibili dall'esterno del server.

Con -H compaiono solo le righe dei socket, senza intestazione. Quando conti le righe, come in [ss -H -tln | wc -l], la riga di intestazione non viene conteggiata.

🧭 Contenuti consigliati sui comandi di rete 13 articoli · 3 fonti
🗂️ Comandi di rete
📄 Comando ip 📄 Comandi netstat · ifconfig 📄 Comando nmtui 📄 Comando ss
📄 Comando SSH 📄 Comando rsync 📄 Comando wget 📄 Comandi rz · sz
📄 Comando host 📄 Comando nslookup
📄 Comando iptables 📄 Comando firewall-cmd 📄 Comando certbot

ℹ️ Informativa sull'affiliazione
I contenuti di questo sito includono link di affiliazione. Se un visitatore acquista un prodotto o un servizio tramite uno di questi link, il sito riceve una commissione dal venditore. In questo processo l'importo pagato dall'acquirente (durante le promozioni l'importo scende↓) non aumenta. Prezzi, sconti e disponibilità indicati si riferiscono al momento della stesura e possono differire da quelli reali: prima di acquistare verifica sempre presso il venditore. I prodotti vengono scelti e valutati secondo criteri propri, e le commissioni non influiscono sull'ordine di presentazione né sul contenuto delle valutazioni.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Dimostra di essere umano: 9   +   4   =