Come posso verificare quali porte sono occupate e quali porte sono libere sulla mia macchina Linux?


30

Esiste un comando da riga di comando o un altro modo per trovare ed elencare i numeri di porta occupati e liberi sulla mia macchina Linux?

Risposte:


41

Il comando

netstat -antu

mostrerà tutte le porte tcp e udp in uso. L'output sarà simile al seguente:

Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 0.0.0.0:59753           0.0.0.0:*               LISTEN

Il numero dopo i due punti nel campo Indirizzo locale indica la porta in uso. Se lo stato è "ASCOLTA" significa una porta che sta utilizzando per le connessioni in entrata. Se l'indirizzo IP nel Local Addresscampo 0.0.0.0indica che le connessioni in entrata saranno accettate su qualsiasi indirizzo IP assegnato a un'interfaccia, quindi ciò significa dalle connessioni che hanno origine al di fuori della macchina.

Se lo dicesse localhosto 127.0.0.1accetterebbe solo connessioni dalla tua macchina.

Inoltre, se aggiungi il -pparametro ed eseguilo come root, mostrerà il processo che ha aperto la porta:

$ sudo netstat -antup
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:59753           0.0.0.0:*               LISTEN      860/rpc.statd

Tutto ciò che non viene mostrato come in uso è gratuito, tuttavia gli utenti (account non privilegiati) possono aprire solo porte superiori a 1023.


significa che le connessioni in entrata saranno accettate su qualsiasi indirizzo IP assegnato a un'interfaccia - quindi questo significa che da connessioni che hanno origine al di fuori della macchina non hai fatto un errore qui? Probabilmente intendevi dire che le connessioni saranno accettate, se arrivano su qualsiasi indirizzo assegnato a una determinata interfaccia, indipendentemente dalla loro origine. L'origine delle connessioni in entrata è probabilmente specificata nella colonna successiva Indirizzo esterno. Quindi è lì, se uno ha 0.0.0.0 come valore, significa che le connessioni saranno accettate da qualsiasi luogo, anche al di fuori della macchina
user907860

1
@ user907860 Potrebbe non essere chiaro, ma la distinzione che sto facendo è tra 0.0.0.0 e 127.0.0.1 - quest'ultimo accetterà solo connessioni dal tuo computer, perché è in ascolto su un indirizzo IP non instradato. Laddove 0.0.0.0 indica qualsiasi indirizzo sulla macchina e, a condizione che vengano instradati, è possibile stabilire connessioni da altre macchine.
Paolo,

Solo FYI, -antupuò essere scritto come -tuna🐟
Abdennour TOUMI il


7

Un modo valido e affidabile per verificare la presenza di porte aperte è l'utilizzo ss(sostituzione per i deprecati netstat ), è utilizzabile in uno script senza richiedere privilegi elevati (ad es sudo.).

Utilizzo: opzione -lper le porte di ascolto, opzione -nper bypassare la risoluzione DNS e filtro sulla porta di origine NN: src :NN(sostituire NNcon la porta che si desidera monitorare). Per ulteriori opzioni, vedereman ss

ss -ln src :NN

Esempi:

[user@server ~]# ss -ln src :80
State       Recv-Q Send-Q       Local Address:Port   Peer Address:Port
LISTEN      0      128                      *:80                *:*
[user@server ~]# ss -ln src :81
State       Recv-Q Send-Q       Local Address:Port   Peer Address:Port

E in uno script, usando grep, possiamo verificare se l'output contiene la porta richiesta. Esempio con la porta 80 in uso (vedi sopra):

myport=80
# count the number of occurrences of port $myport in output: 1= in use; 0 = not in use
result=$(ss -ln src :$myport | grep -Ec -e "\<$myport\>")
if [ "$result" -eq 1 ]; then
  echo "Port $myport is in use (result == $result) "
else
  echo "Port $myport is NOT in use (result == $result) "
fi

# output:
Port 80 is in use (result == 1)

Esempio con la porta 81 non in uso (vedere sopra)

myport=81
result=$(ss -ln src :$myport | grep -Ec -e "\<$myport\>")
if [ "$result" -eq 1 ]; then
  echo "Port $myport is in use (result == $result) "
else
  echo "Port $myport is NOT in use (result == $result) "
fi

# output:
Port 81 is NOT in use (result == 0)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.