Які альтернативи для перевірки відкритих портів, крім 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 на своєму ПК. Він використовував це для цілей, пов’язаних з роботою, але це було у забороненому списку, тому його провели із будівлі.
Roger Lipscombe

2
Чи є варіант perl? - ТАК
yael

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? тому що я хочу написати в своєму баш-скрипті
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. (це все ще висить)
yael

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.
al mamun

4

Якщо Perl є опцією, ви можете використовувати її IO::Socketмодуль для перевірки з'єднання з певним хостом і портом; скрипт нижче жорстких кодів TCP як протокол (який телнет використовував би):

#!/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 under / dev /, у нас немає tcp
yael

ls / dev / tcp / ls: не вдається отримати доступ / dev / tcp /: Немає такого файлу чи каталогу
yael

на якій ОС ви його тестуєте?
yael

@yael, ви не отримаєте / dev / tcp або / dev / udp, поки ls. спробуйте точно таку ж команду на своїй оболонці, і ви отримаєте результат. до речі, я часто використовую його на RHEL6,7
al mamun

0
ss -lt 

це ще одна команда, яку ви можете використовувати.


Він працює лише для локальної машини, я вважаю, що питання стосується перевірки відкритих портів віддаленого хоста.
Олексій Барановський
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.