Come utilizzare il comando ss su Linux

Il comando ss è un moderno sostituto del classico netstat. Puoi usarlo su Linux per ottenere statistiche sulle tue connessioni di rete. Ecco come lavorare con questo pratico strumento.

Il comando ss contro netstat

Un sostituto per il deprecato comando netstat, ss fornisce informazioni dettagliate su come il tuo computer comunica con altri computer, reti e servizi.

ss visualizza le statistiche per Protocollo di controllo della trasmissione (TCP), Protocollo datagramma utente (UDP), Unix (interprocesso)e prese prime. Prese grezze operare presso il livello OSI di rete, il che significa che le intestazioni TCP e UDP devono essere gestite dal software applicativo, non dal livello di trasporto. Internet Control Message Protocol (ICMP) e i messaggi ping entrambi utilizzano socket raw.

Utilizzando ss

Non è necessario installare ss, poiché fa già parte di una distribuzione Linux aggiornata. Il suo output, tuttavia, può essere molto lungo: abbiamo avuto risultati contenenti oltre 630 righe. Anche i risultati sono molto ampi.

Per questo motivo, abbiamo incluso rappresentazioni testuali dei risultati ottenuti, poiché non si adatterebbero in uno screenshot. Li abbiamo tagliati per renderli più gestibili.

Elenco delle connessioni di rete

L’utilizzo di ss senza opzioni della riga di comando elenca i socket che non sono in ascolto. Cioè, elenca i socket che non sono nello stato di ascolto.

Per vederlo, digita quanto segue:

ss

ss in una finestra di terminale

Output di ss in una finestra di terminale.

Netid State Recv-Q Send-Q          Local Address:Port Peer Address:Port   Process
u_str ESTAB 0      0                           * 41826           * 41827
u_str ESTAB 0      0 /run/systemd/journal/stdout 35689           * 35688
u_str ESTAB 0      0                           * 35550           * 35551
...
u_str ESTAB 0      0                           * 38127           * 38128
u_str ESTAB 0      0 /run/dbus/system_bus_socket 21243           * 21242
u_str ESTAB 0      0                           * 19039           * 19040
u_str ESTAB 0      0 /run/systemd/journal/stdout 18887           * 18885 
u_str ESTAB 0      0 /run/dbus/system_bus_socket 19273           * 17306
icmp6 UNCONN 0     0                           *:ipv6-icmp       *:*
udp   ESTAB 0      0         192.168.4.28%enp0s3:bootpc 192.168.4.1:bootps

Le colonne sono le seguenti:

Netid: il tipo di socket. Nel nostro esempio, abbiamo “u_str”, uno stream Unix, un “udp” e “icmp6”, un socket ICMP IP versione 6. Puoi trovare ulteriori descrizioni di Tipi di socket Linux nelle pagine man di Linux.
Stato: lo stato in cui si trova il socket.
Recv-Q: il numero di pacchetti ricevuti.
Send-Q: il numero di pacchetti inviati.
Indirizzo locale: Porta: l’indirizzo e la porta locali (o valori equivalenti per i socket Unix).
Indirizzo peer: Porta: l’indirizzo e la porta remoti (o valori equivalenti per i socket Unix).

Per i socket UDP, la colonna “Stato” è generalmente vuota. Per i socket TCP può essere uno dei seguenti:

ASCOLTA: solo lato server. Il socket è in attesa di una richiesta di connessione.
SYN-SENT: solo lato client. Questo socket ha effettuato una richiesta di connessione ed è in attesa di vedere se è stato accettato.
SYN-RECEIVED: solo lato server. Questo socket è in attesa di un riconoscimento di connessione dopo aver accettato una richiesta di connessione.
STABILITO: Server e client. È stata stabilita una connessione funzionante tra il server e il client, consentendo il trasferimento dei dati tra i due.
FIN-WAIT-1: Server e client. Questo socket è in attesa di una richiesta di terminazione della connessione dal socket remoto o di un riconoscimento di una richiesta di terminazione della connessione inviata in precedenza da questo socket.
FIN-WAIT-2: Server e client. Questo socket è in attesa di una richiesta di terminazione della connessione dal socket remoto.
CLOSE-WAIT: Server e client. Questo socket è in attesa di una richiesta di terminazione della connessione da parte dell’utente locale.
CHIUSURA: Server e client. Questo socket è in attesa di una conferma della richiesta di terminazione della connessione dal socket remoto.
LAST-ACK: Server e client. Questo socket è in attesa di un riconoscimento della richiesta di terminazione della connessione inviata al socket remoto.
TIME-WAIT: Server e client. Questo socket ha inviato un riconoscimento al socket remoto per fargli sapere che ha ricevuto la richiesta di terminazione del socket remoto. È ora in attesa di assicurarsi che il riconoscimento sia stato ricevuto.
CHIUSO: non c’è connessione, quindi il socket è stato terminato.

