포트 소모 문제 해결

적용 대상: Windows 10

TCP 및 UDP 프로토콜은 연결 설정에 사용되는 포트 번호를 기반으로 작동합니다. TCP/UDP 연결을 설정해야 하는 모든 애플리케이션 또는 서비스에는 해당 쪽에 포트가 필요합니다.

포트에는 두 가지 유형이 있습니다.

  • 동적 포트인 임시 포트는 기본적으로 모든 컴퓨터가 아웃바운드 연결을 만들어야 하는 포트 집합입니다.
  • 잘 알려진 포트는 특정 애플리케이션 또는 서비스에 대해 정의된 포트입니다. 예를 들어 파일 서버 서비스는 포트 445, HTTPS는 443, HTTP는 80, RPC는 135입니다. 사용자 지정 애플리케이션에는 자체 정의된 포트 번호도 있습니다.

애플리케이션 또는 서비스와 연결이 설정되는 경우 클라이언트 디바이스는 디바이스의 임시 포트를 사용하여 해당 애플리케이션 또는 서비스에 대해 정의된 잘 알려진 포트에 연결합니다. 클라이언트 컴퓨터의 브라우저는 임시 포트를 사용하여 포트 443에 연결합니다 https://www.microsoft.com .

동일한 브라우저가 여러 웹 사이트에 많은 연결을 만드는 시나리오에서 브라우저가 시도하는 새 연결의 경우 임시 포트가 사용됩니다. 시간이 지나면 연결이 실패하기 시작하고 브라우저가 사용 가능한 모든 포트를 사용하여 외부에서 연결을 만들고 더 이상 사용할 수 있는 포트가 없으므로 연결을 설정하려는 새로운 시도가 실패하기 때문에 이 오류가 발생할 가능성이 높습니다. 컴퓨터의 모든 포트를 사용하는 경우 이를 포트 소모라고 합니다.

TCP/IP에 대한 기본 동적 포트 범위

IANA(인터넷 할당 번호 기관) 권장 사항을 준수하기 위해 Microsoft는 나가는 연결에 대한 동적 클라이언트 포트 범위를 늘렸습니다. 새 기본 시작 포트는 49152이고 새 기본 끝 포트는 65535입니다. 이러한 증가는 기본 포트 범위 1025~5000을 사용한 이전 버전의 Windows 구성에서 변경된 것입니다.

다음 netsh 명령을 사용하여 컴퓨터에서 동적 포트 범위를 볼 수 있습니다.

  • netsh int ipv4 show dynamicport tcp
    
  • netsh int ipv4 show dynamicport udp
    
  • netsh int ipv6 show dynamicport tcp
    
  • netsh int ipv6 show dynamicport udp
    

범위는 각 전송(TCP 또는 UDP)에 대해 개별적으로 설정됩니다. 이제 포트 범위는 시작점과 끝점이 있는 범위입니다. Windows Server를 실행하는 서버를 배포하는 Microsoft 고객은 내부 네트워크에서 방화벽을 사용하는 경우 서버 간의 RPC 통신에 영향을 주는 문제가 있을 수 있습니다. 이러한 상황에서는 49152~65535의 동적 포트 범위에서 서버 간의 트래픽을 허용하도록 방화벽을 다시 구성하는 것이 좋습니다. 이 범위는 서비스 및 애플리케이션에서 사용되는 잘 알려진 포트에 추가됩니다. 또는 서버에서 사용하는 포트 범위를 각 서버에서 수정할 수 있습니다. 다음과 같이 netsh 명령을 사용하여 이 범위를 조정합니다. 위의 명령은 TCP에 대한 동적 포트 범위를 설정합니다.

netsh int <ipv4|ipv6> set dynamic <tcp|udp> start=number num=range

시작 포트는 숫자이고 총 포트 수는 범위입니다. 다음은 샘플 명령입니다.

  • netsh int ipv4 set dynamicport tcp start=10000 num=1000
    
  • netsh int ipv4 set dynamicport udp start=10000 num=1000
    
  • netsh int ipv6 set dynamicport tcp start=10000 num=1000
    
  • netsh int ipv6 set dynamicport udp start=10000 num=1000
    

