Какие есть альтернативы для проверки открытых портов, кроме 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 секунду после истечения времени ожидания, команды между ними 'прерываются, и, таким образом, ничего не печатается.


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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.