В 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
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
В скороченому вигляді аналогічна команда виглядає так:
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
).
У командлет є спеціальний параметр -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!"