W dawnych czasach telnet
sprawdzaliśmy, czy port na zdalnym hoście był otwarty: telnet hostname port
próbował połączyć się z dowolnym portem na dowolnym hoście i dać ci dostęp do surowego strumienia TCP.
Obecnie w systemach, na których pracuję, nie ma zainstalowanego Telnet (ze względów bezpieczeństwa), a wszystkie połączenia wychodzące do wszystkich hostów są domyślnie blokowane. Z czasem łatwo stracić orientację, które porty są otwarte dla których hostów.
Czy istnieje inny sposób sprawdzenia, czy port w systemie zdalnym jest otwarty - przy użyciu systemu Linux z zainstalowaną ograniczoną liczbą pakietów i telnet
nie jest dostępny?
linux
networking
port
Steve HHH
źródło
źródło
brew install telnet
. Spodziewam się, że użytkownicy Linuxa mogą zrobić to samo zyum
iapt-get
.Odpowiedzi:
Bash od dłuższego czasu ma dostęp do portów TCP i UDP . Ze strony podręcznika:
Możesz więc użyć czegoś takiego:
Taa Daa!
źródło
cat < /dev/tcp/localhost/22
, powinieneś dostać swój nagłówek sshd. Najwyraźniej twój proces na porcie 18080 czeka na coś przed wejściem. Port 22 ( ssh ) wita Cię swoją wersją i tym podobne. Wypróbuj to!Miły i pełny! Ze stron podręcznika.
Pojedynczy port:
Wiele portów:
Zakres portów:
źródło
nc -zv 127.0.0.1 22,80,8080,20-30,443-446
(wersja nc: 1.107-4).Netcat to przydatne narzędzie:
nc 127.0.0.1 123 &> /dev/null; echo $?
Wyjdzie,
0
jeśli port 123 jest otwarty i1
jeśli jest zamknięty.źródło
telnet
również odmówilinc
(choć - o dziwo - niecurl
lubwget
).FOR
zaczną się oświadczenia!-G 2
że bardziej odpowiednie byłoby przekroczenie limitu czasu TCPNajprostsza metoda bez użycia innego narzędzia, takiego jak
socat
, jest opisana w powyższej odpowiedzi @ lornix. To po prostu dodać faktyczny przykład wykorzystania urządzenia psuedo/dev/tcp/...
w Bash, jeśli chcesz, powiedzmy, przetestować, czy inny serwer ma dany port dostępny za pośrednictwem wiersza poleceń.Przykłady
Powiedz, że mam hosta w mojej sieci o nazwie
skinner
.Powodem, dla którego chcesz zawijać
echo > /dev/...
nawiasy w ten sposób,(echo > /dev/...)
jest to, że jeśli tego nie zrobisz, to przy testach połączeń, które nie działają, pojawią się tego rodzaju wiadomości.Nie można ich po prostu przekierować,
/dev/null
ponieważ pochodzą one z próby zapisania danych na urządzeniu/dev/tcp
. Przechwytujemy więc wszystkie dane wyjściowe w ramach podrzędnego polecenia, tj.(...cmds...)
I przekierowujemy dane wyjściowe tego polecenia.źródło
Odkryłem, że
curl
może to zrobić zadanie w podobny sposóbtelnet
, acurl
nawet powie ci, jakiego protokołu oczekuje słuchacz.Skonstruuj identyfikator URI HTTP z nazwy hosta i portu jako pierwszy argument
curl
. Jeślicurl
można się połączyć, zgłosi niezgodność protokołu i zakończy działanie (jeśli nasłuchiwanie nie jest usługą internetową). Jeślicurl
nie można się połączyć, upłynie limit czasu.Na przykład port 5672 na hoście 10.0.0.99 jest zamknięty lub zablokowany przez zaporę:
Jednak z innego systemu można uzyskać dostęp do portu 5672 na hoście 10.0.0.99 i wydaje się, że działa on jako detektor AMQP.
Ważne jest, aby rozróżniać różne komunikaty: pierwsza awaria była spowodowana brakiem
curl
połączenia z portem. Druga porażka to test powodzenia, choćcurl
oczekiwany jest odbiornik HTTP zamiast odbiornika AMQP.źródło
wget -qS -O- http://ip.add.re.ss:port
powinien skutecznie zrobić to samo.curl myhost:22
.Mam nadzieję, że to rozwiąże twój problem :)
źródło
Oto jedna linijka:
przy użyciu składni Bash wyjaśnionej w odpowiedzi @lornix .
Aby uzyskać więcej informacji, sprawdź: Advanced Bash-Scripting Guide: Rozdział 29.
/dev
i/proc
.źródło
Walczyłem cały dzień, ponieważ żadna z tych odpowiedzi nie działała dla mnie. Problem polega na tym, że najnowsza wersja
nc
nie ma już-z
flagi, podczas gdy bezpośredni dostęp przez TCP (zgodnie z @lornix i @slm) nie działa, gdy host jest nieosiągalny. W końcu znalazłem tę stronę , na której w końcu znalazłem nie jeden, ale dwa działające przykłady:nc -w1 127.0.0.1 22 </dev/null
(
-w
flaga ustala limit czasu i</dev/null
zastępuje-z
flagę)timeout 1 bash -c '(echo > /dev/tcp/127.0.0.1/22) >/dev/null 2>&1'
(
timeout
polecenie zajmuje limit czasu, a reszta pochodzi z @slm)Następnie po prostu użyj
&&
i / lub||
(lub nawet$?
), aby wyodrębnić wynik. Mam nadzieję, że ktoś uzna te informacje za przydatne.źródło
Łącząc odpowiedzi z @kenorb i @Azukikuru, możesz przetestować port otwarty / zamknięty / firewalled.
Inne podejście z zawinięciem do osiągnięcia dowolnego portu
źródło
Oto funkcja, która wybierze jedną z metod w zależności od tego, co jest zainstalowane w systemie:
źródło
Nie powinno być dostępne na twoim pudełku, ale spróbuj
nmap
.źródło
nmap
jest dobrym narzędziem, ale niedostępnym w tych systemach. Zamiast pobieraćnmap
, kompilować, instalować w moim katalogu domowym, a następnie kopiować do wszystkich innych systemów, miałem nadzieję znaleźć sposób, korzystając z istniejących narzędzi dostępnych w większości instalacji Linuksa.dla odniesienia, rozwijając odpowiedź @peperunas:
sposobem użycia nmap do testowania jest:
(powyższy przykład używa localhost do celów demonstracyjnych)
źródło
Jeśli chcesz przetestować więcej niż na systemie, możesz użyć naszego narzędzia testowego dda-serverspec ( https://github.com/DomainDrivenArchitecture/dda-serverspec-crate ) do takich zadań. Możesz określić swoje oczekiwania
i przetestuj te oczekiwania na hoście lokalnym lub na hoście zdalnym (połącz przez ssh). W przypadku testów zdalnych musisz zdefiniować cele:
Możesz uruchomić test z
java -jar dda-serverspec.jar --targets targets.edn serverspec.edn
Pod maską używamy netcata tak jak wyżej ...
źródło