Computer >> คอมพิวเตอร์ >  >> ระบบ >> Windows Server

การตรวจสอบการเชื่อมต่อ TCP/IP ที่ใช้งานอยู่บน Windows ด้วย PowerShell

ผู้ดูแลระบบหลายคนมักใช้ netstat เครื่องมือคอนโซลหรือกราฟิก TCPView เพื่อแสดงข้อมูลเกี่ยวกับการเชื่อมต่อ TCP/IP ที่ใช้งานอยู่และเปิดพอร์ต TCP ใน Windows แทนที่จะใช้ netstat คุณสามารถใช้ Get-NetTCPConnection cmdlet ใน PowerShell เพื่อรับข้อมูลเกี่ยวกับการเชื่อมต่อเครือข่ายที่ใช้งานอยู่ใน Windows เปิดพอร์ต TCP และกระบวนการที่ทำงานอยู่ซึ่งใช้โปรโตคอล TCP/IP PowerShell ทำให้ง่ายต่อการเขียนสคริปต์ที่ซับซ้อนเพื่อรับข้อมูลและตรวจสอบพอร์ต TCP ที่เปิดอยู่ กระบวนการ และการเชื่อมต่อเครือข่ายที่สร้างขึ้น

ลองเรียกใช้ Get-NetTCPConnection คำสั่งโดยไม่มีตัวเลือกใดๆ

การตรวจสอบการเชื่อมต่อ TCP/IP ที่ใช้งานอยู่บน Windows ด้วย PowerShell

เช่นเดียวกับ netstat คำสั่งได้แสดงรายการการเชื่อมต่อที่ใช้งานอยู่ทั้งหมดที่มีที่อยู่ IP, พอร์ต, สถานะการเชื่อมต่อภายในและระยะไกล (ฟัง , อินเทอร์เน็ตที่จัดตั้งขึ้น , TimeWait , ผูกพัน , CloseWait , SynReceived , SynSent ) และ ID กระบวนการ (PID) ที่ใช้การเชื่อมต่อ TCP นี้

คุณสามารถแสดงรายการพอร์ตที่เปิด (ฟัง) บนคอมพิวเตอร์ของคุณ:

Get-NetTCPConnection -State Listen | Select-Object -Property LocalAddress, LocalPort, RemoteAddress, RemotePort, State | Sort-Object LocalPort |ft

การตรวจสอบการเชื่อมต่อ TCP/IP ที่ใช้งานอยู่บน Windows ด้วย PowerShell

Get-NetUDPEndpoint cmdlet ใช้เพื่อรับข้อมูลเกี่ยวกับพอร์ต UDP

คุณสามารถแสดงการเชื่อมต่อภายนอก (อินเทอร์เน็ต) เท่านั้น:

Get-NetTCPConnection -AppliedSetting Internet

คุณสามารถแสดงชื่อ DNS ของโฮสต์ระยะไกลและชื่อกระบวนการสำหรับการเชื่อมต่อ TCP:

Get-NetTCPConnection -State Established |Select-Object -Property LocalAddress, LocalPort,@{name='RemoteHostName';expression={(Resolve-DnsName $_.RemoteAddress).NameHost}},RemoteAddress, RemotePort, State,@{name='ProcessName';expression={(Get-Process -Id $_.OwningProcess). Path}},OffloadState,CreationTime |ft

สคริปต์ PowerShell นี้แก้ไขที่อยู่ IP ของโฮสต์ทั้งหมดเป็นชื่อ DNS และชื่อกระบวนการที่ระบุสำหรับการเชื่อมต่อทั้งหมด

การตรวจสอบการเชื่อมต่อ TCP/IP ที่ใช้งานอยู่บน Windows ด้วย PowerShell

ด้วยชื่อของกระบวนการหลัก PID คุณสามารถแสดงรายการบริการ Windows ที่เกี่ยวข้องซึ่งกำลังใช้เครือข่าย:

Get-WmiObject Win32_Service | Where-Object -Property ProcessId -In (Get-NetTCPConnection).OwningProcess | Where-Object -Property State -eq Running | Format-Table ProcessId, Name, Caption, StartMode, State, Status, PathName