이러한 샘플 명령은 동적 포트 범위를 포트 10000에서 시작하고 포트 10999(1000 포트)에서 종료하도록 설정합니다. 설정할 수 있는 포트의 최소 범위는 255개입니다. 설정할 수 있는 최소 시작 포트는 1025입니다. 구성되는 범위에 따라 최대 끝 포트는 65535를 초과할 수 없습니다. Windows Server 2003의 기본 동작을 복제하려면 1025를 시작 포트로 사용한 다음 TCP 및 UDP 모두에 대한 범위로 3976을 사용합니다. 이 사용 패턴은 1025의 시작 포트와 5000의 끝 포트를 생성합니다.

특히 들어오는 연결로 아웃바운드 연결에 대해서는 연결을 수락하기 위한 임시 포트가 필요하지 않습니다.

아웃바운드 연결이 실패하기 시작하면 아래 동작의 여러 인스턴스가 표시됩니다.

  • 도메인 자격 증명을 사용하여 컴퓨터에 로그인할 수 없습니다. 그러나 로컬 계정으로 로그인하면 작동합니다. 도메인 로그인을 사용하려면 다시 아웃바운드 연결인 인증을 위해 DC에 문의해야 합니다. 자격 증명을 캐시한 경우 도메인 로그인이 계속 작동할 수 있습니다.

    이벤트 뷰어 NETLOGON 오류 스크린샷

  • 그룹 정책 업데이트 실패:

    그룹 정책 실패에 대한 이벤트 속성의 스크린샷

  • 파일 공유에 액세스할 수 없습니다.

    Windows에서 액세스할 수 없는 오류 메시지의 스크린샷

  • 영향을 받는 서버의 RDP가 실패합니다.

    원격 데스크톱을 연결할 수 없는 경우의 오류 스크린샷

  • 컴퓨터에서 실행되는 다른 모든 애플리케이션이 오류를 제공하기 시작합니다.

서버를 다시 부팅하면 문제가 일시적으로 resolve 있지만 일정 기간 후에 모든 증상이 다시 표시됩니다.

