Tags

    윈도우 11 내에서 포트포워딩하는 방법

    This is placeholder text for your new blog entry. Replace it with your own.WSL2(Windows Subsystem for Linux 2)는 기본적으로 가상화된 네트워크(NAT)를 사용하기 때문에, Windows 호스트에서 실행 중인 서비스에 외부(다른 컴퓨터나 모바일 기기 등)에서 접속하려면 포트 포워딩(Port Forwarding) 설정이 필요합니다.

    방법은 크게 세 가지가 있습니다. 가장 쉬운 최신 방법부터 전통적인 방법 순으로 설명해 드리겠습니다.

    방법 1: 가장 권장하는 방법 (WSL 'Mirrored' 네트워크 모드 사용)

    최신 버전의 WSL(Windows 11 필수)을 사용 중이라면, 포트 포워딩 설정 없이 Windows와 WSL이 네트워크를 공유하도록 설정할 수 있습니다. 이 설정을 하면 별도의 명령어가 필요 없습니다.

    1. Windows 사용자 폴더(C:\Users\<사용자이름>)로 이동합니다.
    2. .wslconfig 파일을 만듭니다. (이미 있다면 엽니다.)
    3. 파일에 다음 내용을 입력하고 저장합니다:
      ini
      [wsl2]
      networkingMode=mirrored
      
      [wsl2]
      networkingMode=mirrored
      
    4. PowerShell을 관리자 권한으로 열고 WSL을 재시작합니다:
      powershell
      wsl --shutdown
      
      wsl --shutdown
      
    5. 이제 Ubuntu에서 실행 중인 포트가 Windows의 localhost 및 외부 IP와 동일하게 작동합니다. (포트 포워딩이 필요 없습니다!)

    방법 2: netsh를 이용한 전통적인 포트 포워딩 (모든 버전 가능)

    만약 mirrored 모드를 사용할 수 없는 환경이라면, Windows의 netsh 명령어를 사용하여 Windows로 들어온 패킷을 WSL2의 IP로 전달해야 합니다.

    주의: WSL2의 IP는 재부팅할 때마다 바뀌므로, 매번 확인이 필요합니다.

    1단계: WSL2의 IP 주소 확인

    Ubuntu 터미널에서 다음 명령어를 입력합니다.

    bash
    hostname -I
    
    hostname -I
    

    출력된 IP(예: 172.25.144.10)를 복사해둡니다.

    2단계: Windows에서 포트 포워딩 설정 (PowerShell 관리자 권한)

    Windows에서 PowerShell을 관리자 권한으로 실행한 뒤 아래 명령어를 입력합니다.

    • listenport: 외부에서 접속할 포트 (Windows 포트)
    • connectport: Ubuntu에서 실행 중인 포트
    • connectaddress: 위에서 확인한 WSL2 IP
    powershell
    # 예: Windows의 8080 포트로 들어오면 WSL의 80 포트로 전달
    netsh interface portproxy add v4tov4 listenport=8080 listenaddress=0.0.0.0 connectport=80 connectaddress=172.25.144.10
    
    # 예: Windows의 8080 포트로 들어오면 WSL의 80 포트로 전달
    netsh interface portproxy add v4tov4 listenport=8080 listenaddress=0.0.0.0 connectport=80 connectaddress=172.25.144.10
    

    3단계: Windows 방화벽 허용

    외부에서 접속할 수 있도록 Windows 방화벽에서 해당 포트를 열어줘야 합니다.

    powershell
    netsh advfirewall firewall add rule name="WSL Port Forwarding" dir=in action=allow protocol=TCP localport=8080
    
    netsh advfirewall firewall add rule name="WSL Port Forwarding" dir=in action=allow protocol=TCP localport=8080
    

    방법 3: 자동화 스크립트 사용 (추천)

    방법 2의 단점은 WSL IP가 바뀔 때마다 매번 명령어를 입력해야 한다는 것입니다. 이를 자동화하는 PowerShell 스크립트를 만들어 사용하면 편합니다.

    1. 메모장을 열고 아래 코드를 붙여넣습니다.
    2. wsl_forward.ps1이라는 이름으로 저장합니다.
    3. 관리자 권한으로 이 스크립트를 실행합니다.
    powershell
    # 관리자 권한 체크
    if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) { Write-Host "이 스크립트는 반드시 관리자 권한으로 실행해야 합니다!" -ForegroundColor Red exit
    } # 설정할 포트 번호 (원하는 대로 수정하세요)
    $port = 8080 # 1. WSL2 IP 가져오기
    $wsl_ip = (wsl hostname -I).Trim().Split(" ")[0] if (-not $wsl_ip) { Write-Host "WSL IP를 찾을 수 없습니다." -ForegroundColor Red exit
    } Write-Host "WSL2 IP 발견: $wsl_ip" -ForegroundColor Cyan # 2. 기존 포트포워딩 규칙 삭제 (중복 방지)
    netsh interface portproxy delete v4tov4 listenport=$port listenaddress=0.0.0.0 # 3. 새로운 포트포워딩 규칙 추가
    netsh interface portproxy add v4tov4 listenport=$port listenaddress=0.0.0.0 connectport=$port connectaddress=$wsl_ip # 4. 방화벽 규칙 추가
    netsh advfirewall firewall add rule name="WSL_Auto_Forward_$port" dir=in action=allow protocol=TCP localport=$port Write-Host "설정 완료! Windows:$port -> WSL:$port ($wsl_ip)" -ForegroundColor Green
    
    # 관리자 권한 체크
    if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) { Write-Host "이 스크립트는 반드시 관리자 권한으로 실행해야 합니다!" -ForegroundColor Red exit
    } # 설정할 포트 번호 (원하는 대로 수정하세요)
    $port = 8080 # 1. WSL2 IP 가져오기
    $wsl_ip = (wsl hostname -I).Trim().Split(" ")[0] if (-not $wsl_ip) { Write-Host "WSL IP를 찾을 수 없습니다." -ForegroundColor Red exit
    } Write-Host "WSL2 IP 발견: $wsl_ip" -ForegroundColor Cyan # 2. 기존 포트포워딩 규칙 삭제 (중복 방지)
    netsh interface portproxy delete v4tov4 listenport=$port listenaddress=0.0.0.0 # 3. 새로운 포트포워딩 규칙 추가
    netsh interface portproxy add v4tov4 listenport=$port listenaddress=0.0.0.0 connectport=$port connectaddress=$wsl_ip # 4. 방화벽 규칙 추가
    netsh advfirewall firewall add rule name="WSL_Auto_Forward_$port" dir=in action=allow protocol=TCP localport=$port Write-Host "설정 완료! Windows:$port -> WSL:$port ($wsl_ip)" -ForegroundColor Green
    

    요약 및 문제 해결 (Troubleshooting)

    1. 확인 방법: 설정이 잘 되었는지 확인하려면 PowerShell에서 다음을 입력하세요.
      • netsh interface portproxy show all (포트포워딩 규칙 확인)
    2. 삭제 방법: 설정한 포트포워딩을 지우고 싶다면:
      • netsh interface portproxy delete v4tov4 listenport=8080 listenaddress=0.0.0.0
    3. 안 될 때 체크리스트:
      • Ubuntu 내부의 서비스(예: Nginx, Node.js)가 0.0.0.0 주소로 리스닝 중인가? (localhost나 127.0.0.1로만 설정되어 있으면 외부 접속이 안 됩니다.)
      • Windows 방화벽에서 해당 포트를 열었는가?
      • WSL2의 IP가 변경되지 않았는가? (방법 3의 스크립트를 사용하면 해결됨)

    Comments