Назад | Перейти на главную страницу

Исследование нескольких портов при запуске NetCat (nc)

Я хочу проверить, открыты ли определенные порты на хосте. Я использую:

nc -z host 22
nc -z host 80
nc -z host 443
nc -z host 8080

который работает, но было бы неплохо использовать однострочник, например:

nc -z host 22 80 443 8080

что не работает.

Я бы хотел избежать диапазона портов nc -z host 22-8080 как указано на странице руководства, если это возможно, так как есть большой пробел в номерах портов, которые я хочу проверить. Кроме того, я не хочу сканировать каждый порт, чтобы меня воспринимали как сканирование открытых портов.

Если не считать цикла bash, каковы мои варианты тестирования, если порты открыты? У меня есть десятки хостов, на каждом из которых есть несколько портов, которые нужно проверить.

Я использую -w 1 ниже, чтобы ограничить время ожидания до 1 секунды. Я также использую -v по причинам, указанным в комментариях. я использовал -n чтобы отказаться от задержек при обратном поиске DNS ...

[mpenning@tsunami ~]$ for i in $(echo "172.16.1.1,172.16.1.5"|tr "," "\n"); do echo -e "22\n80\n443\n8080" | xargs -i nc -w 1 -zvn $i {}; done
(UNKNOWN) [172.16.1.1] 22 (ssh) open
(UNKNOWN) [172.16.1.1] 80 (www) : Connection timed out
(UNKNOWN) [172.16.1.1] 443 (https) open
(UNKNOWN) [172.16.1.1] 8080 (http-alt) : Connection timed out
(UNKNOWN) [172.16.1.5] 22 (ssh) open
(UNKNOWN) [172.16.1.5] 80 (www) open
(UNKNOWN) [172.16.1.5] 443 (https) open
(UNKNOWN) [172.16.1.5] 8080 (http-alt) : Connection refused
[mpenning@tsunami ~]$

Если хочешь GNU Parallel как и я, попробуйте это:

parallel nc -vz host ::: 22 80 443 8080

Пример вывода:

Connection to foo.example.com 22 port [tcp/ssh] succeeded!
nc: connect to foo.example.com port 80 (tcp) failed: Connection refused
nc: connect to foo.example.com port 443 (tcp) failed: Connection refused
nc: connect to foo.example.com port 8080 (tcp) failed: Connection refused

Этот метод также в некоторых случаях быстрее, поскольку он тестирует подключение к портам параллельно, а не последовательно. В частности, здесь удаленный хост (или промежуточный брандмауэр) отбрасывает ваши пакеты, чтобы оставаться незаметным (в отличие от успешного соединения или принудительного отклонения).

Наконечник: в большинстве дистрибутивов Linux вы можете установить parallel из вашего менеджера пакетов.

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

parallel nc -vz ::: host1 host2 host3 ::: 22 80 443 8080

Вывод:

Connection to host1 22 port [tcp/ssh] succeeded!
Connection to host1 80 port [tcp/http] succeeded!
Connection to host1 443 port [tcp/https] succeeded!
nc: connect to host1 port 8080 (tcp) failed: Connection refused
Connection to host2 22 port [tcp/ssh] succeeded!
nc: connect to host2 port 80 (tcp) failed: Connection refused
nc: connect to host2 port 443 (tcp) failed: Connection refused
nc: connect to host2 port 8080 (tcp) failed: Connection refused
Connection to host3 22 port [tcp/ssh] succeeded!
nc: connect to host3 port 80 (tcp) failed: Connection refused
nc: connect to host3 port 8080 (tcp) failed: Connection refused
nc: connect to host3 port 443 (tcp) failed: Connection refused

Как и в предыдущем примере, parallel параллельно выполняет тесты подключения. Обратите внимание, что параллелизм по умолчанию - это количество потоков в вашей системе, но его можно легко переопределить с помощью -j переключиться на любое значение. Вы могли бы легко уйти с parallel -j 50 ... или даже выше, поскольку тестирование сокетов не требует интенсивной работы ЦП.

В Gentoo Linux (с установленным net-analyzer / netcat-110-r9):

$ nc -vz www.example.com 80 443
www.example.com [93.184.216.34] 80 (http) open

$ nc -vvz www.example.com 80 443
www.example.com [93.184.216.34] 80 (http) open
www.example.com [93.184.216.34] 443 (https) : Connection refused

Netcat на самом деле не является сканером, так как комментарий предполагает, что Nmap будет лучшим вариантом здесь. Не используя опцию диапазона портов, я полагаю, вам осталось обернуть ее в сценарий оболочки;

    for host in $(cat hostlist); do
        for port in $ports; do nc -z $host $port; done
    done

и т.д..

В Redhat 6 вы можете запустить что-то вроде этого как настоящий однострочник:

nc -znv -w 2 <host> <port1>; nc -znv -w 2 <host> <port2>

-z тестирует порт
-n не разрешает DNS
-v дать подробный вывод
-w таймаут через 2 секунды
; ставит одну команду за другой, если вы не возражаете ввести ее снова.

Мне нравятся предложения по использованию цикла, если вы сканируете несколько портов, однако, если это 2 или 3, и вы уже пытаетесь просмотреть список с помощью чего-то вроде SSH, полезно использовать такие команды.