컴퓨터 간에 이루어지는 모든 네트워크 연결(TCP 또는 UDP 프로토콜)은 포트를 통해 이루어집니다. 포트는 서비스나 애플리케이션이 사용하는 출입구 또는 관문이라고 생각하면 쉽습니다. 그런데 클라이언트 연결이 계속 늘어나면 사용 가능한 포트가 부족해지는 상황이 발생합니다. 이번 글에서는 포트 고갈(Port Exhaustion) 문제를 진단하고 해결하는 방법을 소개합니다.
포트에는 두 가지 종류가 있습니다. 바로 동적 포트(Dynamic Port)와 정의된 포트(Defined Port)입니다. 동적 포트를 사용하면 여러 클라이언트가 하나의 정의된 포트에 동시에 접속할 수 있습니다. 웹사이트가 대표적인 예로, 일반적으로 80번 포트를 사용하지만 동적 포트를 활용해 수많은 클라이언트에게 동시에 서비스를 제공합니다. 그러나 동적 포트의 개수에는 한계가 있기 때문에 모든 포트가 사용 중이면 새로운 연결이 실패하기 시작하는데, 이것을 포트 고갈이라고 합니다.
Windows 11/10에서 포트 고갈 증상
문제 해결의 핵심은 어떤 프로세스나 애플리케이션이 포트를 고갈시키고 있는지 파악하는 것입니다. 원인을 찾아낸 후에는 해당 애플리케이션을 수정해야 합니다.
포트 고갈을 의심할 수 있는 대표적인 증상은 다음과 같습니다.
1] 도메인 계정으로는 로그인할 수 없지만, 로컬 계정으로는 로그인이 되는 경우입니다. 기존에 사용했던 계정은 캐싱 때문에 로그인될 수 있지만, 새 계정으로는 로그인에 실패합니다.
2] 그룹 정책 업데이트가 반복적으로 실패합니다. 변경 사항을 적용하려 할 때마다 "도메인 컨트롤러와의 네트워크 연결 부족으로 인해 실패했습니다"라는 오류 메시지가 나타날 수 있습니다. 일시적일 수 있지만 중요한 신호입니다.
3] 파일 공유 또는 네트워크 드라이브에 접근할 수 없게 됩니다.
4] 해당 애플리케이션이 호스팅되는 서버로의 원격 데스크톱 연결이 실패합니다.
그 외에도 이벤트 뷰어에서 TCP 관련 이벤트 ID 4227, 4231과 함께 '동적 포트 할당 실패' 메시지가 기록되거나, NetStat 명령 실행 시 특정 애플리케이션에 대해 TIME_WAIT 상태의 항목이 비정상적으로 많이 표시되는 등의 징후가 나타날 수 있습니다.
NetStat으로 포트 고갈 원인 찾기
관리자 권한으로 명령 프롬프트를 열고 다음 명령을 실행합니다.
netstat -anobq
그다음 BOUND 상태 항목이 가장 많은 프로세스 ID를 확인합니다.
PowerShell을 사용한다면 아래 명령으로 BOUND 항목이 가장 많은 프로세스를 식별할 수 있습니다.
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많은 경우 클라이언트가 포트를 올바르게 닫지 않아 더 이상 사용하지 않는 포트도 해제되지 않은 채 남아 있습니다. 이것이 포트 고갈의 가장 큰 원인 중 하나입니다.
문제가 자주 발생한다면 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작업 관리자에서 핸들 수 확인하기
좀 더 간편한 방법으로 작업 관리자를 활용할 수 있습니다. PowerShell이나 명령 프롬프트만큼 강력하지는 않지만, 프로세스를 빠르게 확인하고 싶다면 이 방법이 더 좋습니다.
- 작업 관리자를 열고 세부 정보 탭으로 전환합니다.
- 열 제목을 마우스 오른쪽 버튼으로 클릭한 후 '열 선택'을 클릭합니다.
- 목록에서 '핸들(Handles)'을 추가합니다.
- 핸들 열 제목을 클릭해 내림차순으로 정렬합니다.
마이크로소프트에 따르면 연결 실패가 발생할 때 핸들 수가 3,000개를 초과하는지 확인해 보라고 합니다. 초과한다면 해당 애플리케이션이 원인일 가능성이 높습니다. 단, OS 서비스는 예외입니다. 그 외의 프로세스라면 한 번 중지한 뒤 도메인 계정으로 로그인해 성공하는지 확인해 보세요.
Process Explorer 활용하기
작업 관리자로 원인을 찾기 어렵다면 Process Explorer를 사용할 수 있습니다. 이 도구는 DLL 버전 문제나 핸들 누수를 추적하고, 비정상적으로 동작하는 애플리케이션에 대한 통찰을 제공하는 데 유용합니다. Process Explorer를 다운로드해 설치한 후 반드시 관리자 권한으로 실행하세요.
- 열 제목을 마우스 오른쪽 버튼으로 클릭하고 '열 선택(Choose Columns)'을 선택합니다.
- 성능(Performance) 탭으로 이동해 핸들 수(Handle Count)를 추가합니다.
- 메뉴에서 보기(View) > 하위 창 표시(Show Lower Pane)를 클릭합니다.
- 다시 메뉴에서 보기(View) > 하위 창 보기(Lower Pane View) > 핸들(Handles)을 선택합니다.
- 핸들을 내림차순으로 정렬합니다.
- 핸들 수가 가장 많은 프로세스가 표시됩니다.
- 핸들 수가 상위권인 프로세스 중 하나를 클릭해 강조합니다.
- 하단 패널에 해당 프로세스의 모든 핸들 유형이 표시됩니다. 포트나 소켓은 보통 'File \Device\AFD' 라벨로 표시됩니다.
핸들 수가 비정상적으로 많은 프로세스를 종료해 보세요. 애플리케이션이 다시 실행된다면 그것이 원인일 수 있으며, 애플리케이션 자체를 수정하거나 개발사(OEM)에 수정을 요청해야 합니다. 애플리케이션 특성상 수정이 불가능하다면 컴퓨터가 사용할 수 있는 포트 범위를 늘리는 것을 고려할 수 있습니다. 아래 명령(예시)으로 동적 포트 범위를 변경하고 확장할 수 있습니다.
netsh int ipv4 set dynamicport tcp start=10000 num=1000
설정 가능한 최소 시작 포트는 1025이며, 끝 포트는 65535를 초과할 수 없습니다.
다만 이 방법은 어디까지나 임시적인 해결책입니다. IT 관리자라면 근본적으로 포트 고갈 문제를 해결할 더 나은 방법을 찾아야 합니다. 경우에 따라 여러 대의 서버를 사용해 포트 수를 늘리는 방법도 있지만, 이는 별도의 아키텍처 설계가 필요한 영역입니다.