На работе группа специалистов по инфраструктуре развертывает новые виртуальные машины с установленной в качестве базовой ОС RHEL7. Это конкретное изображение поставляется с nmap-ncat
версия Netcat и не имеет установленного NMap. Нам запрещается устанавливать что-либо на машины.
Раньше мы использовали GNU Netcat с -z
возможность сканировать удаленный хост / порт, чтобы проверить, был ли он открыт. Что-то вроде этого:
nc -z -v -w 3 remote.host.name 1234
Как я могу добиться такой же проверки с новым ncat
который не имеет -z
вариант в системе, где я не могу установить nmap
?
Bash позволяет подключаться к портам TCP и / или UDP путем перенаправления на специальные файлы:
/dev/tcp/host/port
Если host - допустимое имя хоста или Интернет-адрес, а port - целочисленный номер порта или имя службы, Bash пытается открыть соответствующий сокет TCP.
/dev/udp/host/port
Если host - допустимое имя хоста или Интернет-адрес, а port - целочисленный номер порта или имя службы, 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