Test-NetConnection sprawdzający otwieranie / zamykanie portów TCP z PowerShell

W Powerhell 4.0 (Windows 2012 R2, Windows 8.1 i nowsze) wbudowane polecenie cmdlet do sprawdzania połączeń sieciowych - Testuj-Połączenie sieciowe. Za pomocą tego polecenia cmdlet można sprawdzić dostępność zdalnego serwera lub usługi sieciowej, zablokować porty TCP za pomocą zapór ogniowych, sprawdzić dostępność i routing ICMP. Zasadniczo polecenie cmdlet Test-połączenie sieciowe pozwala zastąpić kilka znanych narzędzi sieciowych jednocześnie: ping, traceroute, skaner portów TCP itp..

Treść

  • Ping portów TCP: Używanie Test-NetConnection do testowania otwartych portów i dostępności serwera
  • Test-NetConnection w skryptach monitorowania
  • Skaner sieciowy PowerShell

Każdy administrator musi okresowo sprawdzać dostępność usługi na zdalnym serwerze, sprawdzając odpowiedź ze zdalnego portu TCP (na przykład dostępność poczty lub serwera WWW). Co więcej, wszyscy są przyzwyczajeni do tego, że taka kontrola jest przeprowadzana najszybciej za pomocą polecenia telnet. Na przykład, aby sprawdzić dostępność usługi SMTP na serwerze pocztowym (domyślnie odpowiada na port TCP 25), po prostu uruchom polecenie telnet msk-msg01.winitpro.ru 25. Jednak począwszy od systemu Windows 7 klient Telnet jest dedykowany osobnemu komponentowi, który należy zainstalować osobno. Zobaczmy, jak wykonać podobną akcję w PowerShell.

Główną zaletą cmdletu Test-NetConnection jest to, że jest on już częścią wszystkich nowoczesnych wersji systemu Windows i nie trzeba go instalować osobno. Polecenie cmdlet jest częścią modułu. NetTCPIP (począwszy od PoSh v4.0).

Wskazówka. Możesz sprawdzić bieżącą zainstalowaną wersję programu PowerShell za pomocą polecenia $ PSVersionTable.PSVersion

Wartość 4 w kolumnie Major wskazuje, że PowerShell 4.0 jest zainstalowany na komputerze.

Ping portów TCP: Używanie Test-NetConnection do testowania otwartych portów i dostępności serwera

Sprawdź, czy port TCP 25 (protokół SMTP) jest otwarty na serwerze pocztowym za pomocą Test-NetConnection:

Test-NetConnection -ComputerName msk-msg01 -Port 25

Uwaga. Za pomocą polecenia cmdlet Test-NetConnection można zweryfikować tylko połączenie TCP; nie dotyczy sprawdzania dostępności portów UDP.

W skrócie podobne polecenie wygląda następująco:

TNC msk-mail1 -Port 25

Przeanalizujmy wynik polecenia:

ComputerName: msk-msg01 RemoteAddress: 10.10.1.7 RemotePort: 25 InterfaceAlias: CORP SourceAddress: 10.10.1.70 PingSucceeded: True PingReplyDetails (RTT): 0 ms TcpTestSucceeded: True 

Jak widać, polecenie cmdlet rozpoznaje nazwę serwera na adres IP, sprawdza odpowiedź ICMP (podobną do polecenia ping) i dostępność portu TCP. Określony serwer jest dostępny za pośrednictwem ICMP (PingSucceeded = True), a port 25 TCP również odpowiada (RemotePort = 25, TcpTestSucceeded = True).

Uwaga.  W niektórych przypadkach może się okazać, że PingSucceeded = False, a TcpTestSucceeded = True. Najprawdopodobniej oznacza to, że ping ICMP jest wyłączony na zdalnym serwerze.

Polecenie cmdlet ma specjalny parametr -CommonTCPPort, umożliwiając określenie nazwy znanego protokołu sieciowego (HTTP, RDP, SMB, WINRM).

Na przykład, aby sprawdzić dostępność serwera WWW, możesz użyć polecenia:

Test-NetConnection -ComputerName winitpro.ru -CommonTCPPort HTTP

Lub dostępność portu RDP (3389):

Test-NetConnection msk-rds1 -CommonTCPPort RDP

