Можно ли пинговать адрес: порт?

212

Я не в сети, и у меня есть следующий вопрос, связанный с командой Linux ping .

Могу ли я пинговать только адрес? Например:

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

Или я также могу пропинговать адрес: порт , например: onofri.org:80 ?

Если я попробую это, это не сработает:

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

Можно ли пинговать что-то вроде адреса: порт ? Если это возможно, почему не работает то, что я пробовал?

AndreaNobili
источник
8
Что вы пытаетесь достичь? Проверка правильности работы службы требует, чтобы вы фактически запросили службу и оценили ответ. Веб-сервер может, например, принять ваше соединение, но вернуть ошибку из-за неправильной конфигурации.
Даниэль Б
5
Это часть того, что мне нравится в Telnet. Вы можете подключиться к веб-серверу, набрать GET /index.html HTTP\1.1и увидеть ответ 200 (или код ошибки) вместе с результирующей разметкой.
Фрэнк Томас
7
@FrankThomas HTTP\1.1? В самом деле?
glglgl
5
@ Навин Возможно HTTP/1.1...
glglgl
3
@glglgl; что? Вы никогда не взламываете, куда должен идти слеш? но вы правы, это должен быть слеш.
Фрэнк Томас

Ответы:

20

Вы можете использовать Paping , кросс-платформенное тестирование TCP-порта, эмулирующее функциональность ping (порт ping)

(см. также Github, так как code.google.com устарел)

paping -p 80 google.com
kxmp
источник
8
Некоторое объяснение того, что делает эта программа, было бы полезно.
Дэвид Шварц
16
для тех, кто находит этот ответ, как я, только найти paping нет ни в каких репозиториях и это древний код, который даже не скомпилируется на ARM - прокрутите вниз до ответа «hping». Это идеальный пинг-ин для ping, когда вам нужно протестировать порт, и он легко доступен в различных репозиториях (например, Ubuntu, Arch), включая ARM.
Марк
Как я могу установить paping? Я посетил репо, но релизов нет. Ах, неважно .. Код Google не был доступен для меня в то время.
Шаян
310

Порты - это концепция UDP и TCP . Сообщения Ping технически называются ICMP Echo Request и ICMP Echo Reply, которые являются частью ICMP . ICMP, TCP и UDP являются «родственниками»; они не основаны друг на друге, а представляют собой три отдельных протокола, которые работают поверх IP.

Поэтому вы не можете pingпорт. Что вы можете сделать, это использовать сканер портов, как nmap.

nmap -p 80 onofri.org

Вы также можете использовать telnet onofri.org 80, как предложено в одном из других ответов (Это даст ошибку, если порт закрыт или отфильтрован).

BenjiWiebe
источник
22
+1 ты правильно понял. ICMP построен поверх IP, который имеет концепцию IP-адресов, но не портов. TCP и UDP также находятся поверх IP, и именно эти протоколы добавляют «порты». ICMP, TCP и UDP находятся на одном и том же «уровне» с точки зрения протокола, по которому они переносятся.
Джейсон С
14
+1. Многие, многие думают, что если они не могут пропинговать что-то, они не могут подключиться к нему ... но, как вы говорите, ICMP отличается от TCP и UDP: если вы намереваетесь обслуживать, скажем, веб-страницу по TCP 80, кроме того, что вам нужно только открыть TCP 80 на брандмауэре, ничто иное (например, Ping к тому же IP может (... должен!) быть заблокирован, например)
Оливье Дюлак
6
Просто для обеспечения точности информации ICMP не является протоколом транспортного уровня, таким как TCP или UDP. Как и ряд протоколов, он не совсем вписывается в концептуальные модели сети, но обычно считается протоколом сетевого / межсетевого уровня, как и IP. Это также иногда упоминалось как протокол L3.5.
YLearn
2
@BenjiWiebe, согласился, но опять же, для точности следует сделать заявление, поэтому я добавил его. Пока что сказано только то, что ICMP, TCP и UDP связаны между собой. Комментарии, получившие наибольшее количество голосов, доходят даже до того, что они все находятся на одном и том же «уровне». Хотя это не имеет значения для среднего пользователя, есть много не средних пользователей, которые посещают этот сайт.
YLearn
4
@OlivierDulac Я не знаю, стоит ли вам это блокировать. Большинство известных мне веб-серверов оставляют их открытыми. ICMP заставляет интернет ходить по кругу. Почему вы хотите, чтобы люди думали, что не смогут связаться с вами, если смогут?
Cruncher
86

