Сканировать открытый порт с помощью netcat

Вопрос или проблема

Я просто пытаюсь понять полезность netcat. Поэтому для теста я установил Apache на своей операционной системе Linux и проверил, что Apache работает, зайдя на localhost в браузере.

Я хочу проверить, открыт ли порт 8080 на моем компьютере, используя netcat. Я ввел nc -z localhost 8080 в консоль, но ничего не отображается. Apache работает, поэтому порт 8080 открыт. Я не понимаю, почему ничего не показывается?

Также, если я пытаюсь просканировать диапазон портов, использую nc -z localhost 1-9999, тоже ничего не получаю в ответ. Значит ли это, что на моем компьютере нет открытых портов?

Я не понимаю, почему ничего не показывается

На моей Kubuntu у меня установлена реализация OpenBSD nc. В мануале сказано [выделено мной]:

Может быть полезно знать, какие порты открыты и работают на целевой машине. Флаг -z можно использовать, чтобы заставить nc сообщать об открытых портах, а не инициировать соединение. Обычно полезно включить подробный вывод в stderr, используя эту опцию в сочетании с опцией -v.

Попробуйте nc -zv localhost 8080 или nc -zv localhost 1-9999.

Я заметил, что можно протестировать один порт, проверив код выхода. Открытый порт заставляет nc возвращать 0; неудавшееся соединение заставляет nc возвращать 1. Этот подход работает с опцией -v или без нее.

В общем, при тестировании портов таким образом, рекомендуется установить разумно короткий таймаут (например, -w 7), чтобы избежать длительной задержки, если сканированная машина полностью молчит.

Я не знаю, почему вы ожидали вывод. Из страницы man:

-z указывает, что nc должен просто сканировать демоны на прослушивание, не отправляя им данные.

Что произойдет, если вы подключитесь к HTTP-серверу, не отправляя никаких данных? Вы не получите ответ. Сравните это с обычным cat:

ljm@verlaine[~]$ touch this
ljm@verlaine[~]$ cat this
ljm@verlaine[~]$ cat that
cat: that: No such file or directory

this — это пустой файл. Так что для cat this вы не получите ответа. Не сообщение “привет, я нашел это; но это пусто”, а просто содержимое this. Так же работает и с nc.

Например, pi слушает порт 80 в моей сети.

ljm@verlaine[~]$ nc -z pi 80
ljm@verlaine[~]$ nc -z pi 83
pi.home [192.168.178.2] 83 (mit-ml-dev) : Connection refused
ljm@verlaine[~]$  echo -n "GET / HTTP/1.0\r\n\r\n" | nc pi 80
HTTP/1.1 404 Not found
Content-Type: text/plain
Content-length: 11

Not found

Итак, первое nc -z pi 80 подключается к порту 80 (что удается), ничего не отправляет и не получает ответа.

Во втором nc -z pi 83 вы получаете сообщение от nc, объясняющее, в чем проблема.

Третье nc отправляет данные веб-серверу и получает ответ (404, но это не имеет значения)

Ответ или решение

Использование утилиты netcat (nc) для сканирования открытых портов на вашем компьютере может быть весьма полезным при диагностике сети или тестировании настроек безопасности. Однако правильная интерпретация ответа от netcat требует понимания его работы.

Когда вы вводите команду nc -z localhost 8080, netcat проверяет наличие прослушивающих служб на указанном порте. Если netcat ничего не выводит, это может означать, что порт открыт, но данные не отправляются и не получаются, поскольку -z указывает на сканирование портов, а не на установление соединений. Для получения более подробной информации рекомендуется добавить флаг -v для режимa verbose (подробный вывод), как в команде nc -zv localhost 8080, чтобы netcat сообщал об открытых портах.

Если при выполнении команды nc -zv localhost 1-9999 ничего не отображается, это не обязательно означает, что все порты закрыты. Просто netcat "молча" предупреждает об открытии соединения; с добавлением -v вы могли бы увидеть подтверждение открытия порта.

Проверка состояния порта с помощью netcat осуществляется также за счет анализа кода возврата. Например, открытый порт заставит netcat вернуть код 0, тогда как закрытый порт заставит вернуть код 1. Это можно использовать в сценариях автоматизации для проверки каких-либо условий.

Важно также учитывать задачу времени ожидания, которую можно настроить с помощью параметра -w. Допустим -w 7, что позволяет избежать длительных задержек, если машина, с которой производится сканирование, совершенно не отвечает.

На этом этапе важно понять, что netcat предоставляет возможность буквально "прослушивать" и "говорить" с портом, не загружая данные в некотором смысле. Если вы хотите получить ответ на HTTP-запрос, необходимо вручную отправить его, например, используя echo с командой nc.

Таким образом, netcat является полезным инструментом при работе с портами, однако демонстрирует свою мощность только при использовании в связке с правильными параметрами и пониманием работы сети и сервера.

Оцените материал
Добавить комментарий

Капча загружается...