Come usare ss su Linux, comando alternativo al vecchio netstat

Il comando ss, incluso nel pacchetto iproute2, è lo strumento moderno e performante per analizzare le connessioni di rete su Linux, andando a sostituire il vecchio netstat.

Quando si parla di amministrazione di sistemi Linux, l’analisi e il monitoraggio delle connessioni di rete rappresentano attività fondamentali per garantire la sicurezza, la disponibilità e la corretta configurazione dei servizi. Il comando netstat è rimasto per anni punto di riferimento ma da tempo l’alternativa ss (socket statistics) si è affermata come strumento moderno, rapido e più efficiente per l’ispezione delle connessioni di rete e dei socket attivi sul sistema.

Cos’è il comando ss e perché è importante

ss è un comando Linux appartenente al pacchetto iproute2, progettato per fornire informazioni dettagliate sui socket di rete del kernel. Un socket è un endpoint di comunicazione: è l’interfaccia software che un’applicazione usa per inviare o ricevere dati tramite la rete. Può essere locale (es. socket UNIX tra processi) o remoto (es. socket TCP/UDP su IP).

Rispetto a netstat, ss si distingue per velocità e performance, maggiore dettaglio e filtri avanzati.

Il comando ss è infatti in grado di accedere direttamente ai dati attingendo al kernel Linux, senza passare per librerie obsolete o file temporanei. Offre inoltre informazioni granulari sulle connessioni, incluse statistiche sui pacchetti, stato TCP e processi associati. Ricorrendo ai filtri avanzati, si possono eseguire query mirate per tipo di connessione, porta, stato, PID, UID e altro.

ss è molto più veloce di netstat nel mostrare le connessioni attive proprio perché accede direttamente ai file della memoria kernel (/proc/net/), mentre netstat utilizza librerie più lente e meccanismi più datati per raccogliere le stesse informazioni.

ss su Linux: esempi pratici di utilizzo

Per visualizzare tutte le connessioni TCP attive e ottenere l’elenco delle connessioni TCP in qualsiasi stato, con informazioni su indirizzo locale e remoto, basta digitare quanto segue:

ss -t

Se si volesse accedere ai socket in ascolto su TCP e UDP, con PID e nome processo, basta digitare il seguente comando:

ss -tulnp

Per ottenere il nome del processo, è generalmente necessario anteporre il comando sudo o guadagnare i diritti di root con sudo -i.

L’opzione “n” evita la risoluzione dei nomi a dominio usando il resolver DNS. Se si volesse abilitarla basta digitare ss -tulp.

Per trovare i socket associati a un dato PID (process ID), ad esempio il processo con identificativo 1234, basta scrivere così:

ss -p | grep pid=1234

Filtrare connessioni TCP stabilite

Il comando seguente mostra solo connessioni TCP attualmente attive e stabilite, ad esempio sessioni SSH o HTTP aperte:

ss -t state established

Usando un approccio molto simile, si può chiedere al comando ss di mostrare le connessioni TCP su una porta specifica (es. 22 SSH):

ss -t sport = :22

Nel comando è possibile specificare -u per cercare le comunicazioni in essere su UDP, attraverso una specifica porta.

Quando è utile usare il comando ss

I possibili campi applicativi del comando ss su Linux sono davvero estesi. In generale, se si attiva un software dotato di funzionalità server sulla propria macchina, è immediatamente possibile verificare che la porta di comunicazione sia correttamente posta in ascolto (si legge LISTEN al di sotto della colonna State).

Prima di applicare regole firewall, ad esempio con ufw, è importante conoscere quali porte e servizi sono realmente in ascolto: ss fornisce queste informazioni in modo chiaro e subito riconoscibile.

Sfruttando la potenza di Linux, è possibile abbinare l’uso di ss con altri strumenti. Ad esempio, come abbiamo già visto in precedenza, si può ricorrere al comando grep per filtrare l’output ed estrarre solo le informazioni di proprio interesse.

Servendosi nel comando watch, uno dei 25 comandi Linux folli che cambiano il modo di lavorare, si può chiedere l’esecuzione automatica di ss a intervalli regolari. Per esempio, digitando quanto segue è possibile impostare un monitoraggio in tempo reale, a distanza di un secondo tra una richiesta e l’altra:

watch -n 1 ss -tulnp

ss e il supporto per gli indirizzi IPv4 e IPv6

Il comando ss offre pieno supporto per la visualizzazione dei socket IPv4 e IPv6, rendendolo uno strumento indispensabile per ambienti di rete moderni che impiegano entrambi gli stack. Di default, ss mostra sia le connessioni IPv4 che quelle IPv6, ma è possibile filtrare specificamente l’una o l’altra tipologia per facilitare l’analisi del traffico.

Per elencare solo le connessioni TCP su IPv4: ss -4 -t

Per visualizzare solo le connessioni TCP su IPv6: ss -6 -t

Come visto in precedenza, si può sostituire -u a -t per concentrarsi soltanto sugli scambi di dati su protocollo UDP.

Le colonne Local Address:Port e Peer Address:Port riportano chiaramente l’uso dell’indirizzo IP nella versione corrispondente. Gli indirizzi IPv6, ad esempio, sono mostrati nel formato standard esadecimale compresso e racchiusi tra parentesi quadre quando necessario. Questo livello di dettaglio è fondamentale per distinguere tra connessioni dual-stack, connessioni locali ::1, oppure legate a specifici prefissi IPv6 pubblici o link-local.

Il progressivo abbandono di netstat su Windows e Linux

Il comando netstat è nato nei sistemi Unix e Windows ha adottato una versione simile con l’introduzione dello stack TCP/IP nei suoi sistemi operativi. L’obiettivo è lo stesso: fornire statistiche di rete, informazioni sulle connessioni attive e porte in ascolto.

Digitando netstat nella finestra del prompt dei comandi di Windows o in una finestra PowerShell, anche sul sistema operativo Microsoft si ottiene l’elenco delle connessioni di rete in essere. In ambiente Windows, netstat -ano fornisce tutte le connessioni con indirizzi e PID associati.

Come su Linux ss è il successore di netstat, il sostituto Windows è il modulo PowerShell NetTCPIP, aggiunto a partire da Windows 8.x e Windows Server 2012. Le cmdlet Get-NetTCPConnection e Get-NetUDPEndpoint, ad esempio, mostrano rispettivamente tutte le connessioni TCP attive e le porte UDP in ascolto.

Tornando al “pinguino”, molte distribuzioni Linux (i.e. Debian, Ubuntu, Fedora) non installano più netstat di default, preferendo ss. Alcuni ambienti minimalisti non offrono nemmeno più il pacchetto net-tools, contenente il vecchio comando netstat.

Ti consigliamo anche

Link copiato negli appunti