Проверьте, доступен ли порт в удаленной системе (без telnet)

В старые времена мы использовали telnet , чтобы узнать, открыт ли порт на удаленном хосте: telnet hostname port будет пытаться подключиться к любому порту на любом хосте и предоставить вам доступ к необработанному потоку TCP.

В наши дни системы, над которыми я работаю, не установлены telnet (по соображениям безопасности), и все исходящие подключения ко всем хостам блокируются по умолчанию. Со временем легко потерять информацию о том, какие порты открыты для хостов.

Есть ли другой способ проверить, открыт ли порт на удаленной системе, используя систему Linux с ограниченным количеством установленных пакетов, а telnet недоступен?

245 голосов | спросил Steve HHH 19 J000000Friday13 2013, 20:54:10

9 ответов


211

Bash смог получить доступ к TCP и UDP некоторое время. На странице man:

  /DEV /TCP /хост /порт
    Если хост является допустимым именем хоста или интернет-адресом, а порт является целым номером порта
    или имя службы, bash пытается открыть TCP-соединение с соответствующим сокетом.
/DEV /UDP /хост /порт
    Если хост является допустимым именем хоста или интернет-адресом, а порт является целым номером порта
    или имя службы, bash пытается открыть UDP-соединение с соответствующим сокетом.
 

Итак, вы можете использовать что-то вроде этого:

  ксенон-lornix: ~ & GT; cat </dev/tcp/127.0.0.1/22
SSH-2.0-OpenSSH_6.2p2 Debian-6
^ C нажата здесь
 

Таа Даа!

ответил lornix 22 J000000Monday13 2013, 14:37:11
288

Приятно и многословно! Из справочных страниц.
Один порт:

  nc -zv 127.0.0.1 80
 

Несколько портов:

  nc -zv 127.0.0.1 22 80 8080
 

Диапазон портов:

  nc -zv 127.0.0.1 20-30
 
ответил Subhranath Chunder 4 WedEurope/Moscow2013-12-04T01:34:41+04:00Europe/Moscow12bEurope/MoscowWed, 04 Dec 2013 01:34:41 +0400 2013, 01:34:41
94

Netcat - полезный инструмент:

nc 127.0.0.1 123 & amp; gt; /DEV /нуль; echo $?

Будет выводиться 0 , если порт 123 открыт, и 1 , если он закрыт.

ответил thnee 19 J000000Friday13 2013, 22:07:26
45

Самый простой способ, не используя другой инструмент, например socat , описан в приведенном выше ответе @ lornix. Это просто добавление фактического примера того, как можно использовать psuedo-device /dev /tcp /... в Bash, если вы хотите, скажем, проверить, был ли у другого сервера данный порт, доступный через командную строку.

Примеры

Скажем, у меня есть хост в моей сети с именем скиннер .

  $ (echo> /dev /tcp /skinner /22)> /dev /null 2 ​​& amp; 1 \
    & Amp; & Amp; echo "It's up" || эхо "Это не так"
Работает

$ (echo> /dev /tcp /skinner /222)> /dev /null 2 ​​& amp; 1 & amp; & amp; \
    echo "It's up" || эхо "Это не так"
Это вниз
 

Причина, по которой вы хотите обернуть echo> /dev /... в круглых скобках, таких как (echo> /dev /...), потому что, если вы этого не сделаете, то с проверками соединений, вы получите эти типы сообщений.

  $ (echo> /dev /tcp /skinner /223) & amp; & amp; & amp; эхо привет
bash: connect: соединение отклонено
bash: /dev /tcp /skinner /223: соединение отклонено
 

Их нельзя просто перенаправить на /dev /null , поскольку они исходят из попытки вывести данные на устройство /dev /tcp . Таким образом, мы фиксируем весь этот вывод в подкоманде, т. Е. (... cmds ...) , и перенаправляем вывод подкоманды.

ответил slm 2 ndEurope/Moscowp30Europe/Moscow09bEurope/MoscowTue, 02 Sep 2014 21:59:36 +0400 2014, 21:59:36
33

Я обнаружил, что curl может выполнить задание аналогично telnet , а curl даже скажет вам, какой протокол прослушиватель ожидает.

Создайте HTTP-URI из имени хоста и порта в качестве первого аргумента в curl . Если curl может подключаться, он будет сообщать о несоответствии протокола и выходе (если слушатель не является веб-службой). Если curl не может подключиться, он отключится.

Например, порт 5672 на хосте 10.0.0.99 либо закрыт, либо заблокирован брандмауэром:

  $ curl http://10.0.0.99:5672
curl: (7) не удалось подключиться к хосту
 

Однако, из другой системы, порт 5672 на хосте 10.0.0.99 может быть достигнут и, кажется, запускает прослушиватель AMQP.

  $ curl http://10.0.0.99:5672
curl: (56) Отказ при получении данных от партнера
AMQP
 

Важно различать разные сообщения: первый сбой состоял в том, что curl не мог подключиться к порту. Второй сбой - это тест успеха, хотя curl ожидал прослушиватель HTTP вместо прослушивателя AMQP.

ответил Steve HHH 19 J000000Friday13 2013, 21:05:30
7
  [admin @ automation-server 1.2.2] # nc -v -z -w2 192.168.193.173 6443
nc: подключиться к порту 192.168.193.173 6443 (tcp) не удалось: соединение отклонено

[admin @ automation-server 1.2.2] # nc -v -z -w2 192.168.194.4 6443
Подключение к порту 192.168.194.4 6443 [tcp /sun-sr-https] выполнено успешно!
 

Надеюсь, что он решает вашу проблему:)

ответил Mohammad Shahid Siddiqui 2 J0000006Europe/Moscow 2015, 09:27:59
6

Вот однострочный:

  </dev /tcp /localhost /11211 & amp; & amp; & amp; echo Порт открыт || эхо-порт закрыт
 

с использованием синтаксиса Bash, описанного в ответе @lornix .

Для получения дополнительной информации проверьте: Расширенное руководство по созданию Bash-скриптов: Глава 29. /dev и /proc .

ответил kenorb 16 MarpmWed, 16 Mar 2016 14:21:40 +03002016-03-16T14:21:40+03:0002 2016, 14:21:40
3

Я боролся целый день, потому что ни один из этих ответов не работал для меня. Проблема в том, что в последней версии nc больше нет флага -z , тогда как прямой доступ через TCP (как в соответствии с @lornix и @slm) терпит неудачу, когда хост недоступен. В итоге я нашел эту страницу , где я наконец, нашли не один, а два рабочих примера:

  1. nc -w1 127.0.0.1 22 </dev /null

    (флаг -w учитывает таймаут, а </dev /null заменяет флаг -z )

  2. timeout 1 bash -c '(echo> /dev/tcp/127.0.0.1/22)> /dev /null 2 ​​& amp; 1'

    (команда timeout заботится о тайм-ауте, а остальная часть - от @slm)

Затем просто используйте & amp; & amp; и /или || (или даже $? ), чтобы извлечь результат. Надеюсь, кто-нибудь найдет эту информацию полезной.

ответил Azukikuru 31 Mayam17 2017, 11:45:09
2

Он не должен быть доступен на вашем поле, но попробуйте с помощью nmap .

ответил peperunas 19 J000000Friday13 2013, 21:01:16

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132