Я использую Telnet , поскольку он встроен во множество платформ без дополнительных загрузок.

Просто используйте команду telnet для подключения к порту, который вы хотите проверить. Если вы получаете сообщение ниже или сообщение от самой службы, то порт активен.

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

Если вам известна последовательность команд для службы, к которой вы подключаетесь, вы можете ввести команду (например, HTTP / FTP GET ) и наблюдать за ответом и выводом в терминале. Это очень полезно для тестирования самого сервиса, так как он покажет вам информацию об ошибках, отправленную клиенту, например, ошибки HTTP 500.

Если вы получили сообщение об отказе в соединении, порт закрывается.

Minty16 ~ $ telnet localhost 5000
Trying 127.0.0.1...
telnet: Unable to connect to remote host: Connection refused
Фрэнк Томас
источник
8
Кроме того, если экран становится полностью черным, это означает, что вы тоже подключены.
Tensigh
Отличное предложение. Я использовал это для проверки работоспособности веб-сервера, когда веб-браузер был непростым вариантом.
Брэндон
@ Брандону нравится, когда он заходит в машины разработчика ^. ^
Cruncher
Инструменты для разработчиков в браузерах намного проще, потому что они все равно будут отправлять все правильные заголовки HTTP-запросов, но вы можете проверить полный HTTP-ответ. Опять же, если вы хотите настроить запрос, то telnet - это то, что вам нужно.
Гонки легкости на орбите
Я думаю, что все ответы здесь пропускают самую важную часть информации. Технически, не возможно ли будет "пинговать" порт следующим образом? Вы можете установить соединение TCP / UDP и подсчитать, сколько миллисекунд потребовалось, чтобы установить это соединение.
Дэвид
48

Да, используйте HPing для этого:

$ 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

Обратите внимание, что для создания необработанных IP-пакетов необходимы привилегии root (или возможности SELinux), например, ping (что, скорее всего, подходит для вашей системы).

d33tah
источник
3
Я бы хотел, чтобы это был «принятый ответ». hping легко найти в нескольких репозиториях, в отличие от paping, который является древним жестким кодом, который не компилируется в ARM. Кроме того, в отличие от NMAP, хэпинг возвращает код состояния, который легко проверить из сценария оболочки, поэтому он является отличной заменой тому, где вы в противном случае использовали бы ping. Спасибо за этот ответ, позор, что я не прокрутил достаточно далеко, чтобы увидеть его, и вместо этого мне пришлось искать его на другом веб-сайте.
Марк
Я не могу установить hping в Ubuntu .. Пакет не найден .. Но я нашел. hping3Это так же, как hping3? @ d33tah
Шаян
Хорошо, я попытался, hping3и он пингует все порты .. Не имеет значения, закрыт или открыт .. Как я могу определить, закрыт порт или открыт?
Шаян
46

Вы можете использовать Netcat для подключения к определенному порту, чтобы увидеть, если вы получаете соединение. Флаг -v увеличит детализацию, чтобы показать, открыт порт или закрыт. Флаг -z заставит netcat выйти, когда у него будет соединение. Затем вы можете использовать коды выхода через $? чтобы увидеть, было ли установлено соединение или нет.

$ 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

Кроме того, вы можете использовать mtr с флагом -T для tcp и флагом -P для указания порта. Это будет делать что-то похожее на трассировку через TCP, а не только ICMP. Это может быть излишним, однако.

