На работе группа разработчиков инфраструктуры развертывает новые виртуальные машины с установленным RHEL7 в качестве базовой ОС. Этот конкретный образ поставляется с версией Netcat nmap-ncat
и не имеет установленного NMap. Нам запрещается устанавливать что-либо на машины.
Раньше мы использовали GNU Netcat с параметром -z
для сканирования удаленного хоста / порта, чтобы проверить, открыт ли он. Примерно так:
nc -z -v -w 3 remote.host.name 1234
Как я могу добиться такой же проверки с новым ncat
, у которого нет параметра -z
в системе, в которой я не могу установить nmap
?
Bash позволяет подключаться к портам TCP и / или UDP путем перенаправления к специальным файлам:
/ dev / tcp / host / port
Если хост - допустимое имя хоста или Интернет адрес, а порт - это целочисленный номер порта или имя службы, Bash пытается откройте соответствующий сокет TCP.
/ dev / udp / host / port
Если host - допустимое имя хоста или адрес в Интернете, а порт - это целочисленный номер порта или имя службы, Bash пытается откройте соответствующий сокет UDP.Ошибка при открытии или создании файла приводит к сбою перенаправления.
Итак, чтобы проверить, можете ли вы подключиться к порту 80 на www.example.com, должно работать следующее:
echo -n > /dev/tcp/www.example.com/80
Если порт заблокирован, вы получите сообщение «В соединении отказано» или тайм-аут.
Хотя Ncat еще не поддерживает -z
, вы можете добиться того же поведения с перенаправлением оболочки:
$ ncat google.com 80 </dev/null >/dev/null && echo "yes"
yes
$ ncat google.com 81 </dev/null >/dev/null && echo "yes"
Ncat: Connection timed out.
$ ncat scanme.nmap.org 1234 </dev/null >/dev/null && echo "yes"
Ncat: Connection refused.
Тайм-аут подключения можно настроить с помощью - Вариант w
РЕДАКТИРОВАТЬ: Ncat 7.25BETA2 представил параметр -z
, который работает так же, как и с GNU netcat, но только на отдельных портах. Если вам нужно сканировать диапазоны портов, вы должны использовать Nmap.
Ни netcat, ни telnet, ни nmap не нужны. Bash проще, портативнее и эффективнее.
Открытая проверка
(>/dev/tcp/example.com/80) &>/dev/null && echo "Open"
Открытая / закрытая проверка
(>/dev/tcp/example.com/80) &>/dev/null && echo "Open" || echo "Closed"
Проверка диапазона портов
for i in $(seq 80 88); do (>/dev/tcp/example.com/80/$i) &>/dev/null && echo $i Open|| echo $i Closed; done