🛠️ 트러블슈팅 리포트: localhost 연결 거부 및 Hyper-V 포트 충돌 이슈

1. 문제 상황(Symptoms)

로컬 개발 환경에서 프론트엔드 또는 백엔드 서버를 평소와 같이 실행(예: 3000번 포트)했으나, 브라우저에서 접속 시 다음과 같은 오류가 발생하며 접속이 불가능함.

브라우저 오류 메시지:

  • 사이트에 연결할 수 없음
  • localhost에서 연결을 거부했습니다. (ERR_CONNECTION_REFUSED)
  • 연결 확인, 프록시 및 방화벽 확인 필요

 

2. 원인 분석 (Root Cause)

Windows의 Hyper-V(및 WSL2, Docker) 가 사용하는 네트워크 서비스인 WinNAT이 부팅 시 동적 포트 범위(Dynamic Port Range) 를 무작위로 예약(Reservation)하는 과정에서 발생한 충돌.

  1. 동적 포트 할당: Windows는 부팅 시 Hyper-V나 컨테이너 통신을 위해 일정 범위의 포트를 미리 '예약'함.
  2. 범위 중첩: Windows의 기본 동적 포트 범위는 1024 ~ 15001로 설정되어 있음. 이 범위 내에 개발에 주로 사용되는 3000, 8000, 8080 포트가 포함됨.
  3. 랜덤 예약: WinNAT 서비스가 하필 개발용 포트(예: 3000)가 포함된 구간(예: 2997~3096)을 랜덤으로 선점해버림.
  4. 결과: 개발 서버가 3000번 포트를 요청했으나, 이미 시스템(Hyper-V)이 예약해 둔 상태라 접근이 거부됨.

 

3. 해결 방법 (Solution)

시스템이 사용하는 동적 포트의 범위를 개발자가 잘 쓰지 않는 49152번 이후로 강제 변경하여 충돌을 영구적으로 방지함.

Step 1. 관리자 권한으로 터미널(CMD/PowerShell) 실행

Step 2. 동적 포트 범위 변경 명령어 입력

PowerShell
 
netsh int ipv4 set dynamicport tcp start=49152 num=16384
  • start=49152: 동적 포트 시작점을 49152번으로 설정.
  • num=16384: 포트 개수를 16,384개로 설정 (49152 ~ 65535 범위).

Step 3. 시스템 재부팅 (필수) 설정 적용을 위해 재부팅 진행.

(참고: 당장 재부팅이 불가능할 경우 net stop winnat -> net start winnat으로 임시 해결 가능하나 재발 가능성 있음)

 

4. 기술적 검토: 이 방법이 안전한 이유 (Safety & Standards)

포트 범위를 뒤로 미루는 것은 시스템 오류를 유발하지 않으며, 오히려 국제 표준을 준수하는 권장 설정임.

  1. IANA 표준 준수:
    • 인터넷 할당 번호 관리기관(IANA)의 포트 표준 구분:
      • 0 ~ 1023: Well-known Ports (시스템용)
      • 1024 ~ 49151: Registered Ports (사용자/개발자/서버 애플리케이션용 - 3000, 8080 등)
      • 49152 ~ 65535: Dynamic/Private Ports (임시 할당용)
    • Windows의 기본 설정(1024~)은 오히려 'Registered Ports' 구역을 침범하고 있었음. 변경된 설정(49152~)이 표준에 부합함.
  2. 리소스 충분성:
    • 변경 후에도 약 16,000개의 포트를 동적으로 사용할 수 있음.
    • 일반적인 개발 PC나 워크스테이션에서 동시에 16,000개 이상의 외부 네트워크 연결(Socket)을 맺는 경우는 극히 드물므로 성능 이슈나 포트 고갈(Port Exhaustion) 문제는 발생하지 않음.

 

5. 추가 질문

Q1. Hyper-V 외에 포트를 이렇게 잡는 프로세스가 더 있나?

  • 주범 (WinNAT): Hyper-V, WSL2, Docker for Windows, Windows Sandbox 등 가상화 관련 기술은 모두 WinNAT 서비스를 통해 네트워크를 처리하며, 이 녀석이 대량의 포트를 '블록 단위'로 예약하는 유일한 주범임.
  • 기타 (RPC 등): Windows RPC 등 시스템 내부 통신도 동적 포트를 쓰지만, 필요할 때 하나씩 가져다 쓰고 바로 반납하는 형태라 Hyper-V처럼 거대한 '알박기' 문제는 거의 일으키지 않음.

 

Q1-1. Hyper-V, WSL2, Docker for Windows, Windows Sandbox 은 무엇을 하는 프로세스인가?

