많은 관리자들이 Windows에서 활성 TCP/IP 연결과 열린 TCP 포트를 확인할 때 netstat 콘솔 도구나 GUI 기반의 TCPView를 주로 사용합니다. 하지만 netstat 대신 PowerShell의 Get-NetTCPConnection cmdlet을 사용하면 Windows의 활성 네트워크 연결, 열린 TCP 포트, 그리고 TCP/IP 프로토콜을 사용 중인 프로세스 정보를 손쉽게 얻을 수 있습니다. PowerShell을 활용하면 복잡한 스크립트를 작성하여 열린 포트, 프로세스, 설정된 네트워크 연결을 체계적으로 모니터링하는 것도 가능합니다.
Get-NetTCPConnection 기본 사용법
먼저 아무 옵션 없이 Get-NetTCPConnection 명령어를 실행해 보겠습니다.

netstat와 마찬가지로 이 명령은 로컬 및 원격 IP 주소, 포트 번호, 연결 상태(Listen, Established, TimeWait, Bound, CloseWait, SynReceived, SynSent), 그리고 해당 TCP 연결을 사용 중인 프로세스 ID(PID) 목록을 표시합니다.
수신 대기 중인(열린) 포트 목록 확인
로컬 컴퓨터에서 열려 있는(수신 대기 중인) 포트 목록을 표시하려면 다음 명령을 사용합니다.
Get-NetTCPConnection -State Listen | Select-Object -Property LocalAddress, LocalPort, RemoteAddress, RemotePort, State | Sort-Object LocalPort | ft

UDP 포트 정보를 확인하려면 Get-NetUDPEndpoint cmdlet을 사용하면 됩니다.
인터넷(외부) 연결만 표시하기
외부 인터넷 연결만 필터링해서 보고 싶다면 다음 명령을 사용합니다.
Get-NetTCPConnection -AppliedSetting Internet
원격 호스트 DNS 이름과 프로세스 이름 함께 표시
TCP 연결에 대해 원격 호스트의 DNS 이름과 프로세스 이름까지 함께 표시할 수도 있습니다.
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 이름으로 변환하고, 각 연결을 생성한 프로세스의 이름까지 함께 보여줍니다.

네트워크를 사용 중인 Windows 서비스 목록 조회
부모 프로세스의 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
}
}
위 예제는 Chrome 브라우저가 맺은 모든 활성 연결을 필터링하여 보여줍니다. 와일드카드 패턴을 변경하면 원하는 어떤 프로세스든 추적할 수 있습니다.
RDP 포트 3389 연결 감지 및 알림 스크립트
Get-NetTCPConnection cmdlet은 다양한 시나리오에서 활용할 수 있습니다. 예를 들어, 특정 IP 주소에서 지정된 로컬 포트로 연결이 설정되는지 감시하고, 관리자에게 팝업 알림을 표시하는 간단한 PowerShell 스크립트를 만들 수 있습니다.
다음 예제의 PowerShell 스크립트는 기본 RDP 포트인 3389번으로 지정된 IP 주소의 연결이 나타나는지 확인합니다. 연결이 감지되면 팝업 알림을 표시하고, 연결 날짜와 시간을 텍스트 파일에 기록합니다.
$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
}
}

같은 방식으로 SSH, SMB, FTP, SMTP 등 다른 프로토콜의 네트워크 연결도 모니터링하고 로그로 남길 수 있습니다. 이 PowerShell 스크립트는 시스템 시작 시 자동으로 실행되도록 Windows 서비스로 변환하는 것도 가능합니다. 또한 앞서 소개한 'PowerShell을 활용한 RDP 무차별 대입 공격(Brute Force) 방어' 스크립트와 함께 사용하면 더욱 효과적입니다.
원격 컴퓨터의 TCP 연결 확인하기
PowerShell 원격 기능 cmdlet(Enter-PSSession, Invoke-Command)을 사용하면 원격 컴퓨터의 열린 TCP 포트와 연결 목록도 조회할 수 있습니다.
Invoke-Command -ComputerName be-dc01 {Get-NetTCPConnection -State Established}
마무리
Get-NetTCPConnection cmdlet은 Test-NetConnection과 마찬가지로 Windows에서 네트워크 연결을 추적하고 진단하는 데 매우 유용한 도구입니다. netstat의 단순 조회 기능을 넘어, 스크립트 자동화와 실시간 모니터링까지 구현할 수 있으므로 서버 관리 업무에 적극적으로 활용해 보시기 바랍니다.