Powershell: nasłuchiwanie na porcie. Sprawdzanie czy port jest otwarty

11-maj-2021

Bezpieczene środowiska są często podzielone na mniejsze strefy rozdzielone firewallem. Za takim podniesieniem bezpieczeństwa idą jednak też pewne niemiłe konsekwencje. Aplikacje wymagają łączności, a przy zbyt restrykcyjnie skonfigurowanym firewallu, ta komunikacja może przestać działać.

Tym razem problem był następujący. SQL serwer był skonfigurowany do nasłuchiwania na porcie XXX. Powstał pomysł przejścia na port YYY. Przed zmianą numeru portu na serwerze trzeba sprawdzić, czy port Y jest rzeczywiście otwarty.

Normalnie do sprawdzenia, czy port jest otwarty można użyć

Test-NetConnection -comp <adres_serwera> -port YYY

tylko… skoro na serwerze, SQL nasłuchuje na porcie XXX, to na pytanie skierowane do portu YYY nie odpowie! Trzeba by więc stworzyć jakiś proces nasłuchujący na porcie YYY, choćby tylko po to, żeby uzyskać jakąkolwiek odpowiedź na Test-NetConnection. Oto jak stworzyć taki sztuczny nasłuchujący proces:

$Listener = [System.Net.Sockets.TcpListener]9999;
$Listener.Start();
#wait, try connect from another PC etc.
#$Listener.Stop();

Te polecenia utworzą proces nasłuchujący na porcie 9999 (to odpowiednik naszego portu YYYY)

Jeśli więc na serwerze uruchomisz w/w kod (i go tam zostawisz – nie zamykaj okna), to jeśli tylko porty na firewall są otwarte, to polecenie:

Test-NetConnection -comp <adres_serwera> -port 9999

powinno zwrócić sukces. Jeśli jakaś reguła firewall filtruje ten port – to otrzymamy fail. Jest wiec to metoda na sprawdzenie, czy port jest otwarty przed zmianą portu na którym pracuje SQL, co nie?

A, no i pamiętajmy o wylączeniu nasłuchiwania w skrypcie powershellowym, bo port będzie zajęty 🙂

Komentarze są wyłączone

Autor: Rafał Kraik