WinRM 포트: 기본 설정 및 사용자 정의 가이드

원격 Windows 컴퓨터를 관리할 때 WinRM과 PowerShell Remoting은 중요한 기능입니다. 다른 서비스와 마찬가지로 WinRM은 특정한 상황에서 특정 포트에서 수신 대기합니다. 이 튜토리얼에서는 해당 WinRM 포트를 알아보고 필요한 경우 포트를 변경하는 방법을 배워보세요.

관련 자료: PowerShell Remoting: 궁극적인 가이드

WinRM 수신 대기자

WinRM (및 해당 포트)의 가장 중요한 부분 중 하나는 WinRM 수신 대기자입니다.

WinRM 수신 대기자는 본질적으로 웹 서버입니다. HTTP 및 HTTPS와 통신하며, Windows 7 이전 시절에는 대부분의 웹 서버가 사용하는 포트 80과 포트 443로 기본 설정되었습니다.

수신 대기자는 컴퓨터에서 서비스로 실행되며, 일반적인 웹 서버와 마찬가지로 연결을 시도하기 위해 대기합니다.

A WinRm listener can listen two different ways; HTTP or HTTPS. The WinRM port for HTTP is 5985 while the WinRm port for HTTPS is 5986, by default.

  • HTTP – 포트 5985
  • HTTPS – 포트 5986

관련 자료: PowerShell Remoting: 궁극적인 가이드

잘못된 포트로 연결하는 오류

포트를 변경할 때 방화벽 규칙을 추가하지 않으면, 포트를 지정해도 동일한 메시지가 표시됩니다.

WinRM 포트 변경하기

Microsoft는 호환성과 사용의 편의성을 위해 기본 수신 대기 포트를 사용할 것을 권장하지만, 포트를 변경할 수도 있습니다. 기본 포트와 충돌이 있는 경우나 해당 포트의 사용이 차단되는 방화벽 제한이 있는 경우에 유용할 수 있습니다.

아마도 사용자 지정 포트를 통해 WinRM에 연결하도록 구성된 시스템이 있을 것입니다. 일반적으로 연결하려고 하면 다음 오류 메시지가 표시됩니다:

Failed WinRM connection due to wrong port

그렇다면 서버 측에서 WinRM 포트를 변경해야 할 시간입니다!

WinRm 포트를 변경하려면 먼저 해당 포트에서 이미 수신 대기 중인 서비스가 있는지 확인해야 합니다.

기존 연결 추적하기

Windows 컴퓨터에서 사용 중인 포트를 확인하는 가장 쉬운 방법은 netstat 도구를 사용하는 것입니다. Netstat는 시스템에서 활성 포트를 모두 확인하고, 활성인 경우 소스 및 대상 IP 및 포트를 반환합니다.

WinRm 포트를 변경하기 전에 수신 대기 중인 포트를 추적하려면 netstat -aon을 실행합니다. -aon 스위치는 다음을 수행합니다:

  • 모든 활성 연결을 표시합니다 (a)
  • 연결을 열었던 프로세스의 프로세스 ID를 표시합니다 (o)
  • 대상 IP의 DNS 이름을 해결하지 않습니다 (n)
Running netstat to find listening connections

예를 들어, 웹 서버가 포트 80에서 수신 대기하고 있다면, Local Address 열 아래에서 로컬 주소가 :80로 끝나는 행을 볼 수 있습니다. 이 행에서 연결에 사용되는 PID 또는 프로세스 ID를 확인할 수 있습니다.

PID를 알고 나면 Get-Process PowerShell cmdlet과 같은 방법을 사용하여 PID를 참조하여 프로세스 이름을 찾을 수 있습니다.

Running Get-Process to find process name

그러나 이 경우에는 위에서 볼 수 있듯이 프로세스 이름은 시스템입니다. 이는 해당 프로세스가 운영 체제에 매우 통합되어 있으며 아마도 Windows에 내장되어 있음을 의미합니다.

WinRM 호환성 포트 설정

WinRM에는 호환성 포트라는 기능이 있습니다. 호환성 포트는 HTTP에는 80 포트, HTTPS에는 443 포트에서만 작동하는 일부 레거시 시스템과의 하위 호환성을 제공하기 위해 존재합니다. WinRM을 이러한 포트에서 수신하도록 변경해야 하는 경우 호환성 리스너를 활성화하십시오.

포트 80 및 443에서 다른 실행 중인 프로세스가 없다는 것을 알면 WSMan 리스너를 호환성 포트(HTTP의 경우 80, HTTPS의 경우 443)를 사용하도록 설정하십시오.

Set-Item WSMan:\localhost\Service\EnableCompatibilityHttpListener -Value $true
 Set-Item WSMan:\localhost\Service\EnableCompatibilityHttpsListener -Value $true

WinRM이 모든 포트에서 수신하도록 설정

어떤 이유로든 WinRM을 표준이 아닌 포트에서 수신하도록 구성해야 하는 경우도 있을 수 있습니다. 다음과 같이 수행할 수 있습니다:

  1. 리스너 이름 찾기. Get-Item cmdlet을 사용하여 모든 WinRM 리스너를 나열하여 수행할 수 있습니다. 아래 명령은 현재 설치된 모든 리스너를 나열합니다(*).
Get-Item WSMan:\localhost\Listener*
Getting all existing WinRm listeners

2. 다음으로 위에서 표시된 리스너 이름을 사용하여 각 리스너를 Set-Item을 사용하여 구성하고 리스너의 경로와 변경할 포트 번호를 제공합니다.

Set-Item WSMan:\localhost\Listener\\Port -Value 

3. 이 시점에서 WinRM 리스너는 올바른 포트에서 수신하고 있으며, Windows 방화벽은 아마 해당 포트로의 원격 연결을 거부하고 있을 것입니다. 해당 포트를 열어야 합니다. 이를 위해 다음 명령을 실행하세요. 아래의 New-NetFirewallRule은 사용자 정의 포트로의 모든 들어오는 TCP 연결을 허용하기 위한 Windows 방화벽 규칙을 생성합니다.

$FirewallParam = @{
     DisplayName = 'Custom WinRM Port Rule'
     Direction = 'Inbound'
     LocalPort = 
     Protocol = 'TCP'
     Action = 'Allow'
     Program = 'System'
 }
 New-NetFirewallRule @FirewallParam

관련 자료: Windows 방화벽 비활성화: 다양한 방법 알아보기

만약 올바른 Windows 방화벽 포트를 열지 않았다면, 연결을 시도할 때 다음과 같은 메시지가 표시됩니다:

Failed WinRM connection due to Windows firewall

PSRemoting을 사용하여 사용자 지정 포트에 연결하기

이제 WinRM 서버에 성공적으로 설정하고 구성했으므로, WinRM 클라이언트로 연결을 테스트해야 합니다. 그것을 위해서는 추가적인 매개변수인 Port만 필요합니다.

Invoke-Command 또는 Enter-PSSession과 같은 PSRemoting 명령 중 어떤 것이든지, Port 매개변수와 성공적인 연결을 위해 설정한 포트를 지정하세요.

Enter-PSSession -ComputerName <hostname> -Port 1111
Successful WinRm connection

관련 자료: Invoke-Command: 원격 코드 실행의 최상의 방법

Source:
https://adamtheautomator.com/winrm-port/