Quais são as alternativas para verificar portas abertas, além do telnet?

24

Podemos usar o seguinte para testar a porta telnet VIA; no exemplo a seguir testamos a porta 6667:

[root@kafka03 ~]# telnet kafka02 6667
Trying 103.64.35.86...
Connected to kafka02.
Escape character is '^]'.
^CConnection closed by foreign host

Como em algumas máquinas não podemos usar o telnet (por razões internas), quais são as alternativas para verificar portas, como telnet?

yael
fonte
Perl é uma opção?
Jeff Schaller
5
Esses "motivos internos" podem impedir você de usar outro software de digitalização de portas. Eu conhecia um cara que trabalhava em um banco e teve seu contrato rescindido porque ele tinha uma cópia do nmap em seu PC. Ele o estava usando para fins relacionados ao trabalho, mas estava na lista de proibidos, então ele foi escoltado para fora do prédio.
21416 Roger
2
Perl é uma opção? - YES
yael 4/11
2
Observe que o telnet é um protocolo sofisticado. O telnetutilitário desativa o comportamento do protocolo se uma porta for fornecida na linha de comando. Então, ele se comporta de maneira parecida netcat, apenas com a detecção de final de linha.
Rexkogitans
Uma questão mais independente do sistema operacional, que nem sequer sugere a varredura de portas, é unix.stackexchange.com/questions/499694 .
JdeBP 10/02

Respostas:

23

Se você estiver usando o Bash Shell, poderá usar seu recurso para verificar se uma porta está aberta ou fechada:

(timeout 1 bash -c '</dev/tcp/127.0.0.1/17500 && echo PORT OPEN || echo PORT CLOSED') 2>/dev/null
PORT OPEN

(timeout 1 bash -c '</dev/tcp/127.0.0.1/7500 && echo PORT OPEN || echo PORT CLOSED') 2>/dev/null
PORT CLOSED

Observe que, se o servidor não responder após 1 segundo, o tempo limite é atingido, os comandos são 'interrompidos e, portanto, nada é impresso.

in2nix4life
fonte
5
Talvez você deva usar o nome do host da pergunta (kafka02) em vez de 127.0.0.1, o que faz parecer que ele funciona apenas com o loopback.
Dmitry Grigoryev
11
(timeout 1 bash -c '</dev/tcp/www.google.com/444 && echo PORT OPEN || echo PORT CLOSED') 2>/dev/nullnão imprime nada para mim. (timeout 1 bash -c '</dev/tcp/www.google.com/444' && echo PORT OPEN || echo PORT CLOSED) 2>/dev/nullfuncionou como esperado (imprime PORT FECHADO). Anote a localização do '.
Thecarpy
o que você obtém no bash -c '</ dev / tcp / kafka01 / 6667'
yael
então ecoa $? (Se 0 porta, em seguida, é aberto,)
yael
No IIRC, esse recurso bash costumava ser desativado no Debian há algum tempo. É um truque legal, mas nem sempre funciona.
AnonymousLurker
32

O netcat é uma opção.

nc -zv kafka02 6667
  • -z = define nc para simplesmente procurar daemons que estão escutando, sem enviar dados para eles
  • -v = ativa o modo detalhado
Steve
fonte
é possível obter saída padrão do nc? porque eu quero escrever na minha festa de roteiro
yael
2
Leia a documentação! Sem opções ncse comporta muito parecido telnet.
Henrik - pare de machucar Monica
sim eu li os docs mas sinalizador -w não funciona como tempo limite
yael
exemplo - c -v -w 1 kafka01 6667 (não temos tempo limite)
yael 4/11/18
nc -v -w 3 kafka01 6667 Ncat: Versão 6.40 ( nmap.org/ncat ) Ncat: conectado a 10.164.235.85:6667. (Isso ainda não reagir)
yael
23

O padrão-ouro é, sem dúvida, nmap( nmap.org ), mas normalmente requer raiz para os "melhores resultados". No entanto, binários independentes estão disponíveis e é possível executá-lo como um usuário sem privilégios, apenas com recursos degradados. Por exemplo, em vez de uma synvarredura furtiva ( -sS), ela volta a uma varredura de conexão TCP padrão ( -sT). Isso é funcionalmente equivalente ao netcat, mas com os bons recursos acelerados de vários hosts que ele possui.

Um exemplo:

not-root$ nmap -sT google.com
Starting Nmap 7.70 ( https://nmap.org ) at 2018-11-04 21:01 GMT
Nmap scan report for google.com (172.217.23.14)
Host is up (0.12s latency).
rDNS record for 172.217.23.14: lhr35s01-in-f14.1e100.net
Not shown: 998 filtered ports
PORT    STATE SERVICE
80/tcp  open  http
443/tcp open  https
Landak
fonte
11
Na maioria das organizações, o nmap é considerado uma ferramenta de verificação e não se pode usar o nmap sem a devida autorização. Além disso, se for uma instância do EC2, também é necessária autorização da AWS.
al mamun
4

Se Perl é uma opção, você pode usar seu IO::Socketmódulo para testar uma conexão com um host e porta específicos; o script abaixo codifica o TCP como protocolo (que é o que o telnet usaria):

#!/usr/bin/perl -w

# tries to connect to the given IP and port (tcp)

use strict;
use IO::Socket;

my $desthost = shift or die "Usage: $0 host port\n";
my $destport = shift or die "Usage: $0 host port\n";

gethostbyname($desthost) || die "Invalid host given\n";

my $handle = IO::Socket::INET->new(
        PeerAddr => $desthost,
        PeerPort => $destport,
        Proto    => 'tcp')
    or die "can't connect to $desthost:$destport: $!\n";
close $handle;
print "Success!\n"

Saída de amostra de uma porta fechada:

$ ./above-script kafka02 6667
can't connect to kafka02:6667: Connection refused

Exemplo de saída de uma porta aberta:

$ ./above-script kafka02 4200
Success!
Jeff Schaller
fonte
2

O arquivo de dispositivo / dev / tcp e / dev / udp podem ser usados ​​em vez do telnet. Exemplo: eco 0> /dev/tcp/103.64.35.86/6667. Em seguida, verifique o status da saída usando #echo $? . Se o status de saída for 0, a porta está aberta. Se o status de saída for diferente de zero, a porta estará fechada. Para verificar pacotes udp, use echo 0> /dev/udp/103.64.35.86/6667.

al mamun
fonte
no meu redhat 7 em / dev /, não temos tcp
yael
ls / dev / tcp / ls: não pode acessar / dev / tcp /: Nenhum tal lima ou diretório
yael
em qual sistema operacional você testá-lo?
yael
@yael, você não receberá / dev / tcp ou / dev / udp enquanto ls. tente exatamente o mesmo comando no seu shell e você obterá o resultado. a propósito, eu frequentemente usá-lo em RHEL6,7
al Mamun
0
ss -lt 

esse é outro comando que você pode usar.

Dileep Jayasundara
fonte
Funciona apenas para máquinas locais, acredito que a questão é verificar as portas abertas de um host remoto.
Alex Baranowski