Test-NetConnection: мережева діагностика у PowerShell — сучасна заміна telnet і tracert
- Command запускається в PowerShell (не cmd). Синонім — коротша форма
tnc. - Доступний з Windows 8.1 / Server 2012 R2 і новіше. На старіших системах —
Test-Connection(ping only) або сторонні tools. - ICMP (ping-частина) блокується deafult Windows Firewall. Якщо
PingSucceeded : False— це ще не завжди значить «недоступно».
Базовий синтаксис
Test-NetConnection -ComputerName <host> [-Port <N>] [-InformationLevel Detailed] [-TraceRoute] [-CommonTCPPort HTTP|RDP|SMB|WINRM]
Мінімальний виклик — перевірка TCP-порту:
Test-NetConnection smtp.office365.com -Port 587
Результат у консолі показує 5-7 ключових рядків: чи досяжний хост, чи відкритий порт, який інтерфейс використаний, який SourceAddress, RTT, чи є маршрут.
Сценарій 1. TCP-перевірка (заміна telnet)
Задача: перевірити, чи SMTP-relay на Office 365 відповідає. Фаєрвол чи зовнішня блокіровка?
Test-NetConnection smtp.office365.com -Port 587
Ключові поля у виводі:
TcpTestSucceeded : True— порт відкритий і приймає з'єднання.TcpTestSucceeded : False— порт закритий або заблокований фаєрволом / NAT.RemoteAddress— який IP DNS повернув для імені.SourceAddress— з якого свого інтерфейсу пішов пакет (важливо при multi-homed).
Для швидкої перевірки у скриптах використовуйте -InformationLevel Quiet — повертає тільки True/False:
if (Test-NetConnection smtp.office365.com -Port 587 -InformationLevel Quiet) {
Write-Host "SMTP reachable"
} else {
Write-Host "SMTP BLOCKED"
}
Сценарій 2. Короткі назви типових портів
Задача: перевірити доступність RDP / SMB / HTTP / WinRM до віддаленої машини без запам'ятовування номерів.
Test-NetConnection fileserver01 -CommonTCPPort SMB
Test-NetConnection webapp.corp.local -CommonTCPPort HTTP
Test-NetConnection dc01.corp.local -CommonTCPPort WINRM
Мапінг: HTTP=80, SMB=445, RDP=3389, WINRM=5985. Якщо потрібен HTTPS (443) — через -Port 443, короткої назви для нього нема.
Сценарій 3. Детальна діагностика з маршрутом
Задача: щоразу «сайт повільний», але з інших машин швидко. Треба побачити де гальмує.
Test-NetConnection google.com -TraceRoute -InformationLevel Detailed
Друкує:
- Traceroute по хопах (як
tracert), але у PowerShell-об'єктах, які далі можна фільтрувати. - RTT (PingReplyDetails) — для кожного хопа.
- Route reliability за кількома пакетами.
Комбо для пошуку «хто повільний»:
(Test-NetConnection google.com -TraceRoute).TraceRoute
Повертає масив IP-ів по хопам. Далі можна зробити Test-Connection до кожного для виміру latency.
Сценарій 4. Перевірка DNS-резолвингу
Задача: «сервер недоступний», підозра на DNS.
Test-NetConnection mysite.corp.local -InformationLevel Detailed
У виводі:
NameResolutionSucceeded : True— DNS вирішився у IP.RemoteAddress : 192.168.10.5— саме той IP, що повернув DNS. Порівняйте з очікуваним.NameResolutionSucceeded : False— DNS не зміг резолвити. Причина — у самому DNS, не у мережі.
Для глибшого DNS-аналізу з конкретним типом запиту (MX, TXT, SRV) — Resolve-DnsName. Test-NetConnection робить тільки A/AAAA для заданого host.
Сценарій 5. Вибір конкретного source-інтерфейсу
Задача: на сервері два мережеві інтерфейси — management (192.168.10.x) і production (10.0.0.x). Перевірка має піти через production, а не management.
Test-NetConnection prod-db.corp.local -Port 1433 -SourceAddress 10.0.0.15
Якщо -SourceAddress не вказати, Windows сам вибере за метрикою маршрутизації. Типово це управлінський інтерфейс, що може дати хибне «працює» / «не працює».
Сценарій 6. Масова перевірка в циклі
Задача: перевірити доступність 20 бекенд-сервісів з одного хоста, зібрати статус у CSV.
$targets = @(
@{Host='api1.corp.local'; Port=8443},
@{Host='api2.corp.local'; Port=8443},
@{Host='redis01.corp.local'; Port=6379},
@{Host='smtp.corp.local'; Port=587}
)
$results = foreach ($t in $targets) {
$r = Test-NetConnection $t.Host -Port $t.Port -WarningAction SilentlyContinue
[PSCustomObject]@{
Host = $t.Host
Port = $t.Port
Reachable = $r.TcpTestSucceeded
Latency = $r.PingReplyDetails.RoundtripTime
}
}
$results | Export-Csv C:\Temp\net-check.csv -NoTypeInformation
-WarningAction SilentlyContinue прибирає warning-спам у консолі (TNC за замовчуванням кидає warning, якщо ping не пройшов але порт відкритий).
Типові пастки
PingSucceeded : False ≠ «недоступно»ICMP блокується за замовчуванням у багатьох корпоративних фаєрволах і Windows Firewall. Хост може бути повністю функціональний через TCP 443, але ping не проходить. Завжди дивіться TcpTestSucceeded, а не PingSucceeded, якщо вказували -Port.
Якщо порт закритий фаєрволом (drop, не reject), TNC чекатиме 20+ секунд перед тим як повернути False. Це нормально. Для швидких перевірок у скриптах:
Test-NetConnection host -Port N -WarningAction SilentlyContinue -ErrorAction SilentlyContinue -InformationLevel Quiet -ConnectTimeout 3
Увага: параметра -ConnectTimeout в TNC немає. Для швидкого таймауту — System.Net.Sockets.TcpClient:
$tcp = New-Object System.Net.Sockets.TcpClient
$iar = $tcp.BeginConnect('host', 443, $null, $null)
$ok = $iar.AsyncWaitHandle.WaitOne(3000, $false)
$tcp.Close()
$ok
Test-NetConnection робить тільки TCP-handshake. UDP-сервіси (DNS 53, SNMP 161, syslog 514, VoIP RTP) вона не перевірить. Для UDP — сторонні утиліти (nmap -sU) або спеціалізовані скрипти.
Коротка пам'ятка
Test-NetConnection host -Port 443— перевірити TCP-порт.Test-NetConnection host -CommonTCPPort RDP— RDP з короткою назвою.Test-NetConnection host -TraceRoute -InformationLevel Detailed— повний traceroute.Test-NetConnection host -Port N -InformationLevel Quiet— True/False для скриптів.Test-NetConnection host -SourceAddress X.X.X.X -Port N— з конкретного інтерфейсу.(tnc host -TraceRoute).TraceRoute— масив IP по хопам.
Пов'язане
- ← Назад до Атласу команд Windows.
nslookup/Resolve-DnsName— коли треба DNS-запити з конкретним типом.tracert/pathping— класичні tools, якщо PowerShell недоступний.
Test-NetConnection — не просто «заміна telnet». Це стандартний PowerShell-об'єкт, який інтегрується у скрипти. Звикніть до неї як до базового мережевого інструмента — часу вона економить багато.