É possível executar ping em um endereço: port?

212

Não gosto de redes e tenho a seguinte pergunta relacionada ao comando ping do Linux .

Posso apenas executar ping em um endereço? Por exemplo:

miner@raspberrypi ~ $ ping onofri.org
PING onofri.org (67.222.36.105) 56(84) bytes of data.
64 bytes from onofri.org (67.222.36.105): icmp_req=1 ttl=47 time=202 ms
64 bytes from onofri.org (67.222.36.105): icmp_req=2 ttl=47 time=206 ms
64 bytes from onofri.org (67.222.36.105): icmp_req=3 ttl=47 time=215 ms

Ou também posso executar ping em um endereço: port , por exemplo: onofri.org:80 ?

Se eu tentar este não funciona:

miner@raspberrypi ~ $ ping onofri.org:80
ping: unknown host onofri.org:80

É possível executar ping como algo como address: port ? Se for possível, por que o que eu tentei não funciona?

AndreaNobili
fonte
8
O que você está tentando realizar? A verificação da operação correta do serviço exige que você realmente consulte o serviço e avalie a resposta. Um servidor da web pode, por exemplo, aceitar sua conexão, mas retornar um erro devido a uma configuração incorreta.
Daniel B
5
Isso faz parte do que eu gosto no Telnet. você pode se conectar a um servidor da web e digitar GET /index.html HTTP\1.1e ver a resposta 200 (ou código de erro) junto com a marcação resultante.
18118 Frank Thousand
7
@FrankThomas HTTP\1.1? Realmente?
glglgl
5
@Navin Talvez HTTP/1.1...
glglgl
3
@glglgl; o que? você nunca coloca um hack para onde uma barra deve ir? mas você está correto, deve ser uma barra.
Frank Thomas

Respostas:

20

Você pode usar o Paping , um teste de porta TCP de plataforma cruzada, emulando a funcionalidade do ping (ping da porta)

(veja também Github como code.google.com foi depreciado)

paping -p 80 google.com
kxmp
fonte
8
Alguma explicação sobre o que este programa faz seria útil.
21715 David Schwartz
16
para quem encontrar essa resposta, como eu, apenas descobrir que o paping não está em nenhum repositório e é um código antigo que nem compila no ARM - role para baixo até a resposta 'hping'. É um drop-in perfeito para ping quando você precisa testar uma porta e é facilmente acessível em vários repositórios (por exemplo, Ubuntu, Arch), incluindo o ARM.
Mark
Como posso instalar paping? Eu visitei o repositório, mas não há lançamentos. Ah, deixa pra lá .. o código do google não estava acessível para mim no momento.
Shayan
310

Portas são um conceito de UDP e TCP . As mensagens de ping são tecnicamente chamadas de Solicitação de eco ICMP e Resposta de eco ICMP, que fazem parte do ICMP . ICMP, TCP e UDP são "irmãos"; eles não são baseados um no outro, mas são três protocolos separados que são executados sobre o IP.

Portanto, você não pode pinguma porta. O que você pode fazer é usar um scanner de porta como nmap.

nmap -p 80 onofri.org

Você também pode usar telnet onofri.org 80, conforme sugerido em uma das outras respostas (isso causará um erro se a porta estiver fechada ou filtrada).

BenjiWiebe
fonte
22
+1 você entende direito. O ICMP é construído sobre o IP, que possui um conceito de endereços IP, mas não portas. TCP e UDP também estão no topo do IP, e são esses protocolos que adicionam "portas". ICMP, TCP e UDP estão todos no mesmo "nível" em termos do protocolo pelo qual são transportados.
Jason C
14
+1. Muitas pessoas pensam que, se não conseguem executar ping em algo, não conseguem se conectar a ele ... mas, como você diz, o ICMP é diferente do TCP e UDP: se você pretende servir, digamos, uma página da Web no TCP 80, do que você só precisa abrir TCP 80 no firewall, nada mais (assim Ping para o mesmo IP poderia (... deve) ser bloqueado, por exemplo!)
Olivier Dulac
6
Apenas para manter as informações precisas, o ICMP não é um protocolo de camada de transporte como TCP ou UDP. Como vários protocolos, ele não se encaixa totalmente nos modelos conceituais de rede, mas geralmente é considerado um protocolo de camada de rede / internetwork como o IP. Por vezes, também foi referido como um protocolo L3.5.
YLearn
2
@ BenjiWiebe, concordou, mas, novamente, para maior precisão, a declaração deve ser feita e foi por isso que a adicionei. Tudo o que foi dito até agora é que ICMP, TCP e UDP estão relacionados. O comentário mais votado chega ao ponto de dizer que todos estão no mesmo "nível". Embora isso não faça diferença para o usuário médio, há muitos usuários não médios que visitam este site.
YLearn
4
@OlivierDulac Não sei se você deve bloqueá-lo. A maioria dos servidores da web que conheço deixa em aberto. O ICMP faz a internet girar. Por que você quer que as pessoas pensem que não podem alcançá-lo, se podem?
Cruncher
86

