WSL 외부 IP 연결문제 해결 방법

  • 127.0.0.1:80을 점유한 wslrelay.exe 입니다. → 이건 WSL의 자동 localhost 포워딩 기능입니다. WSL에서 80/tcp가 열려 있으면 Windows의 localhost:80을 자동으로 WSL로 중계해 줍니다. → 즉, localhost:80은 wslrelay가 맡고 있고, 우리가 따로 portproxy 만들 필요가 없습니다.

A) 로컬(이 PC)에서만 http://localhost 로 쓰고 싶다

  1. 그냥 테스트만 해보세요: C:\Windows\System32\curl.exe http://127.0.0.1
    • 정상 HTML이 나오면 입니다. (wslrelay가 잘 중계 중)
    • 혹시 안 나오면 한번 재기동: wsl --shutdown Restart-Service LxssManager wsl C:\Windows\System32\curl.exe http://127.0.0.1
    이미 curl http://127.0.0.1:8080 은 정상이고, wslrelay가 80을 잡고 있으므로 http://127.0.0.1 도 이제 정상일 가능성이 높습니다.

B) 같은 LAN의 다른 기기에서도 접속하고 싶다 (예: 휴대폰/다른 PC)

wslrelay가 127.0.0.1:80을 사용 중이라서, 0.0.0.0:80 로 또 바인딩하면 충돌납니다.
대신 Windows의 LAN IP로만 portproxy를 만들어 주세요.

  1. Windows의 LAN IP 확인: $lanIp = (Get-NetIPAddress -AddressFamily IPv4 ` | Where-Object { $_.InterfaceAlias -notmatch 'Loopback|WSL|vEthernet' -and $_.IPAddress -notlike '169.254.*' } ` | Sort-Object -Property SkipAsSource ` | Select-Object -First 1 -ExpandProperty IPAddress) Write-Host "LAN IP = $lanIp"
  2. 해당 LAN IP:80 → WSL:80 포워딩 생성(127.0.0.1:80은 wslrelay가 계속 담당): $wslIp = "172.26.10.217" # 현재 WSL IP netsh interface portproxy add v4tov4 listenaddress=$lanIp listenport=80 connectaddress=$wslIp connectport=80
  3. 방화벽 규칙 추가(그 LAN IP로만 80 허용): New-NetFirewallRule -DisplayName "WSL Apache 80 (LAN only)" ` -Direction Inbound -Action Allow -Protocol TCP -LocalPort 80 -LocalAddress $lanIp

→ 이제 같은 네트워크의 다른 기기에서 http://<Windows_LAN_IP> 로 접속 가능해집니다.
(내부에서 공인 IP로 테스트하면 NAT 루프백 미지원 공유기에서는 실패할 수 있으니, 반드시 LAN IP로 테스트하세요.)


C) 외부 인터넷에서도 접속하고 싶다

  • 공유기에서 외부 80 → (Windows LAN IP):80 으로 포트포워딩 설정
  • ISP가 80 인바운드 차단 시, 외부 8080 → 내부 80 으로 매핑하고 http://공인IP:8080 사용

참고(유지보수)

  • WSL 쪽 80 허용 규칙은 재시작 시 사라질 수 있습니다. 영구 적용하려면: sudo apt install -y iptables-persistent sudo netfilter-persistent save
  • WSL IP는 재부팅/재시작 시 바뀔 수 있습니다. 바뀌면 위 portproxy의 connectaddress 를 새 IP로 갱신해야 합니다.
error: Content is protected !!