بررسی پورتهای باز با Test-NetConnection در پاورشل
Test-NetConnection | در PowerShell، شما میتوانید از cmdlet `Test-NetConnection` استفاده کنید تا بررسی کنید که آیا یک پورت در یک کامپیوتر از راه دور در دسترس (باز) است یا خیر. شما میتوانید از این cmdlet برای بررسی پاسخ و دسترسپذیری یک سرور یا یک سرویس شبکه، بررسی اینکه آیا پورت TCP توسط فایروال مسدود شده، بررسی دسترسپذیری ICMP و مسیریابی استفاده کنید. در واقع، `Test-NetConnection` جایگزینی برای ابزارهای محبوب مدیریت شبکه مانند ping، tracert، telnet، pathping، اسکنر پورت TCP و غیره است.
بررسی پورت TCP باز با Test-NetConnection
شما میتوانید از cmdlet `Test-NetConnection` فقط برای بررسی پورتهای TCP استفاده کنید. به عنوان مثال، برای بررسی اینکه آیا پورت TCP 25 (پروتوکل SMTP) روی سرور ایمیل از راه دور باز است:
Test-NetConnection -ComputerName ny-msg01 -Port 25
توجه داشته باشید. شما فقط میتوانید با استفاده از cmdlet `Test-NetConnection` یک اتصال پورت TCP را تست کنید. ولی نمیتوانید از این cmdlet برای بررسی دسترسپذیری پورتهای UDP از راه دور استفاده کنید.
دستور `Test-NetConnection` نام مستعار `TNC` دارد. نسخه کوتاهتر از همان دستور به این شکل است:
TNC ny-msg01 -Port 25
نتیجه دستور به شرح زیر است:
ComputerName : ny-msg01 RemoteAddress : 10.20.1.7 RemotePort : 25 InterfaceAlias : CORP SourceAddress : 10.20.1.79 PingSucceeded : True PingReplyDetails (RTT) : 0 ms TcpTestSucceeded : True
همانطور که میبینید، این cmdlet نام سرور را به یک آدرس IP تبدیل میکند، پاسخ ICMP را بررسی میکند (مشابه ping) و پاسخ از پورت TCP (دسترسپذیری پورت) را بررسی میکند. سرور مشخص شده از طریق ICMP پاسخ میدهد (PingSucceeded = True) و پورت TCP 25 باز است (RemotePort=25، TcpTestSucceeded= True).
توجه: اگر دستور PingSucceeded=False و TcpTestSucceeded=True را برگرداند، این احتمالاً به این معناست که درخواست ICMP Echo (ping) روی کامپیوتر از راه دور غیرفعال شده است.
اگر شما `Test-NetConnection` را بدون پارامترها اجرا کنید، این چک میکند که آیا کامپیوتر به اینترنت وصل است.
شما میتوانید با افزودن گزینه –InformationLevel Detailed اطلاعات دقیقتری را هنگام بررسی یک پورت TCP از راه دور نمایش دهید:
TNC 192.168.32.101 -Port 3389 -InformationLevel Detailed
cmdlet یک پارامتر ویژه به نام –CommonTCPPort دارد که به شما اجازه میدهد تا نام یک پروتوکل شبکه شناخته شده (مانند HTTP، RDP، SMB، WINRM) را مشخص کنید.
برای بررسی دسترسپذیری یک وب سرور HTTP میتوانید از دستور زیر استفاده کنید:
Test-NetConnection -ComputerName nextadmin.net -CommonTCPPort HTTP
یا برای بررسی دسترسپذیری یک پورت RDP پیشفرض (TCP/3389):
Test-NetConnection ny-rds1 –CommonTCPPort RDP
شما میتوانید تمام پارامترهایی که cmdlet `Test-NetConnection` برمیگرداند را مشاهده کنید:
Test-NetConnection ny-man01 -port 445|Format-List *
اگر فقط نیاز دارید ببینید که آیا پورت در دسترس است، میتوانید آن را سریعتر بررسی کنید:
TNC ny-msg1 -Port 25 -InformationLevel Quiet
cmdlet True را برمیگرداند، که به این معناست که پورت TCP از راه دور باز است.
در نسخههای قبلی از Windows PowerShell (قبل از نسخه 4.0)، شما میتوانستید با دستور زیر دسترسپذیری یک پورت TCP از راه دور را بررسی کنید:
(New-Object System.Net.Sockets.TcpClient).Connect('ny-msg01', 25)
شما میتوانید با استفاده از پارامتر –TraceRoute در cmdlet `Test-NetConnection` یک مسیر به یک سرور از راه دور را ردیابی کنید (مشابه دستور tracert در ویندوز). شما میتوانید با استفاده از پارامتر -Hops حداکثر تعداد پرشها را هنگام بررسی مسیر محدود کنید.
Test-NetConnection ny-man01 –TraceRoute
Cmdlet یک خلاصه از تأخیر دسترسی شبکه به میلیثانیه برگردانده است (PingReplyDetails (RTT): 41 ms) و همچنین تمام آدرسهای IP مسیریابها در مسیر به میزبان مقصد.
PowerShell: بررسی پورتهای باز در چندین میزبان
شما میتوانید از PowerShell برای بررسی دسترسپذیری یک پورت خاص در تعدادی از کامپیوترهای از راه دور استفاده کنید. فهرست نامهای میزبان یا آدرسهای IP را در یک فایل متنی ساده با نام servers.txt ذخیره کنید.
برای مثال، وظیفه شما پیدا کردن میزبانهایی است که پورت TCP/25 در آنها پاسخ نمیدهد یا بسته است:
Get-Content c:\PS\list_servers.txt | where { -NOT (Test-Netconnection $_ -Port 25 -InformationLevel Quiet)}| Format-Table -AutoSize
شما میتوانید از یک اسکریپت نظارت ساده PowerShell استفاده کنید که دسترسپذیری سرورهای از راه دور را بررسی کند و اگر هر کدام از سرورها در دسترس نباشند، یک اعلان پاپاپ نمایش دهد.
برای مثال، شما میتوانید در طول یک بررسی سلامت AD، دسترسپذیری خدمات اصلی را در تمام کنترلکنندگان دامنه بررسی کنید (فهرست DC میتواند با cmdlet `Get-ADDomainController` به دست آید). بیایید خدمات زیر را در DC بررسی کنیم (یک قانون مشابه ‘Domain and trusts’ در ابزار PortQry وجود دارد):
– RPC – TCP/135
– LDAP – TCP/389
– LDAP – TCP/3268
– DNS – TCP/53
– Kerberos – TCP/88
– SMB – TCP/445
# Define the ports to be checked $Ports = "135", "389", "636", "3268", "53", "88", "445", "3269", "80", "443" # Retrieve the list of all domain controllers $AllDCs = Get-ADDomainController -Filter * | Select-Object Hostname, Ipv4address # An array to store the results $results = @() # Check each domain controller and the respective port ForEach ($DC in $AllDCs) { Foreach ($P in $Ports) { $check = Test-NetConnection $DC.Ipv4address -Port $P -WarningAction SilentlyContinue # Display the results based on port status If ($check.tcpTestSucceeded) { Write-Host "$($DC.Hostname) -> Port $P" -ForegroundColor Green } else { Write-Host "$($DC.Hostname) -> Port $P" -ForegroundColor Red } } } # Display the results $results | Format-Table Hostname, IP, Port, @{Name='Status'; Expression={if ($_.IsOpen) {'Open'} else {'Closed'}}}
اسکریپت پورتهای مشخصشده TCP را در کنترلکنندگان دامنه بررسی میکند و اگر هر کدام از پورتها در دسترس نباشند، آنها را به رنگ قرمز نشان میدهد.
اسکنر ساده TCP/IP در PowerShell
شما میتوانید از PowerShell برای پیادهسازی یک اسکنر IP ساده استفاده کنید که میزبانهای از راه دور یا زیرشبکههای IP را برای پورتهای TCP باز/بسته اسکن کند.
برای اسکن محدوده آدرسهای IP بین 192.168.1.100 و 192.168.1.150 و نمایش کامپیوترهایی که پورت 3389 را باز دارند:
foreach ($ip in 100..150) {Test-NetConnection -Port 3389 -InformationLevel "Detailed" 192.168.1.$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!"}}
چگونه پورتهای باز در ویندوز با PowerShell را فهرست کنیم
از cmdlet `Get-NetTCPConnection` برای فهرست کردن پورتهایی که روی کامپیوتر محلی باز هستند استفاده کنید (این معادل PowerShell برای NETSTAT است). فهرست تمام پورتهای TCP باز در کامپیوتر به شرح زیر است:
Get-NetTcpConnection -State Listen | Select-Object LocalAddress,LocalPort| Sort-Object -Property LocalPort | Format-Table
اگر میخواهید بفهمید که کدام برنامه (پروسه) در یک پورت خاص روی کامپیوتر شما گوش میدهد، از دستور زیر استفاده کنید (جایی که 443 یک شماره پورت است که میخواهید بررسی کنید):
$connection = Get-NetTCPConnection -LocalPort 443 -ErrorAction SilentlyContinue if ($connection) { Get-Process -Id $connection.OwningProcess | ft Id, ProcessName, UserName, Path } else { Write-Host "No active connection found on port 443." }