다음을 통해 공유


WSL을 사용하여 네트워크 애플리케이션 액세스

네트워킹 앱 및 WSL을 사용할 때 알아야 할 몇 가지 고려 사항이 있습니다. 기본적으로 WSL은 NAT 기반 아키텍처사용하며, 새로운 미러된 네트워킹 모드를 사용하여 최신 기능과 향상된 기능을 얻는 것이 좋습니다.

IP 주소 식별

WSL을 통해 실행되는 Linux 배포에 사용되는 IP 주소를 식별할 때 고려해야 할 두 가지 시나리오가 있습니다.

시나리오 1: Windows 호스트의 관점에서 WSL2를 통해 실행되는 Linux 배포판의 IP 주소를 쿼리하여 Windows 호스트의 프로그램이 배포(인스턴스) 내에서 실행되는 서버 프로그램에 연결할 수 있도록 합니다.

Windows 호스트는 다음 명령을 사용할 수 있습니다.

wsl -d <DistributionName> hostname -I

기본 배포를 쿼리하는 경우 배포를 지정하는 명령의 이 부분을 생략 -d <DistributionName>할 수 있습니다. 소문자가 아닌 대문 -I 자 플래그를 사용해야 합니다 -i.

내부적으로 호스트 명령은 wsl.exe 대상 인스턴스를 시작하고 Linux 명령을 hostname -I실행합니다. 그런 다음, 이 명령은 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은 대상 주소로 (127.0.0.1)를 사용하여 localhost 서로 연결할 수 있으므로 쿼리 피어의 IP 주소를 사용하는 트릭은 필요하지 않습니다.

기본 네트워킹 모드: NAT

기본적으로 WSL은 네트워킹에 NAT(네트워크 주소 변환) 기반 아키텍처를 사용합니다. NAT 기반 네트워킹 아키텍처를 사용할 때는 다음 사항을 고려해야 합니다.

Windows에서 Linux 네트워킹 앱에 액세스(localhost)

네트워킹 앱(예: NodeJS 또는 SQL 서버에서 실행되는 앱)을 Linux 배포에 구축하는 경우 localhost를 사용하여 Windows 앱(예: Edge 또는 Chrome 인터넷 브라우저)에서 이 앱에 액세스할 수 있습니다(일반적인 방법과 동일함).

Linux에서 Windows 네트워킹 앱에 액세스(호스트 IP)

Linux 배포(즉, Ubuntu)에서 Windows에서 실행되는 네트워킹 앱(예: NodeJS 또는 SQL 서버에서 실행되는 앱)에 액세스하려면 호스트 머신의 IP 주소를 사용해야 합니다. 일반적인 시나리오는 아니지만 다음 단계에 따라 작업을 수행할 수 있습니다.

  1. Linux 배포에서 ip route show | grep -i default | awk '{ print $3}' 명령을 실행하여 호스트 머신의 IP 주소를 가져옵니다.
  2. 복사한 IP 주소를 사용하여 Windows Server에 연결합니다.

아래 그림은 curl을 통해 Windows에서 실행 중인 Node.js 서버에 연결하여 이에 대한 예를 보여줍니다.

Curl을 통해 Windows에서 NodeJS 서버에 연결

원격 IP 주소를 통해 연결

원격 IP 주소를 사용하여 애플리케이션에 연결하는 경우 LAN(Local Area Network)에서 들어오는 연결로 취급됩니다. 즉 애플리케이션에서 LAN 연결을 허용할 수 있는지 확인해야 합니다.

예를 들어 애플리케이션을 127.0.0.1 대신 0.0.0.0에 바인딩해야 할 수 있습니다. Flask를 사용하는 Python 앱의 예제에서는 app.run(host='0.0.0.0') 명령을 사용하여 이 작업을 수행할 수 있습니다. 이렇게 변경하면 LAN에서 연결할 수 있으므로 보안을 염두에 두어야 합니다.

LAN(Local Area Network)에서 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(WSL 2 VM 주소)를 통해 설치된 Linux 배포의 IP 주소에 대한 wsl hostname -I
  • 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(WSL 2 VM 주소)를 통해 설치된 Linux 배포의 IP 주소에 대한 wsl hostname -i
  • 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 이상을 실행하는 컴퓨터에서 .wslconfig 파일에서 [wsl2] 설정 dnsTunneling=true 하면 WSL은 네트워킹 패킷을 통해 요청하는 대신 WSL 내에서 DNS 요청에 응답하는 가상화 기능을 사용합니다. 이 기능은 VPN 및 기타 복잡한 네트워킹 설정과의 호환성을 개선하기 위한 것입니다.

자동 프록시

Windows 11 22H2 이상을 실행하는 컴퓨터에서 파일에서 [wsl2] 설정autoProxy=true하면 WSL이 .wslconfig Windows의 HTTP 프록시 정보를 사용하도록 강제 적용됩니다. Windows에서 프록시를 이미 설정한 경우 이 기능을 사용하도록 설정하면 해당 프록시도 WSL에서 자동으로 설정됩니다.

WSL 및 방화벽

WSL 2.0.9 이상을 사용하는 Windows 11 22H2 이상을 실행하는 컴퓨터에서는 Hyper-V 방화벽 기능이 기본적으로 켜집니다. 이렇게 하면 다음이 보장됩니다.

  • WSL에 자동으로 적용되는 Windows 보안 기능에 대한 자세한 내용은 고급 보안이 포함된 Windows Defender 방화벽을 참조하세요.
  • 로컬 및 Intune과 같은 온라인 도구를 통해 이러한 규칙 및 설정을 적용하는 방법에 대한 자세한 내용은 Hyper-V 방화벽 구성을 참조하세요.