Introduzione

Quando si cercano di risolvere i problemi di connettività di rete o problemi specifici dell'applicazione, una delle prime cose da verificare dovrebbe essere quali porte sono effettivamente in uso sul sistema e quali applicazioni sono in ascolto su una porta specifica.

Questo articolo spiega come scoprire quali servizi sono in ascolto sulle porte utilizzando i comandi netstat, sse e lsof. Le istruzioni sono applicabili a tutti i sistemi operativi basati su Linux e Unix come macOS.

Le porte in uso

La porta di rete è identificata dal suo numero, dall'indirizzo IP associato e dal tipo di protocollo di comunicazione come TCP o UDP.

La porta di ascolto è una porta di rete su cui è in ascolto un'applicazione o un processo, che funge da endpoint di comunicazione.

Ogni porta di ascolto può essere aperta o chiusa (filtrata) utilizzando un firewall. In termini generali, una porta aperta è una porta di rete che accetta pacchetti in entrata da posizioni remote.

Non puoi avere due servizi che ascoltano la stessa porta sullo stesso indirizzo IP.

Ad esempio, se si esegue un server Web Apache in ascolto su porte 80 e 443 si tenta di installare Nginx, l'avvio successivo non verrà avviato poiché le porte HTTP e HTTPS sono già in uso.

Controlla le porte di ascolto con netstat

netstat è uno strumento da riga di comando che può fornire informazioni sulle connessioni di rete.

Per elencare tutte le porte TCP o UDP in ascolto, inclusi i servizi che utilizzano le porte e lo stato del socket, utilizzare il comando seguente:

sudo netstat -tunlp

Le opzioni utilizzate in questo comando hanno il seguente significato:

  • -t - Mostra le porte TCP.
  • -u - Mostra le porte UDP.
  • -n - Mostra gli indirizzi numerici invece di risolvere gli host.
  • -l - Mostra solo le porte di ascolto.
  • -p - Mostra il PID e il nome del processo. Queste informazioni vengono visualizzate solo se si esegue il comando come root o utente sudo.

L'output sarà simile al seguente:

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      5469/systemd-resolv
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1304/sshd
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      21662/mysqld
tcp6       0      0 :::22                   :::*                    LISTEN      1304/sshd
udp        0      0 127.0.0.53:53           0.0.0.0:*                           5469/systemd-resolv
udp        0      0 0.0.0.0:68              0.0.0.0:*                           811/dhclient

Le colonne importanti nel nostro caso sono:

  • Proto - Il protocollo utilizzato dal socket.
  • Local Address - L'indirizzo IP e il numero di porta su cui è in ascolto il processo.
  • PID/Program name - Il PID e il nome del processo.

Se vuoi filtrare i risultati usa il comando grep . Ad esempio, per trovare quale processo è in ascolto sulla porta TCP 22, digitare:

sudo netstat -tnlp | grep :22

L'output mostra che su questa macchina la porta 22 è utilizzata dal server SSH:

tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1304/sshd
tcp6       0      0 :::22                   :::*                    LISTEN      1304/sshd

Se l'output è vuoto significa che sulla porta non è in ascolto nulla.

È inoltre possibile filtrare l'elenco in base a criteri, ad esempio PID, protocollo, stato e così via.

netstat è obsoleto e sostituito con ss e ip, ma è comunque uno dei comandi più utilizzati per controllare le connessioni di rete.

Controlla le porte di ascolto con ss

ss è il nuovo netstat. Manca alcune delle funzionalità di netstat ma espone più stati TCP ed è leggermente più veloce. Le opzioni di comando sono per lo più le stesse, quindi il passaggio da netstat a ss  non è difficile.

Per ottenere un elenco di tutte le porte di ascolto con ss digitare:

sudo ss -tunlp

L'output è simile a quello riportato da netstat:

Netid  State    Recv-Q   Send-Q      Local Address:Port       Peer Address:Port
udp    UNCONN   0        0           127.0.0.53%lo:53              0.0.0.0:*       users:(("systemd-resolve",pid=5469,fd=12))
udp    UNCONN   0        0                 0.0.0.0:68              0.0.0.0:*       users:(("dhclient",pid=811,fd=6))
tcp    LISTEN   0        128         127.0.0.53%lo:53              0.0.0.0:*       users:(("systemd-resolve",pid=5469,fd=13))
tcp    LISTEN   0        128               0.0.0.0:22              0.0.0.0:*       users:(("sshd",pid=1304,fd=3))
tcp    LISTEN   0        80              127.0.0.1:3306            0.0.0.0:*       users:(("mysqld",pid=21662,fd=28))
tcp    LISTEN   0        128                  [::]:22                 [::]:*       users:(("sshd",pid=1304,fd=4))

Controlla le porte di ascolto con lsof

lsof è una potente utility da riga di comando che fornisce informazioni sui file aperti dai processi.

In Linux, tutto è un file. Puoi pensare a un socket come a un file che scrive sulla rete.

Per ottenere un elenco di tutte le porte TCP in ascolto con il comando lsof:

sudo lsof -nP -iTCP -sTCP:LISTEN

Le opzioni utilizzate sono le seguenti:

  • -n - Non convertire i numeri di porta in nomi di porta.
  • -p - Non risolvere i nomi host, mostra gli indirizzi numerici.

-iTCP -sTCP:LISTEN  - Mostra solo i file di rete con stato TCP ASCOLTA.

COMMAND     PID            USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
sshd       1304            root    3u  IPv4   19961      0t0  TCP *:22 (LISTEN)
sshd       1304            root    4u  IPv6   19976      0t0  TCP *:22 (LISTEN)
systemd-r  5469 systemd-resolve   13u  IPv4 3618073      0t0  TCP 127.0.0.53:53 (LISTEN)
mysqld    21662           mysql   28u  IPv4   46021      0t0  TCP 127.0.0.1:3306 (LISTEN)

La maggior parte dei nomi delle colonne di output sono autoesplicativi:

  • COMMAND, PID, USER- il nome, il PID e l'utente che esegue il programma associato alla porta.
  • NAME - Il numero di porta.

Per trovare quale processo è in ascolto su una determinata porta, ad esempio sulla porta 3306 usare il seguente comando:

sudo lsof -nP -iTCP:3306 -sTCP:LISTEN

L'output mostra che la porta 3306 è utilizzata dal server MySQL:

COMMAND   PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
mysqld  21662 mysql   28u  IPv4  46021      0t0  TCP 127.0.0.1:3306 (LISTEN)

Per maggiori informazioni visita la pagina man lsof e leggi tutte le altre potenti opzioni di questo strumento.

Conclusione

Abbiamo visto diversi comandi che puoi utilizzare per verificare quali porte sono in uso sul tuo sistema e come trovare quale processo è in ascolto su una porta specifica.