네트워킹 앱 및 WSL을 사용할 때 알아야 할 몇 가지 고려 사항이 있습니다. 기본적으로 WSL은 NAT 기반 아키텍처를사용하며, 새로운 미러된 네트워킹 모드를 사용하여 최신 기능과 개선 사항을 활용하는 것을 권장합니다.
IP 주소 식별
WSL을 통해 실행되는 Linux 배포에 사용되는 IP 주소를 식별할 때 고려해야 할 두 가지 시나리오가 있습니다.
시나리오 1: Windows 호스트의 관점에서 WSL2를 통해 실행되는 Linux 배포판의 IP 주소를 쿼리하여 Windows 호스트의 프로그램이 배포(인스턴스) 내에서 실행되는 서버 프로그램에 연결할 수 있도록 합니다.
Windows 호스트는 다음 명령을 사용할 수 있습니다.
wsl.exe --distribution <DistroName> hostname -i
기본 배포를 쿼리하는 경우 배포를 지정하는 명령의 이 부분을 생략할 수 있습니다. -d <DistroName>. 소문자 -i 플래그를 사용해야 합니다.
내부적으로 호스트 명령 wsl.exe 대상 인스턴스를 시작하고 Linux 명령을 hostname --ip-addresses실행합니다. 그런 다음 이 명령은 WSL 인스턴스의 IP 주소를 "STDOUT"에 출력합니다. 그런 다음 STDOUT 텍스트 콘텐츠가 wsl.exe로 다시 전달됩니다. 마지막으로 wsl.exe 명령줄에 출력을 표시합니다.
일반적인 출력은 다음과 같습니다.
172.30.98.229
시나리오 2: WSL2(인스턴스)를 통해 Linux 배포 내에서 실행되는 프로그램은 Linux 프로그램이 Windows 호스트 서버 프로그램에 연결할 수 있도록 Windows 호스트의 IP 주소를 알고 싶어 합니다.
WSL2 Linux 사용자는 다음 명령을 사용할 수 있습니다.
ip route show | grep -i default | awk '{ print $3}'
일반적인 출력은 다음과 같습니다.
172.30.96.1
따라서 이 예제에서는 172.30.96.1 Windows의 호스트 IP 주소입니다.
메모
위의 IP 주소 쿼리 작업은 일반적으로 WSL2가 기본 NAT 네트워크 모드실행 중인 경우에 필요합니다.
WSL2가 새 미러 모드실행 중인 경우 Windows 호스트와 WSL2 VM은 대상 주소로 localhost(127.0.0.1)를 사용하여 서로 연결할 수 있으므로 쿼리 피어의 IP 주소를 사용하는 트릭이 필요하지 않습니다.
기본 네트워킹 모드: NAT
기본적으로 WSL은 네트워킹에 NAT(네트워크 주소 변환) 기반 아키텍처를 사용합니다. NAT 기반 네트워킹 아키텍처를 사용할 때는 다음 사항을 고려해야 합니다.
Windows에서 Linux 네트워킹 앱 액세스(localhost)
Linux 배포판에서 네트워킹 앱(예: NodeJS 또는 SQL Server에서 실행되는 앱)을 빌드하는 경우 일반적으로와 마찬가지로 localhost 사용하여 Windows 앱(예: Edge 또는 Chrome 인터넷 브라우저)에서 액세스할 수 있습니다.
Linux에서 Windows 네트워킹 앱 액세스(호스트 IP)
Linux 배포판(예: Ubuntu)에서 Windows에서 실행되는 네트워킹 앱(예: NodeJS 또는 SQL Server에서 실행되는 앱)에 액세스하려면 호스트 컴퓨터의 IP 주소를 사용해야 합니다. 일반적인 시나리오는 아니지만 다음 단계에 따라 작동하도록 할 수 있습니다.
Linux 배포에서 이 명령을 실행하여 호스트 컴퓨터의 IP 주소를 가져옵니다.
ip route show | grep -i default | awk '{ print $3}'복사한 IP 주소를 사용하여 모든 Windows 서버에 연결합니다.
아래 그림에서는 curl을 통해 Windows에서 실행되는 Node.js 서버에 연결하여 이러한 예제를 보여 줍니다.
통해 Windows의 NodeJS 서버에 연결
원격 IP 주소를 통해 연결
원격 IP 주소를 사용하여 애플리케이션에 연결하는 경우 LAN(Local Area Network)에서 연결로 처리됩니다. 즉, 애플리케이션에서 LAN 연결을 수락할 수 있는지 확인해야 합니다.
예를 들어 애플리케이션을 0.0.0.0대신 127.0.0.1 바인딩해야 할 수 있습니다. Flask를 사용하는 Python 앱의 예제에서 이 작업은 app.run(host='0.0.0.0')명령을 사용하여 수행할 수 있습니다. 이렇게 변경하면 LAN에서 연결할 수 있으므로 보안을 염두에 두어야 합니다.
LAN(로컬 영역 네트워크)에서 WSL 2 배포에 액세스
WSL 1 배포를 사용하는 경우 LAN에서 컴퓨터에 액세스하도록 설정된 경우 WSL에서 실행되는 애플리케이션도 LAN에서 액세스할 수 있습니다.
WSL 2의 기본 사례는 아닙니다. WSL 2에는 고유한 IP 주소가 있는 가상화된 이더넷 어댑터가 있습니다. 현재 이 워크플로를 사용하도록 설정하려면 일반 가상 머신과 동일한 단계를 거쳐야 합니다. (이 환경을 개선하는 방법을 찾고 있습니다.)
다음은 Netsh 인터페이스 portproxy Windows 명령을 사용하여 호스트 포트에서 수신 대기하고 해당 포트 프록시를 WSL 2 VM의 IP 주소에 연결하는 포트 프록시를 추가하는 예제입니다.
netsh interface portproxy add v4tov4 listenport=<yourPortToForward> listenaddress=0.0.0.0 connectport=<yourPortToConnectToInWSL> connectaddress=(wsl hostname -I)
이 예제에서는 <yourPortToForward> 포트 번호(예: listenport=4000)로 업데이트해야 합니다.
listenaddress=0.0.0.0 들어오는 요청이 모든 IP 주소에서 수락됨을 의미합니다. 수신 대기 주소는 수신 대기할 IPv4 주소를 지정하며 IP 주소, 컴퓨터 NetBIOS 이름 또는 컴퓨터 DNS 이름을 포함하는 값으로 변경할 수 있습니다. 주소를 지정하지 않으면 기본값은 로컬 컴퓨터입니다.
<yourPortToConnectToInWSL> 값을 WSL을 연결할 포트 번호(예: connectport=4000)로 업데이트해야 합니다. 마지막으로 connectaddress 값은 WSL 2(WSL 2 VM 주소)를 통해 설치된 Linux 배포의 IP 주소여야 하며, wsl.exe hostname -I명령을 입력하여 찾을 수 있습니다.
따라서 이 명령은 다음과 같이 표시할 수 있습니다.
netsh interface portproxy add v4tov4 listenport=4000 listenaddress=0.0.0.0 connectport=4000 connectaddress=192.168.101.100
IP 주소를 가져오려면 다음을 사용합니다.
- WSL 2를 통해 설치된 Linux 배포의 IP 주소(
wsl hostname -I)는 WSL 2 VM의 주소에 해당합니다. - WSL 2(WSL 2 VM)에서 볼 수 있는 Windows 컴퓨터의 IP 주소를 위한
cat /etc/resolv.conf
listenaddress=0.0.0.0 사용하면 모든 IPv4 포트수신 대기합니다.
메모
호스트 이름 명령에 소문자 "i"를 사용하면 대문자 "I"를 사용하는 것과 다른 결과가 생성됩니다.
wsl hostname -i는 귀하의 로컬 컴퓨터(127.0.1.1은 자리 표시자 진단 주소)입니다. 반면, wsl hostname -I은 다른 컴퓨터에서 확인할 수 있는 귀하의 로컬 컴퓨터의 IP 주소를 반환하며, 이는 WSL 2를 통해 실행 중인 Linux 배포판의 connectaddress를 식별하는 데 사용해야 합니다.
IPv6 액세스
- WSL 2를 통해 설치된 Linux 배포의 IP 주소(
wsl hostname -i)는 WSL 2 VM의 주소에 해당합니다. - WSL 2(WSL 2 VM)에서 볼 수 있는 Windows 컴퓨터의 IP 주소를 위한
ip route show | grep -i default | awk '{ print $3}'
listenaddress=0.0.0.0 사용하면 모든 IPv4 포트수신 대기합니다.
미러 모드 네트워킹
Windows 11 22H2 이상을 실행하는 컴퓨터에서 networkingMode=mirrored 파일 [wsl2].wslconfig 설정하여 미러 모드 네트워킹을 사용하도록 설정할 있습니다. 이를 사용하도록 설정하면 WSL이 완전히 새로운 네트워킹 아키텍처로 변경됩니다. 이 아키텍처는 Windows에 있는 네트워크 인터페이스를 Linux로 '미러링'하여 새로운 네트워킹 기능을 추가하고 호환성을 향상시킵니다.
이 모드를 사용하도록 설정하는 현재 이점은 다음과 같습니다.
- IPv6 지원
- localhost 주소
127.0.0.1사용하여 Linux 내에서 Windows 서버에 연결합니다. IPv6 localhost 주소::1지원되지 않습니다. - VPN에 대한 네트워킹 호환성 향상
- 멀티캐스트 지원
- LAN(로컬 영역 네트워크)에서 직접 WSL에 연결
메모
관리자 권한으로 PowerShell 창에서 다음 명령을 실행하여 인바운드 연결을 허용하도록 Hyper-V 방화벽 설정을 구성 합니다.
Set-NetFirewallHyperVVMSetting -Name '{40E0AC32-46A5-438A-A0B2-2B479E8F2E90}' -DefaultInboundAction Allow
또는
New-NetFirewallHyperVRule -Name "MyWebServer" -DisplayName "My Web Server" -Direction Inbound -VMCreatorId '{40E0AC32-46A5-438A-A0B2-2B479E8F2E90}' -Protocol TCP -LocalPorts 80
이 새로운 모드는 NAT(네트워크 주소 변환) 기반 아키텍처 사용과 관련된 네트워킹 문제를 해결합니다. GitHub WSL 제품 리포지토리에서 식별된 버그에 대한 알려진 문제 또는 파일 피드백을 찾습니다.
DNS 터널링
Windows 11 22H2 이상을 dnsTunneling 실행하는 컴퓨터에서 이 기능은 기본적으로 설정되며(파일에서 [wsl2].wslconfig찾을 수 있음) 네트워킹 패킷을 통해 요청하는 대신 가상화 기능을 사용하여 WSL 내에서 DNS 요청에 응답합니다. 이 기능은 VPN 및 기타 복잡한 네트워킹 설정과의 호환성을 개선하기 위한 것입니다.
자동 프록시
Windows 11 22H2 이상을 실행하는 컴퓨터에서 autoProxy=true 파일 [wsl2].wslconfig 설정하면 WSL이 Windows의 HTTP 프록시 정보를 사용하도록 강제 적용됩니다. Windows에서 프록시를 이미 설정한 경우 이 기능을 사용하도록 설정하면 해당 프록시도 WSL에서 자동으로 설정됩니다.
WSL 및 방화벽
WSL 2.0.9 이상을 사용하는 Windows 11 22H2 이상을 실행하는 컴퓨터에서는 기본적으로 Hyper-V 방화벽 기능이 켜집니다. 이렇게 하면 다음이 보장됩니다.
- WSL에 자동으로 적용되는 Windows 보안 기능에 대한 자세한 내용은 고급 보안 Windows Defender 방화벽을 참조하세요.
- 로컬 및 Intune과 같은 온라인 도구를 통해 이러한 규칙 및 설정을 적용하는 방법에 대한 자세한 내용은 Hyper-V 방화벽 구성을 참조하세요.
Windows Subsystem for Linux