Какие есть альтернативы для проверки открытых портов, кроме telnet?

24

Мы можем использовать следующее для тестирования порта Telnet VIA; в следующем примере мы тестируем порт 6667:

[root@kafka03 ~]# telnet kafka02 6667
Trying 103.64.35.86...
Connected to kafka02.
Escape character is '^]'.
^CConnection closed by foreign host

Поскольку на некоторых машинах мы не можем использовать telnet (по внутренним причинам), какие есть альтернативы для проверки портов, как telnet?

Яэль
источник
Perl вариант?
Джефф Шаллер
5
Эти «внутренние причины» могут помешать вам использовать другое программное обеспечение для сканирования портов. Я знал парня, который работал в банке и у которого был расторгнут контракт, потому что у него была копия nmap на его ПК. Он использовал его в рабочих целях, но это было в запрещенном списке, поэтому его вывели из здания.
Роджер Липскомб
2
Perl вариант? - ДА
яэль
2
Обратите внимание, что telnet - это сложный протокол. telnetУтилита выключает поведение протокола , если порт задается в командной строке. Тогда он ведет себя так же netcat, как при обнаружении окончания строки.
Rexkogitans
Более независимым от операционной системы вопросом, который даже не намекает на сканирование портов, является unix.stackexchange.com/questions/499694 .
JdeBP

Ответы:

23

Если вы используете Bash Shell, то вы можете использовать его функцию, чтобы проверить, открыт порт или закрыт:

(timeout 1 bash -c '</dev/tcp/127.0.0.1/17500 && echo PORT OPEN || echo PORT CLOSED') 2>/dev/null
PORT OPEN

(timeout 1 bash -c '</dev/tcp/127.0.0.1/7500 && echo PORT OPEN || echo PORT CLOSED') 2>/dev/null
PORT CLOSED

Обратите внимание, что если сервер не отвечает через 1 секунду после истечения времени ожидания, команды между ними 'прерываются, и, таким образом, ничего не печатается.

in2nix4life
источник
5
Возможно, вы должны использовать имя хоста из вопроса (kafka02) вместо 127.0.0.1, что делает его похожим, что оно работает только с обратной связью.
Дмитрий Григорьев
1
(timeout 1 bash -c '</dev/tcp/www.google.com/444 && echo PORT OPEN || echo PORT CLOSED') 2>/dev/nullничего не печатает для меня. (timeout 1 bash -c '</dev/tcp/www.google.com/444' && echo PORT OPEN || echo PORT CLOSED) 2>/dev/nullработал как положено (печатает ПОРТ ЗАКРЫТО). Обратите внимание на расположение '.
thecarpy
что вы получаете на bash -c '</ dev / tcp / kafka01 / 6667'
yael
тогда эхо $? (если 0, то порт открыт)
yael
IIRC эта функция bash раньше была отключена в Debian. Это хитрый трюк, но не всегда работает.
AnonymousLurker
32

Netcat является одним из вариантов.

nc -zv kafka02 6667
  • -z = устанавливает nc для простого сканирования прослушивающих демонов, без фактической отправки им данных
  • -v = включает подробный режим
Стив
источник
Можно ли получить стандартный вывод от NC? потому что я хочу написать в моем скрипте bash
yael
2
Прочитайте документацию! Без вариантов ncведет себя очень похоже telnet.
Хенрик - прекрати причинять боль Монике
да, я читаю документы, но флаг -w не работает как тайм-аут
yael
пример - c -v -w 1 kafka01 6667 (мы не получаем тайм-аут)
yael
nc -v -w 3 kafka01 6667 Ncat: версия 6.40 ( nmap.org/ncat ) Ncat: подключено к 10.164.235.85:6667. (это все еще висит)
яэль
23

Золотой стандарт, несомненно, nmap( nmap.org ), но для получения «лучших результатов» обычно требуется рут. Однако доступны автономные двоичные файлы, и его можно запускать как непривилегированный пользователь, просто с ухудшенными возможностями. Например, вместо скрытого synсканирования ( -sS) он возвращается к стандартному сканированию TCP-подключения ( -sT). Это функционально эквивалентно netcat, но с хорошими возможностями ускорения для нескольких хостов.

Пример:

not-root$ nmap -sT google.com
Starting Nmap 7.70 ( https://nmap.org ) at 2018-11-04 21:01 GMT
Nmap scan report for google.com (172.217.23.14)
Host is up (0.12s latency).
rDNS record for 172.217.23.14: lhr35s01-in-f14.1e100.net
Not shown: 998 filtered ports
PORT    STATE SERVICE
80/tcp  open  http
443/tcp open  https
Landak
источник
1
в большинстве организаций nmap рассматривается как инструмент сканирования, и нельзя использовать nmap без соответствующей авторизации. Также, если это экземпляр EC2, авторизация также требуется от AWS.
Аль Мамун
4

Если Perl является опцией, вы можете использовать его IO::Socketмодуль для проверки соединения с конкретным хостом и портом; приведенный ниже скрипт жестко кодирует TCP в качестве протокола (именно так будет использовать telnet):

#!/usr/bin/perl -w

# tries to connect to the given IP and port (tcp)

use strict;
use IO::Socket;

my $desthost = shift or die "Usage: $0 host port\n";
my $destport = shift or die "Usage: $0 host port\n";

gethostbyname($desthost) || die "Invalid host given\n";

my $handle = IO::Socket::INET->new(
        PeerAddr => $desthost,
        PeerPort => $destport,
        Proto    => 'tcp')
    or die "can't connect to $desthost:$destport: $!\n";
close $handle;
print "Success!\n"

Пример вывода из закрытого порта:

$ ./above-script kafka02 6667
can't connect to kafka02:6667: Connection refused

Пример вывода с открытого порта:

$ ./above-script kafka02 4200
Success!
Джефф Шаллер
источник
2

Файл устройства / dev / tcp и / dev / udp можно использовать вместо telnet. Пример: echo 0> /dev/tcp/103.64.35.86/6667. Затем проверьте состояние выхода с помощью #echo $? , Если статус выхода равен 0, то порт открыт. Если состояние выхода не равно нулю, то порт закрыт. Для проверки пакетов udp используйте echo 0> /dev/udp/103.64.35.86/6667.

Аль Мамун
источник
в моем redhat 7 под / dev / у нас нет tcp
yael
ls / dev / tcp / ls: невозможно получить доступ к / dev / tcp /: нет такого файла или каталога
yael
на какой ОС ты это тестируешь?
Яэль
@yael, вы не получите / dev / tcp или / dev / udp, пока ls. попробуйте точно такую ​​же команду в вашей оболочке, и вы получите результат. кстати, я часто использую его на RHEL6,7
al mamun
0
ss -lt 

это еще одна команда, которую вы можете использовать.

Дилип Джаясундара
источник
Это работает только для локальной машины, я считаю, что вопрос о проверке открытых портов удаленного хоста.
Алекс Барановский