컴퓨터가 포트 소모 상태인 것으로 의심되는 경우:

  1. 아웃바운드 연결을 시도합니다. 서버/컴퓨터에서 원격 공유에 액세스하거나 다른 서버 또는 텔넷에 대한 RDP를 포트의 서버로 시도합니다. 이러한 모든 옵션에 대해 아웃바운드 연결이 실패하면 다음 단계로 이동합니다.

  2. 이벤트 뷰어를 열고 시스템 로그 아래에서 현재 상태를 명확하게 나타내는 이벤트를 찾습니다.

    1. 이벤트 ID 4227

      이벤트 뷰어 이벤트 ID 4227의 스크린샷

    2. 이벤트 ID 4231

      이벤트 뷰어 이벤트 ID 4231의 스크린샷

  3. netstat -anob 서버에서 출력을 수집합니다. netstat 출력은 단일 PID에 대한 TIME_WAIT 상태에 대한 엄청난 수의 항목을 표시합니다.

    netstate 명령 출력의 스크린샷.

    세션을 정상적으로 닫거나 갑자기 닫은 후 4분(기본값) 후에 프로세스 또는 애플리케이션에서 사용하는 포트가 사용 가능한 풀로 다시 해제됩니다. 이 4분 동안 TCP 연결 상태는 TIME_WAIT 상태가 됩니다. 포트 소모가 의심되는 상황에서 애플리케이션 또는 프로세스는 사용된 모든 포트를 해제할 수 없으며 TIME_WAIT 상태로 유지됩니다.

    동일한 출력에 CLOSE_WAIT 상태 연결이 표시될 수도 있습니다. 그러나 CLOSE_WAIT 상태는 TCP 피어의 한쪽에 보낼 데이터(FIN 전송)가 더 이상 없지만 다른 쪽 끝에서 데이터를 받을 수 있는 상태입니다. 이 상태가 포트 소모를 반드시 나타내는 것은 아닙니다.

    참고

    TIME_WAIT 상태에서 대용량이 많은 연결이 있다고 해서 처음 두 지점이 확인되지 않는 한 서버가 현재 포트에서 벗어났음을 나타내는 것은 아닙니다. TIME_WAIT 연결이 많으면 프로세스가 많은 TCP 연결을 만들고 결국 포트 소모로 이어질 수 있음을 나타냅니다.

    Netstat는 시간 초과 대기 상태로 전환된 포트를 표시하기 위해 스위치를 추가하여 -Q Windows 10 업데이트되었습니다. 이 기능을 포함하는 Windows 8.1 및 Windows Server 2012 R2에 대한 업데이트가 릴리스되었습니다. Windows 10 PowerShell cmdlet Get-NetTCPConnection 에도 이러한 BOUND 포트가 표시됩니다.

    2016년 10월까지 netstat는 부정확했습니다. 2012 R2로 다시 이식된 netstat에 대한 수정 사항으로 ,Netstat.exe 허용되고 Get-NetTcpConnection Windows Server 2012 R2에서 TCP 또는 UDP 포트 사용량을 올바르게 보고할 수 있습니다. 자세한 내용은 Windows Server 2012 R2: 임시 포트 핫픽스를 참조하세요.

  4. 관리자 모드에서 명령 프롬프트를 열고 아래 명령을 실행합니다.

    Netsh trace start scenario=netconnection capture=yes tracefile=c:\Server.etl
    
  5. 네트워크 모니터를 사용하여 server.etl 파일을 열고 필터 섹션에서 필터Wscore_MicrosoftWindowsWinsockAFD.AFD_EVENT_BIND.Status.LENTStatus.Code == 0x209를 적용합니다. STATUS_TOO_MANY_ADDRESSES라는 항목이 표시됩니다. 항목을 찾을 수 없으면 서버가 포트를 벗어나지 않습니다. 검색한 경우 서버가 포트 소모 중인지 확인할 수 있습니다.

포트 소모 문제 해결

핵심은 모든 포트를 사용하는 프로세스 또는 애플리케이션을 식별하는 것입니다. 다음은 단일 프로세스로 격리하는 데 사용할 수 있는 몇 가지 도구입니다.

방법 1

먼저 netstat 출력을 확인합니다. Windows 10 또는 Windows Server 2016 사용하는 경우 최대 항목이 BOUND인 프로세스 ID에 대해 명령 netstat -anobq 및 검사 실행할 수 있습니다. 또는 아래 PowerShell 명령을 실행하여 프로세스를 식별할 수도 있습니다.

Get-NetTCPConnection | Group-Object -Property State, OwningProcess | Select -Property Count, Name, @{Name="ProcessName";Expression={(Get-Process -PID ($_.Name.Split(',')[-1].Trim(' '))).Name}}, Group | Sort Count -Descending 

대부분의 포트 누수는 오류가 발생했을 때 사용자 모드 프로세스가 포트를 올바르게 닫지 않아 발생합니다. 사용자 모드 수준에서 포트(실제로 소켓)는 핸들입니다. TaskManagerProcessExplorer는 모두 핸들 수를 표시할 수 있으므로 모든 포트를 사용하는 프로세스를 식별할 수 있습니다.

Windows 7 및 Windows Server 2008 R2의 경우 위의 cmdlet을 포함하도록 PowerShell 버전을 업데이트할 수 있습니다.

방법 2

메서드 1이 프로세스를 식별하는 데 도움이 되지 않는 경우(Windows 10 및 Windows Server 2012 R2 이전) 작업 관리자를 살펴보세요.

  1. 세부 정보/프로세스 아래에 "handles"라는 열을 추가합니다.

  2. 열 핸들을 정렬하여 핸들 수가 가장 많은 프로세스를 식별합니다. 일반적으로 핸들이 3000보다 큰 프로세스는 System, lsass.exe,store.exe, sqlsvr.exe등의 프로세스를 제외하고 원인일 수 있습니다 .

    Windows 작업 관리자의 핸들 열 스크린샷

  3. 이러한 프로세스 이외의 다른 프로세스가 더 많은 경우 해당 프로세스를 중지한 다음 도메인 자격 증명을 사용하여 로그인하여 성공하는지 확인합니다.

