#howto - Controllare se una porta è in uso su Linux
A volte, specialmente per chi possiede un server, controllare quale porta è in uso da parte di un servizio su Linux è essenziale, e potrebbe non essere così immediato, principalmente per chi possiede solamente un terminale.
In questa guida vedremo come capire se una porta che desideriamo sfruttare è usata da qualcosa oppure no tramite dei comodi comandi.
Controllare se una porta è in uso con lsof
Il primo comando che possiamo utilizzare su Linux per controllare se una porta sta venendo utilizzata è lsof
. La sua sintassi potrebbe essere complessa, ma in realtà l’output è abbastanza semplice da comprendere se si segue questa guida.
Come prima cosa, utilizziamo lsof seguito dai parametri -i, -P e -n, che vi spieghiamo subito a cosa servono:
- -i serve per selezionare i files IPv46 (senza di questo l’output sarebbe davvero lungo e incomprensibile)
- -P rimuove i nomi delle porte
- -n rimuove gli hostnames
Ora che abbiamo compreso ciò, eseguiamo il comando nel terminale:
lsof -i -P -n
e dovremmo ottenere un output simile al seguente:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
ntpd 689 ntp 16u IPv4 15409 0t0 UDP *:123
ntpd 689 ntp 17u IPv6 15410 0t0 UDP *:123
ntpd 689 ntp 18u IPv4 15415 0t0 UDP 127.0.0.1:123
ntpd 689 ntp 19u IPv6 15416 0t0 UDP [::1]:123
ntpd 689 ntp 21u IPv6 16427 0t0 UDP [IPv6]:123
ntpd 689 ntp 22u IPv4 18538 0t0 UDP IP:123
La prima colonna indica il comando che sta utilizzando una determinata porta, indicata alla fine di NAME, mentre il resto è piuttosto auto-esplicativo. Per filtrare i risultati e ottenere le porte che sono in ascolto e non stabilite, possiamo usare il comando di prima seguito da un grep:
lsof -i -P -n | grep LISTEN
e a quel punto l’output sarà più pulito come il seguente:
sshd 1020 root 3u IPv4 17731 0t0 TCP *:PORTA (LISTEN)
sshd 1020 root 4u IPv6 17751 0t0 TCP *:3743 (LISTEN)
gitea 1021 git 15u IPv6 19147 0t0 TCP *:3000 (LISTEN)
memcached 1027 memcached 26u IPv4 17524 0t0 TCP 127.0.0.1:PORTA (LISTEN)
redis-ser 1031 redis 4u IPv4 17635 0t0 TCP 127.0.0.1:PORTA (LISTEN)
vsftpd 1035 root 4u IPv6 17306 0t0 TCP *:PORTA (LISTEN)
postmaster 1068 postgres 3u IPv6 18172 0t0 TCP [::1]:PORTA (LISTEN)
postmaster 1068 postgres 4u IPv4 18173 0t0 TCP 127.0.0.1:PORTA (LISTEN)
Come è possibile vedere, in questo modo possiamo sapere esattamente quale porta sta venendo utilizzata in quell’esatto momento e da quale software. A quel punto, possiamo decidere noi cosa fare in base ai nostri bisogni.
Controllare se una porta è in uso con netstat o ss
Oltre a lsof
, altri due comandi a nostra disposizione sono netstat
o ss
. Il primo potrebbe essere stato deprecato per alcuni, pertanto è arrivato ss
a sostituirlo, ma non del tutto.
netstat
Se avete la possibilità di usare netstat
, proviamo a sfruttarlo con la seguente sintassi:
netstat -tulpn | grep LISTEN
L’output che dovremmo avere a questo punto è il seguente:
tcp 0 0 127.0.0.1:PORTA 0.0.0.0:* LISTEN 1117/mongod
tcp 0 0 127.0.0.1:PORTA 0.0.0.0:* LISTEN 1031/redis-server 1
tcp 0 0 127.0.0.1:PORTA 0.0.0.0:* LISTEN 1027/memcached
tcp 0 0 0.0.0.0:PORTA 0.0.0.0:* LISTEN 1084/nginx: master
tcp 0 0 127.0.0.1:PORTA 0.0.0.0:* LISTEN 1068/postmaster
tcp 0 0 0.0.0.0:PORTA 0.0.0.0:* LISTEN 1084/nginx: master
tcp 0 0 127.0.0.1:PORTA 0.0.0.0:* LISTEN 57349/netdata
tcp 0 0 0.0.0.0:PORTA 0.0.0.0:* LISTEN 57349/netdata
tcp 0 0 0.0.0.0:PORTA 0.0.0.0:* LISTEN 1020/sshd
In maniera simile a lsof
, abbiamo delle comode colonne che ci indicano varie cose: la prima è il protocollo di rete, in questo caso tcp, e le altre due che dobbiamo guardare sono la quarta, che indica le porte in uso, e l’ultima, che svela invece i servizi che stanno utilizzando delle porte. In questo modo, dovrebbe essere ulteriormente chiaro il servizio che usa una porta e il PID (Process ID) che possiamo fermare all’evenienza.
ss
A differenza di netstat
, ss
si deve utilizzare due volte e con parametri diversi se si vuole capire esattamente quale servizio sta facendo uso di una porta. Il primo:
ss -tulwn
ci darà la porta utilizzata da un determinato IP come si può vedere nella colonna centrale segnata da Local Address:Port, mentre per sapere che servizio sta utilizzando la porta dovremo sfruttare il comando senza il parametro -n:
ss -tulw
Dopo aver fatto ciò, possiamo renderci conto del fatto che l’output è molto simile al precedente, ma che al posto della porta viene indicata il servizio che la sta utilizzando. Per questo motivo è sempre meglio eseguire il comando nella prima maniera e poi nel secondo.