вздох я должен отредактировать, чтобы добавить этот бит, так как мы не можем поместить код в комментарии. Knoppix может делать что-то другое с его версией netcat, но это то, что я получаю из 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]
Falsenames
источник
проблема в том, что если вы попробуете, nc -z www.google.com 8000 это может занять много времени - 5 секунд плюс. Если я это сделаю, -w 1то это займет 5 секунд. Если я это сделаю, -w 3то это займет примерно в 3 раза больше. 15 миганий курсора, 15 секунд. -w 1должна быть одна секунда, но проверена на cygwin. 5 секунд. Это супер быстро, когда в порту есть сервер, но немного медленно, когда его нет.
Barlop
не проклинайте переводы строк в комментариях ... Это похоже на ошибку в cygwin. Тестирование с linux Mint показывает задержку в указанное время. запустил это, чтобы проверить: дата; nc-zw5 www.google.com 8000; дата
Falsenames
Я также проголосовал за @BenjiWiebe с запросами nmap. nc легче вставить в скрипт, но НАМНОГО проще использовать nmap визуально.
Falsenames
Пробую это в knoppix. nc -zv -w 1 www.google.com Как вы можете просто попробовать один раз? Когда я пытаюсь, да, работает -w 1, но каждую секунду он повторяется, пока я не нажму Ctrl-C.
Бароп
Не уверен, что делает Knoppix 'nc -zv -w 1 www.google.com 80'. Это прекрасно работает в моей системе, запрашивая один раз и отбрасывая, как и -z, как предполагается. Кроме того, без указания номера порта мой отказывает, говоря, что не указан порт.
Falsenames
18

Вы также можете использовать nping(часть 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
источник
6
nping --tcp -p 80 localhost
K-Gun
Я проверяю ЛЮБОЙ порт (порты, которые не открыты), и я все еще получаю два рукопожатия все время ...
Шаян
8

Вы можете сделать это в оболочке с Python как не очень короткий вкладыш:

$ 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
источник
7

Просто для справки, хотел поделиться постом от Vivek Gite: https://www.cyberciti.biz/faq/ping-test-a-specific-port-of-machine-ip-address-using-linux-unix/# комментарии-920398

Он перечисляет различные способы, некоторые из которых уже размещены здесь. Но самым удивительным для меня было не более чем 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"

Или супер простая версия: просто посмотрите на вывод следующего шаблона команды:

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

Полезно при работе со случайными док-контейнерами.

Яцек
источник
looking at the output- только проверка кода возврата $?может быть полезной. Кроме того, он зависает на закрытых портах, может быть какое-то время ожидания может быть настроено где угодно ...
vp_arth
Это решение выглядит аккуратно, но echo >/dev/tcp/{hostname}/{portnumber}не заканчивается, когда порт закрыт. И echo >/dev/tcp/{hostname}/{portnumber}ничего не показывает, хотя порт открыт, и я вижу его в браузере.
Мигельморин
Привет мморин, какую ОС ты используешь? На Ubuntu он ведет себя как положено: если порт закрыт, я получаю Connection refused. В противном случае он не показывает ничего и echo $?показывает код выхода1
Яцек
3

Я добавляю watchинструмент здесь:

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
источник
3

Это просто с nmap

Примеры:

#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

Для получения дополнительной информации см. Это:

введите в командной строке это: man nmap

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

DarckBlezzer
источник
1

Вы пытаетесь проверить связь или получить ответ от порта 80 на этом узле? PINGбудет пытаться установить связь с конкретным хостом через ICMP, который не имеет ничего общего с портами.

Вместо этого попробуйте http://nmap.org/ проверить информацию о порте и проверить связь:

nmap -v -p 80 onofri.org
Quijote Shin
источник
1
Не уверен, какую версию nmap вы используете. В моей системе требуется разделить -v и -p как 'nmap -v -p 80 onofri.org'. Это потому, что -v и -vv означают разные вещи, -v принимает больше v в качестве аргумента.
Falsenames