127.0.0.1:80을 점유한wslrelay.exe입니다. → 이건 WSL의 자동 localhost 포워딩 기능입니다. WSL에서 80/tcp가 열려 있으면 Windows의localhost:80을 자동으로 WSL로 중계해 줍니다. → 즉, localhost:80은 wslrelay가 맡고 있고, 우리가 따로 portproxy 만들 필요가 없습니다.
A) 로컬(이 PC)에서만 http://localhost 로 쓰고 싶다
- 그냥 테스트만 해보세요:
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도 이제 정상일 가능성이 높습니다. - 정상 HTML이 나오면 끝입니다. (
B) 같은 LAN의 다른 기기에서도 접속하고 싶다 (예: 휴대폰/다른 PC)
wslrelay가 127.0.0.1:80을 사용 중이라서, 0.0.0.0:80 로 또 바인딩하면 충돌납니다.
대신 Windows의 LAN IP로만 portproxy를 만들어 주세요.
- 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" - 해당 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 - 방화벽 규칙 추가(그 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로 갱신해야 합니다.
