Jakie są alternatywy dla sprawdzania otwartych portów oprócz telnet?


24

Możemy użyć następujących elementów w celu przetestowania portu VIA telnet; w poniższym przykładzie testujemy port 6667:

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

Ponieważ na niektórych komputerach nie możemy używać telnetu (z powodów wewnętrznych), jakie są alternatywy dla sprawdzania portów jako telnet?


Czy Perl jest opcją?
Jeff Schaller

5
Te „wewnętrzne powody” mogą uniemożliwić korzystanie z innego oprogramowania do skanowania portów. Znałem faceta, który pracował w banku i rozwiązał jego umowę, ponieważ miał kopię nmap na swoim komputerze. Używał go do celów związanych z pracą, ale był na zakazanej liście, więc został wyprowadzony z budynku.
Roger Lipscombe,

2
Czy Perl jest opcją? - TAK
yael

2
Zauważ, że telnet jest wyrafinowanym protokołem. telnetNarzędzie wyłącza działanie protokołu, jeżeli port jest podana w wierszu poleceń. Wtedy zachowuje się bardzo podobnie netcat, tylko z wykrywaniem końca linii.
rexkogitans

Bardziej agnostycznym pytaniem systemu operacyjnego, które nawet nie wskazuje na skanowanie portów, jest unix.stackexchange.com/questions/499694 .
JdeBP

Odpowiedzi:


23

Jeśli używasz Bash Shell, możesz użyć jego funkcji, aby sprawdzić, czy port jest otwarty czy zamknięty:

(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

Zauważ, że jeśli serwer nie zareaguje po upływie 1 sekundy, upłynie limit czasu, polecenia między są 'przerywane, a zatem nic nie jest drukowane.


5
Być może powinieneś użyć nazwy hosta z pytania (kafka02) zamiast 127.0.0.1, co sprawia, że ​​wygląda na to, że działa tylko z pętlą zwrotną.
Dmitrij Grigoriew

1
(timeout 1 bash -c '</dev/tcp/www.google.com/444 && echo PORT OPEN || echo PORT CLOSED') 2>/dev/nullnic dla mnie nie drukuje. (timeout 1 bash -c '</dev/tcp/www.google.com/444' && echo PORT OPEN || echo PORT CLOSED) 2>/dev/nulldziałał zgodnie z oczekiwaniami (drukuje PORT ZAMKNIĘTY). Zanotuj lokalizację '.
thecarpy

co otrzymujesz na bash -c '</ dev / tcp / kafka01 / 6667'
yael

następnie echo $? (jeśli 0, to port jest otwarty,)
yael

IIRC ta funkcja bash była wcześniej wyłączana w Debianie. To fajna sztuczka, ale nie zawsze działa.
AnonymousLurker

32

netcat jest jedną z opcji.

nc -zv kafka02 6667
  • -z = ustawia nc, aby po prostu skanował w poszukiwaniu demonów nasłuchujących, bez wysyłania do nich żadnych danych
  • -v = włącza pełny tryb

czy można uzyskać standardowe wyjście z NC? ponieważ chcę napisać w moim skrypcie bash
yael

2
Przeczytaj dokumentację! Bez opcji nczachowuje się bardzo podobnie telnet.
Henrik - przestań krzywdzić Monikę

tak, czytam dokumenty, ale flaga -w nie działa jako limit czasu
yael

przykład - c -v -w 1 kafka01 6667 (nie otrzymujemy limitu czasu)
yael

nc -v -w 3 kafka01 6667 Ncat: Wersja 6.40 ( nmap.org/ncat ) Ncat: Połączono z 10.164.235.85:6667. (nadal się zawiesza)
yael

23

Złoty standard jest bez wątpienia nmap( nmap.org ), ale zazwyczaj wymaga rootowania w celu uzyskania „najlepszych wyników”. Dostępne są jednak autonomiczne pliki binarne i można je uruchamiać jako użytkownik nieuprzywilejowany, z ograniczonymi możliwościami. Na przykład zamiast synskanowania ukrycia ( -sS) wraca do standardowego skanowania połączenia TCP ( -sT). Jest to funkcjonalnie równoważne z netcat, ale ma ładne, przyspieszone możliwości obsługi wielu hostów.

Przykład:

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
w większości organizacji nmap jest uważany za narzędzie skanujące i nie można używać nmap bez odpowiedniej autoryzacji. Również jeśli jest to instancja EC2, wymagana jest również autoryzacja z AWS.
al mamun

4

Jeśli Perl jest opcją, możesz użyć jego IO::Socketmodułu do przetestowania połączenia z określonym hostem i portem; skrypt pod kodem TCP jako protokół (który byłby używany przez 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"

Przykładowe dane wyjściowe z zamkniętego portu:

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

Przykładowe dane wyjściowe z otwartego portu:

$ ./above-script kafka02 4200
Success!

2

Zamiast telnet można użyć pliku urządzenia / dev / tcp i / dev / udp. Przykład: echo 0> /dev/tcp/103.64.35.86/6667. Następnie sprawdź status wyjścia za pomocą #echo $? . Jeśli kodem wyjścia jest 0, port jest otwarty. Jeśli kod zakończenia jest różny od zera, port jest zamknięty. Aby sprawdzić pakiety udp, użyj echa 0> /dev/udp/103.64.35.86/6667.


w moim redhat 7 pod / dev /, nie mamy tcp
yael

ls / dev / tcp / ls: nie można uzyskać dostępu / dev / tcp /: nie ma takiego pliku ani katalogu
yael

na jakim systemie operacyjnym to testujesz?
yael

@yael, nie dostaniesz / dev / tcp lub / dev / udp podczas ls. wypróbuj dokładnie to samo polecenie na swojej powłoce, a otrzymasz wynik. przy okazji, często używam go na RHEL6,7
al mamun

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.