Elenco dei socket di ascolto

Per vedere i socket di ascolto aggiungeremo l’opzione -l (ascolto), in questo modo:

ss -l

ss -l in una finestra di terminale.

Netid State  Recv-Q Send-Q               Local Address:Port                  Peer Address:Port Process 
nl    UNCONN 0      0                             rtnl:NetworkManager/535                * 
nl    UNCONN 0      0                             rtnl:evolution-addre/2987              * 
...
u_str LISTEN 0      4096          /run/systemd/private 13349                            * 0 
u_seq LISTEN 0      4096             /run/udev/control 13376                            * 0 
u_str LISTEN 0      4096             /tmp/.X11-unix/X0 33071                            * 0 
u_dgr UNCONN 0      0      /run/systemd/journal/syslog 13360                            * 0 
u_str LISTEN 0      4096    /run/systemd/fsck.progress 13362                            * 0 
u_dgr UNCONN 0      0    /run/user/1000/systemd/notify 32303                            * 0

Queste prese sono tutte scollegate e in ascolto. “Rtnl” significa routing netlink, che viene utilizzato per trasferire informazioni tra il kernel e i processi dello spazio utente.

Elenco di tutti i socket

Per elencare tutti i socket, puoi usare l’opzione -a (all):

ss -a

ss -a in una finestra di terminale.

Netid State  Recv-Q Send-Q    Local Address:Port                 Peer Address:Port    Process 
nl    UNCONN 0      0                  rtnl:NetworkManager/535               * 
nl    UNCONN 0      0                  rtnl:evolution-addre/2987 * 
...
u_str LISTEN 0      100       public/showq 23222                            * 0 
u_str LISTEN 0      100      private/error 23225                            * 0 
u_str LISTEN 0      100      private/retry 23228                            * 0 
...
udp   UNCONN 0      0             0.0.0.0:631                         0.0.0.0:* 
udp   UNCONN 0      0             0.0.0.0:mdns                        0.0.0.0:* 
...
tcp   LISTEN 0      128              [::]:ssh                            [::]:* 
tcp   LISTEN 0      5               [::1]:ipp                            [::]:* 
tcp   LISTEN 0      100             [::1]:smtp                           [::]:*

L’output contiene tutti i socket, indipendentemente dallo stato.

Elenco dei socket TCP

È inoltre possibile applicare un filtro in modo che vengano visualizzati solo i socket corrispondenti. Useremo l’opzione -t (TCP), quindi verranno elencati solo i socket TCP:

ss -a -t

 ss -a -t in una finestra di terminale.

Elenco dei socket UDP

L’opzione -u (UDP) esegue lo stesso tipo di azione di filtro. Questa volta vedremo solo socket UDP:

ss -a -u

ss -a -u in una finestra di terminale.

State  Recv-Q Send-Q    Local Address:Port Peer   Address:Port Process 
UNCONN 0      0               0.0.0.0:631         0.0.0.0:* 
UNCONN 0      0               0.0.0.0:mdns        0.0.0.0:* 
UNCONN 0      0               0.0.0.0:60734       0.0.0.0:* 
UNCONN 0      0         127.0.0.53%lo:domain      0.0.0.0:* 
ESTAB 0       0    192.168.4.28%enp0s3:bootpc 192.168.4.1:bootps 
UNCONN 0      0                   [::]:mdns          [::]:* 
UNCONN 0      0                   [::]:51193         [::]:*

Elenco dei socket Unix

Per vedere solo i socket Unix, puoi includere l’opzione -x (Unix), come mostrato di seguito:

ss -a -x

ss -a -x in una finestra di terminale.

Netid State Recv-Q Send-Q               Local Address:Port  Peer Address:Port    Process 
u_str ESTAB 0      0                                * 41826            * 41827 
u_str ESTAB 0      0                                * 23183            * 23184 
u_str ESTAB 28     0               @/tmp/.X11-unix/X0 52640            * 52639 
...
u_str ESTAB 0      0      /run/systemd/journal/stdout 18887            * 18885 
u_str ESTAB 0      0      /run/dbus/system_bus_socket 19273            * 17306