방법 3

작업 관리자가 프로세스를 식별하는 데 도움이 되지 않는 경우 프로세스 Explorer 사용하여 문제를 조사합니다.

프로세스 탐색기를 사용하는 단계:

  1. 프로세스 Explorer 다운로드하고 관리자 권한으로 실행합니다.

  2. Alt + 열 머리글을 선택하고 열 선택을 선택한 다음 프로세스 성능 탭에서 핸들 개수를 추가합니다.

  3. 보기>아래쪽 창 표시를 선택합니다.

  4. 아래쪽 창보기>핸들 보기를 > 선택합니다.

  5. 핸들 열을 선택하여 해당 값을 기준으로 정렬합니다.

  6. 나머지보다 핸들 수가 많은 프로세스를 검사합니다(아웃바운드 연결을 만들 수 없는 경우 10,000개가 넘을 수 있음).

  7. 핸들 수가 많은 프로세스 중 하나를 강조 표시하려면 클릭합니다.

  8. 아래쪽 창에서 아래와 같이 나열된 핸들은 소켓입니다. (소켓은 기술적으로 파일 핸들입니다).

    파일 \Device\AFD

    핸들별로 정렬된 프로세스가 있는 프로세스 Explorer 스크린샷

  9. 일부는 정상이지만 많은 수는 그렇지 않습니다(수백에서 수천 개). 해당 프로세스를 닫습니다. 아웃바운드 연결을 복원하는 경우 앱이 원인임을 추가로 입증했습니다. 해당 앱의 공급업체에 문의하세요.

마지막으로 위의 메서드가 프로세스를 격리하는 데 도움이 되지 않는 경우 문제 상태에서 컴퓨터의 전체 메모리 덤프를 수집하는 것이 좋습니다. 덤프는 최대 핸들이 있는 프로세스를 알려줍니다.

해결 방법으로 컴퓨터를 다시 부팅하면 컴퓨터를 정상 상태로 되돌리고 당분간 문제를 resolve 데 도움이 됩니다. 그러나 다시 부팅이 비실용적인 경우 아래 명령을 사용하여 컴퓨터의 포트 수를 늘리는 것도 고려할 수 있습니다.

netsh int ipv4 set dynamicport tcp start=10000 num=1000

이 명령은 동적 포트 범위를 포트 10000에서 시작하고 포트 10999(1000 포트)에서 종료되도록 설정합니다. 설정할 수 있는 포트의 최소 범위는 255개입니다. 설정할 수 있는 최소 시작 포트는 1025입니다. 구성되는 범위에 따라 최대 끝 포트는 65535를 초과할 수 없습니다.

참고

동적 포트 범위를 늘리는 것은 영구적인 솔루션이 아니라 임시 솔루션입니다. 최대 포트 수를 소비하는 프로세스/프로세서를 추적하고 해당 프로세스 관점에서 이러한 높은 수의 포트를 사용하는 이유에 대한 문제를 해결해야 합니다.

Windows 7 및 Windows Server 2008 R2의 경우 아래 스크립트를 사용하여 정의된 빈도로 netstat 출력을 수집할 수 있습니다. 출력에서 포트 사용 추세를 볼 수 있습니다.

@ECHO ON
set v=%1
:loop
set /a v+=1
ECHO %date% %time% >> netstat.txt
netstat -ano >> netstat.txt
 
PING 1.1.1.1 -n 1 -w 60000 >NUL
 
goto loop

추가 정보

  • 포트 소모와 당신! - 이 문서에서는 netstat 상태 및 netstat 출력을 사용하여 포트 상태 결정하는 방법에 대해 자세히 설명합니다.
  • 임시 포트 소모 감지: 이 문서에는 포트 상태 보고하는 루프에서 실행되는 스크립트가 있습니다. (Windows 2012 R2, Windows 8, Windows 10 및 Windows 11 적용 가능)