Verificar se a porta está aberta ou fechada em um servidor Linux?

209

Como posso verificar se uma porta está escutando em um servidor Linux?

James Anderson
fonte
2
Não está muito claro o que você está perguntando. O que você quer dizer com "aberto"? Você quer dizer que algum servidor está escutando nessa porta? Ou você quer dizer que é permitido pelo firewall do sistema? Ou o que?
David Schwartz
Acho que uma porta está sendo bloqueada no meu servidor e quero desbloqueá-la / abri-la novamente.
James Anderson
14
netstat -an | grep PORTNUMBER | grep -i listenSe a saída estiver vazia, a porta não está em uso.
Automatix

Respostas:

187

Você pode verificar se um processo escuta em uma porta TCP ou UDP netstat -tuplen.

Para verificar se algumas portas são acessíveis externamente (provavelmente é o que você deseja), você pode usar um scanner de portas como o Nmap de outro sistema. A execução do Nmap no mesmo host que você deseja verificar é totalmente inútil para o seu propósito.

joschi
fonte
54
GNU netstat sabe os parâmetros -t, -u, -p, -l, -e, e -n. Graças ao analisador de opções, ele pode ser expresso como -tuplen. linux.die.net/man/8/netstat
joschi:
3
Além disso, o telnetcomando geralmente oferece suporte apenas ao TCP; portanto, você não terá sorte se o serviço que você deseja verificar executar em outro protocolo.
Joschi
1
Sim, eu estava usando janelas, daí a confusão.
Dexter
2
nc é (melhor) alternativa ao telnet. Também suporta UDP.
Tsvetomir Dimitrov
1
Use-o com sudo: sudo netstat -tuplen. Isso fornecerá processos de propriedade não apenas de você, mas também de outros, e imprimirá detalhes adicionais (como PID / Nome do programa) se eles ainda não forem exibidos como um usuário não raiz.
John Red
102

A maneira mais rápida de testar se uma porta TCP está aberta (incluindo firewalls de hardware que você possa ter) é digitando, de um computador remoto (por exemplo, sua área de trabalho):

telnet myserver.com 80

O que tentará abrir uma conexão com a porta 80 nesse servidor. Se você tiver um tempo limite ou negar, a porta não está aberta :)

Adrian Macneil
fonte
1
diz que ele não reconhece "telnet" como um comando ...
James Anderson
6
"yum install telnet" para instalar o pacote do cliente telnet.
Cjc 7/09
8
Escrito acima:if you get a time out or deny, the port is not open
Industrial
2
E se você não tiver permissões para instalar o telnet? Existe outra ferramenta padrão?
KC Baltz
3
Eu tentei "telnet myhost 22" e recebi um tempo limite. Mas posso entrar nessa máquina. ?!
Torsten Bronger
30

OK, em resumo, você tem um servidor no qual pode fazer login. Você quer ver se algo está escutando em alguma porta. Como root, execute:

netstat -nlp

isso mostrará uma lista de processos atendendo nas portas TCP e UDP. Você pode digitalizá-lo (ou grep) pelo processo de seu interesse e / ou pelos números de porta que espera ver.

Se o processo que você espera não estiver lá, inicie esse processo e verifique novamente o netstat. Se o processo estiver lá, mas estiver escutando em uma interface e porta que você não esperava, haverá um problema de configuração (por exemplo, ele pode estar escutando, mas apenas na interface de loopback, para você ver 127.0.0.1:3306 e nenhuma outra linha para a porta 3306, no caso da configuração padrão para MySQL).

Se o processo estiver concluído e estiver ouvindo a porta que você espera, tente executar um "telnet" nessa porta a partir do seu Macbook em seu escritório / residência, por exemplo,

 telnet xxxxxxxxxxxx.co.uk 443

Isso testará se (assumindo portas padrão) se há um servidor da Web configurado para SSL. Observe que este teste usando telnet só funcionará se o processo estiver escutando em uma porta TCP. Se for uma porta UDP, você também pode tentar com o cliente que deseja usar para se conectar a ela. (Vejo que você usou a porta 224. Este é um masqdialer e não faço ideia do que é isso).

Se o serviço estiver lá, mas você não puder acessá-lo externamente, haverá um firewall bloqueando você. Nesse caso, execute:

 iptables -L -n

Isso mostrará todas as regras de firewall conforme definidas no seu sistema. Você pode postar isso, mas, geralmente, se você não estiver permitindo tudo na cadeia INPUT, provavelmente precisará permitir explicitamente o tráfego na porta em questão:

 iptables -I INPUT -p tcp --dport 224 -j ACCEPT

Ou algo nesse sentido. Não execute os comandos do firewall às cegas, com base no que um estranho lhe disse na Internet. Considere o que você está fazendo.

Se o seu firewall na caixa estiver permitindo o tráfego desejado, sua empresa de hospedagem pode estar executando um firewall (por exemplo, eles estão permitindo apenas SSH (22 / tcp), HTTP (80 / tcp) e HTTPS (443 / tcp) e negar todo o tráfego recebido). Nesse caso, você precisará abrir um tíquete de suporte técnico para resolver esse problema, embora eu suponha que possa haver algo no seu cPanel que permita isso.

cjc
fonte
Você poderia adicionar como desfazer o comando iptables -I? Obrigado!!
Evgeny
1
"iptables -D" seguido do que mais você tiver após o "-I" no comando original. Basicamente, procure a documentação.
Cjc
11

Eu uso o combo de netstate lsof:

netstat -an | grep <portnumber>
lsof -i:<portnumber>

Para ver se a porta está sendo usada e o que está sendo usada.

Warren
fonte
nada pede, com ou sem sudo
Dheeraj Thedijje
1
@DheerajThedijje - depois que a porta não está aberta
Warren
Sim, não foi, entendi.
Dheeraj Thedijje
7

Se você estiver conectado ao sistema e puder executar um comando como root, poderá verificar a saída do iptables

iptables -L -vn

isso listará as regras de firewall e quais portas são alvo aberto ACCEPTe qualquer porta explicitamente fechada REJECT.

user619714
fonte
E se você tiver firewalld, é mais simples firewall-cmd --query-port=port/protocol, por exemplo firewall-cmd --query-port=80/tcp.
Agostino
6

lsof -i :ssh listará todos os processos com a porta ssh aberta, conexões de escuta e ativas.

pgs
fonte
Prefixe sudose não retornar nenhuma saída.
Elias Lynn