คุณสามารถดูได้เฉพาะการเชื่อมต่อเครือข่ายที่เริ่มต้นโดยกระบวนการเฉพาะ ในการดำเนินการนี้ คุณสามารถใช้สคริปต์ PowerShell ต่อไปนี้:

$TrackProcessName = "*chrome*"
$EstablishedConnections = Get-NetTCPConnection -State Established |Select-Object -Property LocalAddress, LocalPort,@{name='RemoteHostName';expression={(Resolve-DnsName $_.RemoteAddress).NameHost}},RemoteAddress, RemotePort, State,@{name='ProcessName';expression={(Get-Process -Id $_.OwningProcess). Path}}, OffloadState,CreationTime
Foreach ($Connection in $EstablishedConnections)
{
If ($Connection.ProcessName -like $TrackProcessName)
{
$Connection|ft
}
}

คุณสามารถใช้ Get-NetTCPConnection cmdlet ในสถานการณ์ต่างๆ ตัวอย่างเช่น คุณสามารถสร้างสคริปต์ PowerShell อย่างง่ายเพื่อติดตามว่าสร้างการเชื่อมต่อจากที่อยู่ IP เฉพาะไปยังพอร์ตในเครื่องที่ระบุหรือไม่ และแสดงการแจ้งเตือนแบบป๊อปอัปไปยังผู้ดูแลระบบ

ในตัวอย่างต่อไปนี้ สคริปต์ PowerShell จะตรวจสอบว่าการเชื่อมต่อจากที่อยู่ IP ที่ระบุปรากฏบนพอร์ต RDP เริ่มต้น 3389 หรือไม่ หากการเชื่อมต่อปรากฏขึ้น สคริปต์จะแสดงการแจ้งเตือนป๊อปอัปและบันทึกวันที่และเวลาของการเชื่อมต่อไปยัง ไฟล์ข้อความ:

$SourceIP = “192.168.13.125”
$TargetPort =”3389”
$log = "C:\PS\rdp_connection_log.txt"
$EstablishedConnections = Get-NetTCPConnection -State Established
Foreach ($Connection in $EstablishedConnections)
{
If (($Connection.RemoteAddress -eq $SourceIP) -and ($Connection.LocalPort -eq $TargetPort))
{
Add-Type -AssemblyName System.Windows.Forms
$global:balmsg = New-Object System.Windows.Forms.NotifyIcon
$path = (Get-Process -id $pid).Path
$balmsg.Icon = [System.Drawing.Icon]::ExtractAssociatedIcon($path)
$balmsg.BalloonTipIcon = [System.Windows.Forms.ToolTipIcon]::Warning
$balmsg.BalloonTipText = "New RDP connection to your computer from $($Connection.RemoteAddress)"
$balmsg.BalloonTipTitle = "New RDP connection from ($Connection.RemoteAddress)"
$balmsg.Visible = $true
$balmsg.ShowBalloonTip(10000)
(Get-Date).ToString() + ' ' + $Connection.RemoteAddress + ' an RDP connection is established ' >> $log
}
}

การตรวจสอบการเชื่อมต่อ TCP/IP ที่ใช้งานอยู่บน Windows ด้วย PowerShell

ในทำนองเดียวกัน คุณสามารถตรวจสอบและบันทึกการเชื่อมต่อเครือข่ายผ่านโปรโตคอลอื่นๆ เช่น SSH, SMB, FTP, SMTP เป็นต้น สคริปต์ PowerShell นี้อาจแปลงเป็นบริการ Windows ที่จะเริ่มทำงานโดยอัตโนมัติ

คุณสามารถใช้สคริปต์ร่วมกับสคริปต์ที่เราพูดถึงก่อนหน้านี้:RDP Brute Force Attack Protection พร้อม Powershell

คุณสามารถดูรายการพอร์ต TCP ที่เปิดอยู่และการเชื่อมต่อบนคอมพิวเตอร์ระยะไกลได้โดยใช้ cmdlet ระยะไกลของ PowerShell (Enter-PSSession และ Invoke-Command)

Invoke-Command -ComputerName be-dc01 {Get-NetTCPConnection -State Established}

Get-NetTCPConnection cmdlet (เช่นเดียวกับ Test-NetConnection) อาจมีประโยชน์มากในการติดตามและวินิจฉัยการเชื่อมต่อเครือข่ายใน Windows