Elenco raw socket

Il filtro per i socket raw è l’opzione -w (raw):

ss -a -w

ss -a -w in una finestra di terminale.

Elenco dei socket IP versione 4

I socket che utilizzano il protocollo TCP / IP versione 4 possono essere elencati utilizzando l’opzione -4 (IPV4):

ss -a -4

ss -a -4 in una finestra di terminale.

Elenco dei socket IP versione 6

Puoi attivare il filtro IP versione 6 corrispondente con l’opzione -6 (IPV6), in questo modo:

ss -a -6

ss -a -6 in una finestra di terminale.

Elenco dei socket per stato

Puoi elencare i socket in base allo stato in cui si trovano con l’opzione state. Funziona con stati stabiliti, in ascolto o chiusi. Useremo anche l’opzione di risoluzione (-r), che cerca di risolvere gli indirizzi di rete in nomi e le porte in protocolli.

Il seguente comando cercherà le connessioni TCP stabilite e ss proverà a risolvere i nomi:

ss -t -r state established

ss -t -r stato stabilito in una finestra di terminale.

Sono elencate quattro connessioni che si trovano nello stato stabilito. Il nome host, ubuntu20-04, è stato risolto e “ssh” viene mostrato invece di 22 per la connessione SSH sulla seconda riga.

Possiamo ripetere questo per cercare i socket nello stato di ascolto:

ss -t -r state listening

ss -t -r stato in ascolto in una finestra di terminale.

Recv-Q Send-Q Local Address:Port   Peer Address:Port Process 
0      128        localhost:5939        0.0.0.0:* 
0      4096    localhost%lo:domain      0.0.0.0:* 
0      128          0.0.0.0:ssh         0.0.0.0:* 
0      5          localhost:ipp         0.0.0.0:* 
0      100        localhost:smtp        0.0.0.0:* 
0      128             [::]:ssh         [::]:* 
0      5      ip6-localhost:ipp         [::]:* 
0      100    ip6-localhost:smtp        [::]:*

Elenco dei socket per protocollo

È possibile elencare i socket utilizzando un protocollo particolare con le opzioni dport e sport, che rappresentano rispettivamente le porte di destinazione e di origine.

Digitiamo quanto segue per elencare i socket utilizzando il protocollo HTTPS su una connessione stabilita (notare lo spazio dopo la parentesi di apertura e prima di quella di chiusura):

ss -a state established ‘( dport = :https or sport = :https )’

ss -uno stato stabilito '(dport =: https o sport =: https)' in una finestra di terminale.

Possiamo usare il nome del protocollo o la porta solitamente associata a quel protocollo. La porta predefinita per Shell sicuro (SSH) è la porta 22.

Useremo il nome del protocollo in un comando, quindi lo ripeteremo utilizzando il numero di porta:

ss -a ‘( dport = :ssh or sport = :ssh )’
ss -a ‘( dport = :22 or sport = :22 )’

ss -a '(dport =: ssh or sport =: ssh)' in una finestra di terminale.

Come previsto, otteniamo gli stessi risultati.

Elenco delle connessioni a un indirizzo IP specifico

Con l’opzione dst (destinazione), possiamo elencare le connessioni a un particolare indirizzo IP di destinazione.

Digitiamo quanto segue:

ss -a dst 192.168.4.25

ss -a dst 192.168.4.25 in una finestra di terminale.

Identificazione dei processi

Per vedere quali processi stanno usando i socket, puoi usare l’opzione processi (-p), come mostrato di seguito (nota che devi usare sudo):

sudo ss -t -p

sudo ss -t -p in una finestra di terminale.

State Recv-Q Send-Q  Local Address:Port   Peer Address:Port  Process 
ESTAB 0      0       192.168.4.28:57650  54.218.19.119:https users:(("firefox",pid=3378,fd=151)) 
ESTAB 0      0       192.168.4.28:ssh     192.168.4.25:43946 users:(("sshd",pid=4086,fd=4),("sshd",pid=3985,fd=4))

Questo ci mostra che le due connessioni stabilite sui socket TCP vengono utilizzate dal demone SSH e da Firefox.

Un degno successore

Il comando ss fornisce le stesse informazioni fornite in precedenza da netstat, ma in un modo più semplice e accessibile. Puoi controllare il file pagina man per ulteriori opzioni e suggerimenti.