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?

Yael
źródło
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.

in2nix4life
źródło
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
Steve
źródło
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
Landak
źródło
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!
Jeff Schaller
źródło
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.

al mamun
źródło
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
0
ss -lt 

to kolejne polecenie, którego możesz użyć.

Dileep Jayasundara
źródło
Działa tylko na maszynie lokalnej, uważam, że pytanie dotyczy sprawdzenia otwartych portów zdalnego hosta.
Alex Baranowski