Test-NetConnection перевірка відкритих / закритих TCP портів з PowerShell

В PowerShell 4.0 (Windows 2012 R2, Windows 8.1 і вище) з'явився вбудований командлет для перевірки мережевого зв'язку - Test-NetConnection. За допомогою даного командлет ви можете перевірити доступність віддаленого сервера або мережевий служби на ньому, блокування TCP портів файерволами, перевірити доступність по ICMP і маршрутизацію. По суті, командлет Test-NetConnection дозволяє замінити відразу кілька звичних мережевих утиліт: ping, traceroute, сканер TCP портів і т.д.

зміст:

  • TCP Port Ping: Використання Test-NetConnection для перевірки відкритих портів і доступності серверів
  • Test-NetConnection в скриптах моніторингу
  • Сканер мережі на PowerShell

Будь-якому адміністратору періодично доводиться перевіряти доступність служби на віддаленому сервері шляхом перевірки відповіді від віддаленого TCP порту (наприклад, доступність поштового або веб сервера). Причому, всі звикли, що таку перевірку швидше за все виконати за допомогою команди telnet. Наприклад, для перевірки доступності SMTP служби на поштовому сервері (за замовчуванням він відповідає на 25 TCP порту) досить виконати команду telnet msk-msg01.winitpro.ru 25. Але починаючи з Windows 7 клієнт telnet виділений в окремий компонент, який потрібно встановлювати окремо. Подивимося, як виконати аналогічну дію в PowerShell.

Основна перевага командлет Test-NetConnection - він вже входить до складу всіх сучасних версій Windows і вам не потрібно встановлювати його окремо. Командлет входить до складу модуля NetTCPIP (Починаючи з PoSh v4.0).

Порада. Перевірити поточну встановлену версію PowerShell можна командою $ PSVersionTable.PSVersion

Значення 4 в стовпці Major говорить про те, що на комп'ютері встановлено PowerShell 4.0.

TCP Port Ping: Використання Test-NetConnection для перевірки відкритих портів і доступності серверів

Перевіримо, чи відкритий порт TCP 25 (SMTP протокол) на поштовому сервері за допомогою Test-NetConnection:

Test-NetConnection -ComputerName msk-msg01 -Port 25

Примітка. За допомогою командлета Test-NetConnection можна перевірити тільки TCP з'єднання, для перевірки доступності UDP портів він не застосуємо.

В скороченому вигляді аналогічна команда виглядає так:

TNC msk-mail1 -Port 25

Розберемо результат команди:

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 

Як ви бачите, командлет виконує дозвіл імені сервера в IP адресу, виконується перевірка відповіді ICMP (аналог ping) і доступність TCP порту. Зазначений сервер доступний по ICMP (PingSucceeded = True) І 25 TCP порт також відповідає (RemotePort = 25, TcpTestSucceeded = True).

Примітка.  У деяких випадках може виявитися, що PingSucceeded = False, а TcpTestSucceeded = True. Швидше за все означає, що на віддаленому сервері заборонений ICMP Ping.

У командлет є спеціальний параметр -CommonTCPPort, дозволяє вказати найменування відомого мережевого протоколу (HTTP, RDP, SMB, WINRM).

Наприклад, щоб перевірити доступність веб-сервера, можна використовувати команду:

Test-NetConnection -ComputerName winitpro.ru -CommonTCPPort HTTP

Або доступність RDP порту (3389):

Test-NetConnection msk-rds1 -CommonTCPPort RDP

Можна вивести всі параметри, які повертає командлет Test-NetConnection:

Test-NetConnection msk-man01 -port 445 | Format-List *

Якщо потрібна тільки інформація по доступності TCP порту, в більш лаконічному вигляді перевірка може бути виконана так:

TNC msk-mail1 -Port 25 -InformationLevel Quiet

Командлет повернув True, значить віддалений порт доступний.

Порада. У попередніх версіях PowerShell перевірити доступність віддаленого TCP порту можна так:

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

У Windows 10 / Windows Server 2016 ви можете використовувати командлет Test-NetConnection для трасування маршруту до віддаленого сервера за допомогою параметра -TraceRoute (Аналог tracert). За допомогою параметра -Hops можна обмежити максимальну кількість хопов при перевірці.

Test-NetConnection msk-man01 -TraceRoute

Командлет повернув мережеву затримку при доступі до сервера в мілісекундах (PingReplyDetails (RTT): 41 ms) І все IP адреси маршрутизаторів на шляху до цільового сервера.

Test-NetConnection в скриптах моніторингу

Наступна команда дозволити перевірити доступність певного порту на безлічі серверів, список яких зберігається в текстовому файлі servers.txt. Нас цікавлять сервера, де шукана служба не відповідає:

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

Аналогічним чином ви можете створити найпростішу систему моніторингу, яка перевіряє доступність серверів і виводить повідомлення, якщо один з серверів недоступний.

Наприклад, ви можете перевірити доступність основних служб на всіх контролерів домену (список DC можна отримати Командлети Get-ADDomainController). Перевіримо наступні служби на DC (в утиліті PortQry є така сама процедура Domain and trusts):

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

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

Foreach ($ P in $ Ports)
$ Check = Test-NetConnection $ DC -Port $ P -WarningAction SilentlyContinue
If ($ check.tcpTestSucceeded -eq $ true)
Write-Host $ DC.name $ P -ForegroundColor Green -Separator "=>"
else
Write-Host $ DC.name $ P -Separator "=>" -ForegroundColor Red

Скрипт перевірить зазначені TCP порти на контролерах домену, і, якщо один з портів недоступний, виділить його червоним кольором (з невеликими доробками можна запустити даний PowerShell скрипт як службу Windows).

Сканер мережі на PowerShell

Також ви можете реалізувати простий сканер портів і IP підмереж для сканування віддалених серверів або підмереж на відкриті / закриті TCP порти.

Просканіруем діапазон IP адрес на відкритий порт 3389:

foreach ($ ip in 5 ... 30) Test-NetConnection -Port 3389 -InformationLevel "Detailed" 10.10.10. $ ip

Просканіруем діапазон TCP портів від 1 до 1024 на зазначеному сервері:

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