🏛️ 1. 사건의 주범들: 가상화 4인방 정체

이들은 모두 "내 컴퓨터(Windows) 안에 또 다른 컴퓨터를 만드는 기술"이라는 공통점이 있어.

① Hyper-V (대장님)

  • 정체: 마이크로소프트가 만든 하드웨어 가상화 기술의 핵심 엔진.
  • 하는 일: 윈도우 위에 가상의 컴퓨터(VM)를 여러 대 만들 수 있게 해줘.
  • 비유: 네 컴퓨터가 큰 '집'이라면, Hyper-V는 집 안에 방음벽을 세워서 독립된 '원룸'들을 만드는 건축가야.
  • 특징: 아래 나오는 모든 애들(WSL2, Docker, Sandbox)은 사실 뒤에서 Hyper-V 기술을 기반으로 돌아가. 즉, 얘가 뿌리야.

② WSL2 (Windows Subsystem for Linux 2)

  • 정체: 윈도우에서 리눅스를 '찐'으로 돌려주는 시스템.
  • 하는 일: 예전(WSL1)에는 흉내만 냈다면, WSL2는 Hyper-V를 이용해서 진짜 리눅스 커널을 가볍게 돌려.
  • 왜 써?: 개발자들은 리눅스 환경(Ubuntu 등)이 필수인데, 듀얼 부팅하기 귀찮으니까 윈도우 안에서 리눅스 터미널을 쓰려고 사용해.
  • 너와의 관계: 네가 AI 개발을 한다면 99% 확률로 이걸 쓰고 있거나 쓰게 될 거야.

③ Docker Desktop for Windows

  • 정체: 애플리케이션을 '컨테이너'라는 상자에 담아 배포하는 도구.
  • 하는 일: 내 컴퓨터에서 짠 코드가 서버에서도 똑같이 돌아가게 만들어줘.
  • 작동 원리: 리눅스 기반 컨테이너를 돌려야 하는데, 윈도우는 리눅스가 아니잖아? 그래서 WSL2(또는 Hyper-V)를 빌려서 그 위에서 리눅스를 띄우고 컨테이너를 돌려.
  • 결국: Docker를 켜면 -> WSL2가 켜지고 -> 결국 Hyper-V가 일하는 구조야.

④ Windows Sandbox

  • 정체: 쓰고 버리는 일회용 윈도우.
  • 하는 일: 의심스러운 파일(.exe)을 실행해보고 싶을 때, 바이러스가 걸려도 내 본체에는 영향이 없는 격리된 공간을 띄워줘. 끄면 싹 사라짐.
  • 원리: 이것도 Hyper-V 기술로 아주 가벼운 가상 윈도우를 순간적으로 만드는 거야.

 

Q1-2. 왜 다들 WinNAT을 쓰고 포트를 훔쳐가? (핵심 원리)

이제 중요한 건 "왜 얘네가 포트를 뭉텅이로 가져가느냐"지.

상황: "아파트 단지(가상화)"와 "우편물 관리실(WinNAT)"

  1. 가상 세계의 고립: Hyper-V가 만든 가상 컴퓨터(Docker 컨테이너, WSL2 리눅스 등)들은 자기들만의 사설 IP를 가지고 있어. 바깥세상(인터넷)과는 직접 연결이 안 돼.
  2. 통역사가 필요해: 이 가상 컴퓨터들이 인터넷을 하려면, 네 진짜 컴퓨터(호스트)의 IP를 빌려 써야 해. 이때 "내부 IP ↔ 외부 IP" 주소를 변환해주는 기술이 NAT(Network Address Translation)이야.
  3. WinNAT의 역할: 윈도우에서 이 NAT 역할을 해주는 서비스가 바로 WinNAT이야. 가상 컴퓨터들이 밖으로 나가는 관문이지.
  4. 포트 예약(알박기)의 이유:
    • 가상 컴퓨터(컨테이너)가 갑자기 수십 개 생길 수도 있잖아?
    • WinNAT은 "아, 저 안쪽 세상(가상환경)에서 트래픽이 엄청 쏟아질 수도 있겠네?" 라고 생각해서, 통신 효율을 위해 미리 외부 포트 수백~수천 개를 '전용 통로'로 예약(Reservation) 해버리는 거야.
    • 마치 아파트 관리실이 "101동 사람들이 택배 많이 시킬지 모르니까 택배 보관함 100칸은 미리 비워둬!" 하고 일반 주민(너의 3000번 포트)이 못 쓰게 막아버린 셈이지.

+ Recent posts