Eu uso o Telnet , uma vez que está embutido em muitas plataformas sem downloads adicionais.

Basta usar o comando telnet para conectar-se à porta que você deseja testar. Se você receber a mensagem abaixo ou uma mensagem do próprio serviço, a porta estará ativa.

Minty16 ~ $ telnet localhost 139
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.

Se você conhece a sequência de comandos do serviço ao qual está se conectando, pode digitar um comando ( HTTP / FTP GET, por exemplo) e observar a resposta e a saída no terminal. Isso é muito útil para testar o próprio serviço, pois mostra informações de erro enviadas ao cliente, como erros de HTTP 500.

Se você receber uma mensagem de que a conexão foi recusada, a porta está fechada.

Minty16 ~ $ telnet localhost 5000
Trying 127.0.0.1...
telnet: Unable to connect to remote host: Connection refused
Frank Thomas
fonte
8
Além disso, se a tela ficar completamente preta, é um sinal de que você também está conectado.
Tensigh
Excelente sugestão. Eu costumava usar isso para testar se um servidor da web estava ativo quando um navegador da web não era uma opção fácil.
Brandon
@Brandon como quando sshing em máquinas dev ^. ^
Cruncher
As ferramentas de desenvolvedor nos navegadores são muito mais fáceis, porque ainda enviam todos os cabeçalhos de solicitação HTTP adequados, mas você pode inspecionar a resposta HTTP completa. Então, novamente, se você quiser personalizar a solicitação também, o telnet é o caminho a seguir.
Lightness Races em Orbit
Acho que todas as respostas aqui perdem a informação mais crucial. Tecnicamente, não seria possível "executar ping" em uma porta da seguinte maneira? Você pode estabelecer uma conexão TCP / UDP e conta quantos milissegundos foram necessários para estabelecer essa conexão.
David
47

Sim, use HPing para fazer isso:

$ sudo hping -S -p 80 google.com
HPING google.com (p5p1 77.237.27.37): S set, 40 headers + 0 data bytes
len=46 ip=77.237.27.37 ttl=58 id=25706 sport=80 flags=SA seq=0 win=29200 rtt=7.5 ms
len=46 ip=77.237.27.37 ttl=58 id=25707 sport=80 flags=SA seq=1 win=29200 rtt=7.4 ms
len=46 ip=77.237.27.37 ttl=58 id=25708 sport=80 flags=SA seq=2 win=29200 rtt=8.5 ms
len=46 ip=77.237.27.37 ttl=58 id=25709 sport=80 flags=SA seq=3 win=29200 rtt=7.8 ms
^C
--- google.com hping statistic ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 7.4/7.8/8.5 ms

Observe que ele precisa de privilégios de root (ou recursos do SELinux) para criar pacotes IP brutos, assim como o ping (que é provavelmente o suid no seu sistema).

d33tah
fonte
3
Eu gostaria que essa fosse a "resposta aceita". O hping foi facilmente encontrado em vários repositórios, ao contrário do paping, que é um código antigo que não compila no ARM. Também diferente do NMAP, haping retorna um código de status que é facilmente testável a partir de um script de shell, por isso é um substituto perfeito para onde você usaria o ping. Obrigado por esta resposta, uma pena que eu não rolei o suficiente para vê-la e precisei encontrá-la em outro site.
Mark
Não consigo instalar o hping no ubuntu .. Pacote não encontrado .. Mas encontrei hping3.É o mesmo que hping3? @ d33tah
Shayan
Ok, eu tentei hping3e pinga todas as portas .. Não importa fechado ou aberto .. Como posso saber se uma porta está fechada ou aberta?
Shayan
46

Você pode usar o netcat para conectar-se a uma porta específica e verificar se obtém uma conexão. O sinalizador -v aumentará a verbosidade para mostrar se a porta está aberta ou fechada. O sinalizador -z fará com que o netcat saia assim que tiver uma conexão. Você pode usar os códigos de saída através de $? para ver se a conexão foi estabelecida ou não.

