Comando ss: controllare porte e processi su Linux, confronto con netstat
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 5Netid 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 * 46066199Per 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 -tState 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:httpsSe aggiungi anche -n, i numeri di porta restano tali e non vengono convertiti in nomi di servizio.
ss -tnState 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:443Le 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 -tlnState 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 -tlState 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 -ulnState 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 -tulpnNetid 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 -tlnpState 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/fdls: cannot open directory '/proc/1/fd': Permission deniedI 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 = :8000State 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 = :443State 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.
4️⃣ Opzioni di filtro per stato e porta di ss
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 establishedRecv-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:443Le 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 = :443State 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:443Usando sport insieme a -l puoi controllare solo se quella porta è in ascolto.
ss -tln sport = :22State 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:51114TIME-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-waitRecv-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]:80Se 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 fooss: wrong state name: foo📌 Opzioni principali: risultati di questo articolo
| Opzione | Compito | Risultato in questo articolo | |
|---|---|---|---|
| -t | Mostra solo i socket TCP | I socket Unix spariscono e al posto della porta compaiono nomi di servizio come ssh e https | |
| -n | Mostra i numeri di porta invece dei nomi di servizio | In ss -tn, ssh compare come 22 e https come 443 | |
| -l | Mostra solo i socket in ascolto (LISTEN) | ss -tln mostra porte in ascolto come 22, 80 e 443 | |
| -u | Mostra solo i socket UDP | La colonna dello stato di ss -uln è UNCONN su tutte le righe | |
| -p | Mostra nella colonna Process il programma che usa ciascun socket | Da un account normale solo il python3 avviato dal mio account mostra nome e pid; i programmi degli altri account restano vuoti | |
| -s | Riassume il numero per tipo invece di elencare i socket | estab 9 nella riga TCP coincide con le 9 righe dell'output di state established senza intestazione | |
| -4 | Mostra solo i socket IPv4 | In ss -t4ln spariscono le righe che iniziano con [::] | |
| -6 | Mostra solo i socket IPv6 | In ss -t6ln spariscono le righe che iniziano con 0.0.0.0 e 127.0.0.1 | |
| -H | Mostra solo le righe dei socket, senza intestazione | Il conteggio delle righe di ss -H -tln | wc -l non include l'intestazione | |
| state STATO | Lascia solo i socket in quello stato | L'output di state established inizia da Recv-Q senza colonna State; un nome inesistente dà [wrong state name: foo] | |
| dport = :PORTA | Filtra per la porta dell'altra parte | dport = :443 mostra due righe di connessioni in uscita verso server https esterni | |
| sport = :PORTA | Filtra per la porta locale | sport = :22 con -l mostra due righe in ascolto sulla porta 22, IPv4 e IPv6 | |
| src INDIRIZZO | Lascia solo i socket di quell'indirizzo | ss -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
| Opzione | Compito | |
|---|---|---|
| -a, --all | Mostra insieme i socket in ascolto e quelli connessi | |
| -r, --resolve | Risolve indirizzi e numeri di porta in nomi | |
| -e, --extended | Mostra per ogni socket informazioni dettagliate come uid e inode | |
| -o, --options | Mostra informazioni sui timer, come la ritrasmissione TCP e keepalive | |
| -m, --memory | Mostra la memoria usata da ciascun socket | |
| -i, --info | Mostra informazioni interne di TCP (rtt, cwnd ecc.) | |
| -x, --unix | Mostra solo i socket di dominio Unix | |
| -w, --raw | Mostra solo i socket RAW | |
| -f FAMIGLIA | Seleziona per famiglia di socket, come unix, inet, inet6, link o netlink | |
| -Q, --no-queues | Mostra l'output senza le colonne Recv-Q e Send-Q | |
| -K, --kill | Chiude forzatamente i socket che corrispondono al filtro; quelli non supportati dal kernel vengono saltati | |
| -E, --events | Continua a mostrare i socket man mano che vengono chiusi | |
| -V, --version | Stampa 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].
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 -sTotal: 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 0estab 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 -l10Togliendo 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 -tlnActive 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 :::* LISTENIn ss lo stato viene per primo e gli indirizzi IPv6 sono racchiusi tra parentesi quadre, come [::]:22.
ss -tlnState 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.
| netstat | Comando sostitutivo / cosa mostra |
|---|---|
| netstat -tln | ss -tlnPorte TCP in ascolto, come numeri |
| netstat -tulpn | ss -tulpnPorte TCP e UDP in ascolto con i relativi programmi |
| netstat -tan | ss -tanTutti i socket TCP, come numeri |
| netstat -r | ip routeTabella di routing |
| netstat -i | ip -s linkStatistiche delle interfacce di rete |
🔢 FAQ & contenuti consigliati











ℹ️ 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.