Możesz wydrukować wszystkie parametry, które zwraca polecenie cmdlet Test-NetConnection:

Test-NetConnection msk-man01 -port 445 | Lista formatów *

Jeśli potrzebujesz jedynie informacji o dostępności portu TCP, w bardziej zwięzłej formie, sprawdzenie można wykonać w następujący sposób:

TNC msk-mail1 -Port 25 -InformacjeLevel Quiet

Polecenie cmdlet zwróciło wartość True, co oznacza, że ​​port zdalny jest dostępny.

Wskazówka. W poprzednich wersjach programu PowerShell można sprawdzić dostępność zdalnego portu TCP przez:

(New-Object System.Net.Sockets.TcpClient) .Connect ('msk-msg01', 25)

W systemie Windows 10 / Windows Server 2016 można użyć polecenia cmdlet Test-NetConnection, aby prześledzić trasę do zdalnego serwera za pomocą -Traceoutout (analog tracert). Za pomocą parametru -Chmiel podczas sprawdzania możesz ograniczyć maksymalną liczbę nadziei.

Test-NetConnection msk-man01 -TraceRoute

Polecenie cmdlet zwróciło opóźnienie sieciowe podczas uzyskiwania dostępu do serwera w milisekundach (PingReplyDetails (RTT): 41 ms) i wszystkie adresy IP routerów w drodze do serwera docelowego.

Test-NetConnection w skryptach monitorowania

Następujące polecenie pozwala sprawdzić dostępność określonego portu na wielu serwerach, których lista jest zapisana w pliku tekstowym server.txt. Interesują nas serwery, na których żądana usługa nie odpowiada:

Get-Content c: \ Distr \ servers.txt | gdzie -NOT (Test-Netconnection $ _ -Port 25 -InformationLevel Quiet) | Format-Table -AutoSize

Podobnie możesz stworzyć prosty system monitorowania, który sprawdza dostępność serwerów i wyświetla powiadomienie, jeśli jeden z serwerów jest niedostępny.

Na przykład można sprawdzić dostępność podstawowych usług na wszystkich kontrolerach domeny (listę kontrolerów domeny można uzyskać za pomocą polecenia cmdlet Get-ADDomainController). Sprawdźmy następujące usługi na DC (narzędzie PortQry ma podobną regułę Domeny i zaufania):

  • RPC - TCP / 135
  • LDAP - TCP / 389
  • LDAP - TCP / 3268
  • DNS - TCP / 53
  • Kerberos - TCP / 88
  • SMB - TCP / 445

$ Porty = „135”, „389”, „636”, „3268”, „53”, „88”, „445”, „3269”, „80”, „443”
$ AllDCs = Get-ADDomainController -Filter * | Select-Object Hostname, Ipv4address, isGlobalCatalog, Site, Forest, OperatingSystem
ForEach ($ DC w $ AllDCs)

Foreach ($ P w $ Porty)
$ check = Test-NetConnection $ DC -Port $ P -WarningAction SilentlyContinue
Jeśli ($ check.tcpTestSucceeded -eq $ true)
Write-Host $ DC.name $ P -ForegroundColor Green -Separator "=>"
jeszcze
Write-Host $ DC.name $ P -Separator "=>" -ForegroundColor Red

Skrypt sprawdzi określone porty TCP na kontrolerach domeny, a jeśli jeden z portów jest niedostępny, zaznacz go na czerwono (z niewielkimi modyfikacjami możesz uruchomić ten skrypt PowerShell jako usługę Windows).

Skaner sieciowy PowerShell

Możesz także wdrożyć prosty skaner portów i podsieci IP, aby skanować zdalne serwery lub podsieci w poszukiwaniu otwartych / zamkniętych portów TCP.

Skanujemy zakres adresów IP na otwartym porcie 3389:

foreach ($ ip za 5 ... 30) Test-NetConnection -Port 3389 -InformationLevel „Szczegółowe” 10.10.10. $ ip

Skanujemy zakres portów TCP od 1 do 1024 na określonym serwerze:

foreach ($ port w 1 ... 1024) If (($ a = Test-NetConnection srvfs01 -Port $ port -WarningAction SilentlyContinue) .tcpTestSucceeded -eq $ true) "Port TCP $ port jest otwarty!"