$ nc -zv localhost 22
localhost [127.0.0.1] 22 (ssh) open
$ echo $?
0
$ nc -zv localhost 23
localhost [127.0.0.1] 23 (telnet) : Connection refused
$ echo $?
1

Além disso, você pode usar mtr com o sinalizador -T para tcp e o sinalizador -P para especificar uma porta. Isso fará algo semelhante a um traceroute sobre TCP em vez de apenas ICMP. Isso pode ser um exagero, no entanto.

suspiro Eu tenho que editar para adicionar este bit, já que não podemos colocar código nos comentários. O Knoppix pode estar fazendo algo diferente com sua versão do netcat, mas é isso que recebo do Linux Mint

$ date;nc -z -w 1 www.google.com 8000;date
Fri Jun 20 15:55:26 PDT 2014
Fri Jun 20 15:55:27 PDT 2014
$ date;nc -z -w 4 www.google.com 8000;date
Fri Jun 20 15:55:33 PDT 2014
Fri Jun 20 15:55:37 PDT 2014

$ nc -h
[v1.10-40]
Nomes falsos
fonte
O problema é que, se você tentar nc -z www.google.com 8000 , pode levar um longo tempo - mais de 5 segundos. Se eu fizer -w 1, leva 5 segundos. Se o fizer -w 3, leva três vezes mais tempo .. 15 flashes do cursor, 15 segundos. -w 1deve ser um segundo, mas testado no cygwin.,. 5 segundos. É super rápido quando há um servidor na porta, mas um pouco lento quando não existe.
barlop
amaldiçoar nenhuma nova linha nos comentários ... Isso parece ser um bug do cygwin. Testar com o linux Mint mostra um atraso de quantos segundos forem especificados. executou isso para testar: date; nc-zw5 www.google.com 8000; date
Falsenames
Também votei em @BenjiWiebe com as solicitações do nmap. O nc é mais fácil de inserir em um script, mas é muito mais fácil usar o nmap visualmente.
Falsenames
Tentando no knoppix. nc -zv -w 1 www.google.com Como você faz com que ele tente apenas uma vez? Quando eu tento sim, o -w 1 funciona, mas a cada segundo ele tenta novamente até eu pressionar Ctrl-C.
barlop
Não tenho certeza do que a versão Knoppix de 'nc -zv -w 1 www.google.com 80' está fazendo. Isso funciona bem no meu sistema, consultando uma vez e soltando exatamente como -z deveria. Além disso, sem o número da porta especificado, o meu falha dizendo que não há porta especificada.
Falsenames
18

Você também pode usar nping(parte de nmap):

$ nping -p 80 localhost

