Como posso verificar quais portas estão ocupadas e quais estão livres na minha máquina Linux?

30

Existe algum comando de linha de comando ou qualquer outra maneira de encontrar e listar os números de porta ocupados e gratuitos na minha máquina Linux?

Jeegar Patel
fonte

Respostas:

41

O comando

netstat -antu

mostrará todas as portas tcp e udp em uso. A saída será mais ou menos assim:

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

O número após os dois pontos no campo Endereço local mostra a porta em uso. Se o estado for "LISTEN", significa uma porta que está sendo usada para conexões de entrada. Se o endereço IP no Local Addresscampo for 0.0.0.0, significa que as conexões de entrada serão aceitas em qualquer endereço IP atribuído a uma interface - portanto, isso significa conexões originadas fora da sua máquina.

Se disse localhostou 127.0.0.1estaria apenas aceitando conexões da sua máquina.

Além disso, se você adicionar o -pparâmetro e executá-lo como root, ele mostrará o processo que abriu a 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

Qualquer coisa que não seja mostrada como sendo usada é gratuita, no entanto, os usuários (contas sem privilégios) só podem abrir portas acima de 1023.

Paulo
fonte
significa que as conexões recebidas serão aceitas em qualquer endereço IP atribuído a uma interface - portanto, isso significa que as conexões originam fora da sua máquina , você não cometeu um erro aqui? Você provavelmente quis dizer que as conexões serão aceitas, se vierem em qualquer endereço atribuído a uma determinada interface, independentemente de sua origem. A origem das conexões de entrada provavelmente está especificada na próxima coluna Endereço externo. Então, ele está lá, se alguém tem 0.0.0.0 como um valor, isso significa que as conexões serão aceitas a partir de qualquer lugar, inclusive fora da máquina
user907860
1
@ user907860 Pode não estar claro, mas a distinção que estou fazendo é entre 0.0.0.0 vs 127.0.0.1 - o último só aceita conexões da sua máquina, porque está escutando um endereço IP não roteado. Onde 0.0.0.0 significa qualquer endereço na sua máquina e, desde que sejam roteados, as conexões podem ser feitas a partir de outras máquinas.
Paul
Apenas FYI, -antupode ser escrito como -tuna🐟
Abdennour TOUMI
13

Eu mesmo compilei uma pequena lista .

Alguns dos meus favoritos são:

netstat -tulpn
lsof -i -n -P
robin
fonte
7

Uma maneira boa e confiável de verificar se há portas abertas está usando ss(substituindo as obsoletas netstat ), é utilizável em um script sem exigir privilégios elevados (ou seja sudo).

Uso: opção -lpara escutar portas, opção -npara ignorar a resolução DNS e o filtro na porta de origem NN: src :NN(substitua NNpela porta que você deseja monitorar). Para mais opções, consulteman ss

ss -ln src :NN

Exemplos:

[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 em um script, usando grep, podemos testar se a saída contém a porta que solicitamos. Exemplo com a porta 80 em uso (veja acima):

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)

Exemplo com a porta 81 não em uso (veja acima)

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)
Thomas
fonte