Starting Nping 0.6.00 ( http://nmap.org/nping ) at 2014-06-23 11:57 CEST
SENT (0.0015s) Starting TCP Handshake > localhost:80 (127.0.0.1:80)
RECV (0.0016s) Handshake with localhost:80 (127.0.0.1:80) completed
SENT (1.0027s) Starting TCP Handshake > localhost:80 (127.0.0.1:80)
RECV (1.0027s) Handshake with localhost:80 (127.0.0.1:80) completed
SENT (2.0038s) Starting TCP Handshake > localhost:80 (127.0.0.1:80)
RECV (2.0039s) Handshake with localhost:80 (127.0.0.1:80) completed
SENT (3.0050s) Starting TCP Handshake > localhost:80 (127.0.0.1:80)
RECV (3.0050s) Handshake with localhost:80 (127.0.0.1:80) completed
SENT (4.0061s) Starting TCP Handshake > localhost:80 (127.0.0.1:80)
RECV (4.0062s) Handshake with localhost:80 (127.0.0.1:80) completed

Max rtt: 0.032ms | Min rtt: 0.008ms | Avg rtt: 0.012ms
TCP connection attempts: 5 | Successful connections: 5 | Failed: 0 (0.00%)
Tx time: 4.00575s | Tx bytes/s: 99.86 | Tx pkts/s: 1.25
Rx time: 4.00575s | Rx bytes/s: 49.93 | Rx pkts/s: 1.25
Nping done: 1 IP address pinged in 4.01 seconds
nyuszika7h
fonte
6
nping --tcp -p 80 localhost
K-Gun
Eu testei QUALQUER porta (portas que não estão abertas) e ainda recebo dois apertos de mão o tempo todo ...
Shayan
8

Você pode fazer isso no shell com o Python como um liner não tão curto:

$ portping() { python <<<"import socket; socket.setdefaulttimeout(1); socket.socket().connect(('$1', $2))" 2> /dev/null && echo OPEN || echo CLOSED; }
$ portping 8.8.8.8 54
CLOSED
$ portping 8.8.8.8 53
OPEN
AX-Labs
fonte
7

Apenas para referência, queria compartilhar um post de Vivek Gite: https://www.cyberciti.biz/faq/ping-test-a-specific-port-of-machine-ip-address-using-linux-unix/# comment-920398

Ele lista várias maneiras, algumas das quais já estão publicadas aqui. Mas o mais surpreendente para mim nada mais foi do que bash:

(echo >/dev/tcp/{host}/{port}) &>/dev/null && echo "opened" || echo "closed"
(echo >/dev/udp/{host}/{port}) &>/dev/null && echo "opened" || echo "closed"
(echo >/dev/tcp/www.cyberciti.biz/22) &>/dev/null && echo "Opened 22" || echo "Closed 22"
(echo >/dev/tcp/www.cyberciti.biz/443) &>/dev/null && echo "Opened 443" || echo "Closed 443"

Ou uma versão super simples: basta observar a saída do seguinte padrão de comando:

echo >/dev/{tcp|udp}/{host}/{port}

Útil ao trabalhar com contêineres de encaixe aleatórios.

Jacek
fonte
looking at the output- apenas inspecionar o código de retorno $?pode ser útil. Também paira sobre portas fechadas, podem ser alguns tempo limite pode ser configurado em qualquer lugar ...
vp_arth
Esta solução parece limpa, mas echo >/dev/tcp/{hostname}/{portnumber}não termina quando a porta está fechada. E echo >/dev/tcp/{hostname}/{portnumber}não mostra nada, embora a porta esteja aberta e eu possa vê-la em um navegador.
miguelmorin
Oi mmorin, qual sistema operacional você usa? No Ubuntu, ele se comporta conforme o esperado: se a porta estiver fechada, eu entendo Connection refused. Caso contrário, ele sai mostrando nada e echo $?mostrando o código de saída1
Jacek
3

Eu adiciono watchferramenta aqui:

watch nmap -p22,80 google.com

Every 2,0s: nmap -p22,80 google.com   Mon Jun 15 16:46:33 2015

Starting Nmap 6.40 ( http://nmap.org ) at 2015-06-15 16:46 NOVT
Nmap scan report for google.com (127.0.0.1)
Host is up (0.0012s latency).
rDNS record for 127.0.0.1: google.com
PORT     STATE  SERVICE
22/tcp open   ssh
80/tcp closed http

Nmap done: 1 IP address (1 host up) scanned in 0.18 seconds
vp_arth
fonte
3

É simples com nmap

exemplos:

#sintaxis
nmap -p [port] hostName
#first is command, after scan ports, type port - port or range ports, and ip or name of website...

## Scan port 80
nmap -p 80 onofri.org

## Scan TCP port 80
nmap -p T:80 onofri.org

## Scan UDP port 53
nmap -p U:53 onofri.org

## Scan two ports ##
nmap -p 80,443 onofri.org

## Scan port ranges ##
nmap -p 80-200 onofri.org

## Combine all options ##
nmap -p U:53,111,137,T:21-25,80,139,8080 onofri.org
nmap -p U:53,111,137,T:21-25,80,139,8080 server1.cyberciti.biz
nmap -v -sU -sT -p U:53,111,137,T:21-25,80,139,8080 onofri.org

## Scan all ports with * wildcard ##
nmap -p "*" 192.168.1.1

## Scan top ports i.e. scan $number most common ports ##
nmap --top-ports 5 onofri.org
nmap --top-ports 10 onofri.org

Para mais informações, consulte:

digite na linha de comando o seguinte: man nmap

http://www.cyberciti.biz/networking/nmap-command-examples-tutorials/ http://www.tecmint.com/nmap-command-examples/

DarckBlezzer
fonte
1

Você está tentando testar a comunicação ou obter uma resposta da porta 80 nesse nó? PINGtentará estabelecer comunicação com um host específico por meio do ICMP que não tem nada a ver com portas.

Em vez disso, tente http://nmap.org/ para verificar as informações da porta e testar a comunicação:

nmap -v -p 80 onofri.org
Quijote Shin
fonte
1
Não tenho certeza de qual versão do nmap você está usando. No meu sistema, ele exige que -v e -p sejam separados como 'nmap -v -p 80 onofri.org'. Isso ocorre porque -v e -vv significam coisas diferentes, -v levando mais vs como argumento.
Falsenames