상세 컨텐츠

본문 제목

WSL2, 외부 네트워크와 연결하기

카테고리 없음

by 노아론 2020. 5. 8. 11:17

본문

node.js를 WSL2에서 구동하였는데 로컬만 접속되고 외부에서는 접속안돼요
Django를 WSL2에서 구동하였는데 외부에서 접속이 안돼요
와 같은 문제점을 해결하는 글입니다

 

 

현재 Window10 preview 2004 버전에서는 WSL2환경이 지원된다

 

5월 중으로 정식 업데이트가 된다고 하지만, Docker환경이 지원된다는 소식에 참지 못하고 프리뷰로 사용하고 있다.

 

크게 기존 WSL1은 Docker 사용을 비롯한 Unix소켓 지원이 안되어 Docker를 사용하려면
Windows Docker를 WSL환경에서 사용하였다.

 

WSL2에선 이제 Native Docker를 사용할 수 있다! 심지어 Windows Docker에서도 WSL의 Docker Daemon을 사용할지 설정할 수 도 있게 되었다.

 

그러나, WSL2는 로컬에서 이더넷 어댑터를 통해 연결이 되어있다.

풀어 말하자면, WSL2에서 서버를 실행하면 로컬만 연결되며, 외부와는 연결되지 않는다는 것이다

바로 이 글을 쓰게 된 이유이다.

 

WSL2의 네트워크 어댑터는 아래와 같이 구성 됨을 확인할 수 있다.

PS C:\scripts> ipconfig

Windows IP 구성

이더넷 어댑터 vEthernet (WSL):

   연결별 DNS 접미사. . . . :
   링크-로컬 IPv6 주소 . . . . : ****::****:****:****:*******
   IPv4 주소 . . . . . . . . . : 172.22.192.1
   서브넷 마스크 . . . . . . . : 255.255.240.0

Reddit에서 "WSL2, 이제 localhost와 연결돼요!" 라는 WSL 업데이트 소식이 도대체 무엇을 말하는지 이제야 알게 되었다

(WSL1 에선 당연히 localhost와 연결되었으니 말이다)

 

WSL2 내에서 서버를 동작하면 다음과 같은 과정으로 연결이 된다

로컬의 내부IP(192.168.0.20) -> WSL2 어댑터의 주소(172.22.192.40)

 

랩탑에서 자신의 로컬 환경을 외부에서 접속하려면 port foward작업을 통해 해결하였다

로컬의 외부IP -> 로컬의 내부IP(192.168.0.20)

 

그렇다면 WSL2에 대해서도 연결될 수 있게 Port Forward작업을 해주면 되지 않을까?

아래처럼 말이다

 

로컬의 외부IP -> 로컬의 내부IP(192.168.0.20) -> WSL2 어댑터의 주소(172.22.192.40)

# 로컬에서 WSL2로의 Port Foward 연결
$my_wsl_address = 172.22.192.40
$port = 8000

netsh interface portproxy add v4tov4 listenport=$port listenaddress='0.0.0.0' connectport=$port connectaddress=$my_wsl_address

 

위의 작업으로 어느 정도 해결이 된 것 같다.

그러나, 윈도우를 새로 시작할 때마다 WSL2의 IP는 변경되기에

매번 이 작업을 수행하기엔 번거로울 것이다. 더군다나 포트마다 설정해줘야 한다.

 

Github의 Microsoft WSL Repository의 Issue에서도 이와 관련해 많은 내용들이 오갔고

https://github.com/microsoft/WSL/issues/4150#issuecomment-504209723

해당 커멘트를 통해 쉽게 해결할 수 있었다.

 

이 글을 읽는 분들을 위해 해당 스크립트를 가져왔다.

 

아래의 스크립트를 *.ps1 확장자로 저장하고 윈도우 작업 스케쥴러에서

트리거를 컴퓨터 시작 시 로 지정하면 해결된다.

 

포트 설정의 경우 스크립트 내의

$ports=@(80,443,10000,3000,5000); 에서 추가/제거를 하면 된다

wsl-connect-external.ps1

$remoteport = bash.exe -c "ifconfig eth0 | grep 'inet '"
$found = $remoteport -match '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}';

if( $found ){
  $remoteport = $matches[0];
} else{
  echo "The Script Exited, the ip address of WSL 2 cannot be found";
  exit;
}

#[Ports]

#All the ports you want to forward separated by coma
$ports=@(80,443,10000,3000,5000);


#[Static ip]
#You can change the addr to your ip config to listen to a specific address
$addr='0.0.0.0';
$ports_a = $ports -join ",";


#Remove Firewall Exception Rules
iex "Remove-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' ";

#adding Exception Rules for inbound and outbound Rules
iex "New-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' -Direction Outbound -LocalPort $ports_a -Action Allow -Protocol TCP";
iex "New-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' -Direction Inbound -LocalPort $ports_a -Action Allow -Protocol TCP";

for( $i = 0; $i -lt $ports.length; $i++ ){
  $port = $ports[$i];
  iex "netsh interface portproxy delete v4tov4 listenport=$port listenaddress=$addr";
  iex "netsh interface portproxy add v4tov4 listenport=$port listenaddress=$addr connectport=$port connectaddress=$remoteport";
}
  • Execution Policy와 관련해 오류를 내어 동작하지 않는다면?

    PowerShell.exe -ExecutionPolicy Bypass -File .\wsl-forward-server.ps1

    Execution Policy를 설정해 스크립트가 실행되도록 한다

 

도움이 된 글들

https://m.blog.naver.com/seongjin0526/221778212779

https://github.com/microsoft/WSL/issues/4150

 

WSLv2를 외부 SSH 연결하기 위한 포트포워딩 자동화 Powershell script

필자는 Windows 10 Pro Insider Preview 사용자로 기존 WSLv1에서는 동작하지 않는 WSL위에서 D...

blog.naver.com

 

만일, 본문에 잘못된 내용이 있다면 지적 환영합니다

반응형

댓글 영역

  • 프로필 사진
    2020.08.14 12:11
    powershell에서 다음 명령어를 실행했습니다.
    PowerShell.exe -ExecutionPolicy Bypass -File .\wsl-connect-external.ps1

    그런데
    /bin/bash: ifconfig: command not found
    The Script Exited, the ip address of WSL 2 cannot be found
    위와 같은 오류메세지가 뜹니다. 혹시 어떻게 해결해야 하는지 아시나요?ㅠㅠ 찾아봐도 잘 모르겠습니다

    • 프로필 사진
      2020.08.14 12:24 신고
      스크립트의 bash.exe -c "ifconfig eth0 | grep 'inet '" 인 bash로 명령어 실행 과정에서
      ifconfig 명령어가 작동하지 않아 생긴 문제인 것 같습니다

      WSL2 상의 환경에서 ifconfig를 입력해보시고
      command not found 메세지가 뜨는 경우, apt install net-tools
      를 통해 패키지를 설치를 하면 정상적으로 실행이 될겁니다
  • 프로필 사진
    2020.08.14 12:35
    감사합니다. 이제 오류 안나고 다른 내용들이 잘 떴습니다.
    그러면 이제 powershell에서 ipconfig쳐서
    '이더넷 어댑터 vEthernet (WSL):' 에서 'IPv4 주소'로 실행하면 되나요?
    • 프로필 사진
      2020.08.14 12:46 신고
      제가 혜리good님께서 말씀하신 "'이더넷 어댑터 vEthernet (WSL):' 에서 'IPv4 주소'로 실행하면 되나요" 에서 실행하는 의도를 잘 이해하지 못한 것 같습니다.

      윈도우와 WSL2 간의 네트워크 어댑터 연결이 되었는지 보기 위해서는 그렇게 해주시면 됩니다.

      만일,
      $my_wsl_address = 172.22.192.40
      내용이 담긴 <본문 상단에서 2번째 코드블럭 방법으로 하시는 경우엔 그렇게 찾아서 설정해주시면 됩니다.

      다만 WSL2의 IP 어드레스는 재부팅 시 마다 변경될 수 있습니다.
      이런 번거로운 점을 해결하기 위해
      스크립트 내용대로 등록하시면
      매번 설정하지 않아도 WSL2 IP어드레스를 자동으로 찾아 실행이 됩니다. (bash.exe -c "ifconfig eth0 | grep 'inet '" 에서 나온 출력내용 중 WSL2의 IP어드레스를 얻는 방법)
    • 프로필 사진
      2020.08.14 14:06
      계속 친절하게 알려주셔서 감사합니다 :)
      잘 해결되었습니다!
    • 프로필 사진
      2020.08.14 14:07 신고
      노트북 <--> WSL2 로 연결되었기에
      폰에서는 노트북의 IP로 연결하시면 됩니다
    • 프로필 사진
      2020.08.14 14:08 신고
      해결되셨다니 다행입니다ㅎㅎ
  • 프로필 사진
    2020.08.25 12:45
    안녕하세요. 최근에 계속 잘 되다가 컴퓨터를 껐다가 키면 ip로 접속이 안되고

    PowerShell.exe -ExecutionPolicy Bypass -File .\wsl-forward-server.ps1

    이걸 매번 컴퓨터 껐다 켤때마다 해줘야 그제서야 접속이 되는데 혹시 왜그런건가요?
    • 프로필 사진
      2020.08.25 15:44 신고
      저도 최근에 비슷한 증상을 겪었는데요,
      Powershell에서 Get-ExecutionPolicy 명령어를 입력하니 ByPass가 뜨는 것을 확인하였습니다.

      파워쉘 실행정책으로 인해 막힌 부분은 아닌 듯 합니다(혹시나 틀리면 말씀해주세요)

      제 케이스에서는 윈도우 로그온 후 바로 WSL환경 콘솔에 접속하면 WSL가 running상태가 아니어서 환경세팅때 까지 잠시 기다려야하는 상황이 종종 생깁니다.
      일단 임시로 로그온 후 3~5분 뒤 실행되게 설정하였습니다
    • 프로필 사진
      2020.08.26 09:59
      감사합니다!
      며칠동안 그랬는데 오늘은 또 잘 실행이 되네요^_^;
      이후에 비슷한 현상이 다시 발생하면 저도 임시로 몇분후에 실행되게끔 해야겠네요
      감사합니다 :)
  • 프로필 사진
    2020.08.28 17:17
    저 WSL2 에서 이해가 안가는데.. 질문 몇개 드려도 될까요? ㅠㅠ

    1. https://t1.daumcdn.net/cfile/tistory/99C58C505F48BB0B2E 링크의 사진은
    제 윈도우 컴퓨터의 CMD 창과 그 위의 WSL2 에서 IP 주소를 캡쳐한 것입니다.
    CMD에서 보이는 WSL 이더넷 IPv4 주소와 WSL에서 보이는 inet 주소는 같아야 할거 같은데 왜 다른걸까요?

    2. 글에 적으신 "로컬의 내부IP(192.168.0.20) -> WSL2 어댑터의 주소(172.22.192.40)" 부분에서
    로컬 192.168.0.20 는 WSL2의 윈도우 호스트 로컬 IP이고,
    WSL2 172.22.192.4 는 CMD에서 보이는 WSL IPv4 주소인가요?

    3. Putty 로 WSL2 에 붙으려면 그림의 CMD 화면의 IP에 붙어야 하는건가요, 아니면 WSL 2 의 Inet 주소에 붙어야 하는건가요?

    4. 올려주신 스크립트는 Powershell 실행이라 하셨으니, WSL의 리눅스에서 실행하는게 아니라, 호스트인 윈도우에서 실행하는것 일까요?

    이해도가 많이 부족합니다. 질문이 이상해도 답변 주시면 감사하겠습니다 ㅜㅜ
    • 프로필 사진
      2020.08.28 23:37 신고
      1. CMD의 ipconfig로 나온 WSL의 ip는 기본 게이트웨이가 나온 것 같습니다. WSL에서 ifconfig를 입력해 나온 ip가 wsl의 여기서 사용할 내부ip입니다.
      제가 '이더넷 어댑터의 IP" 라고 적은 부분이 있는데 다시 살펴보고 내용 정정하겠습니다

      2. 네 192.168.0.20은 현재 컴퓨터(랩탑or데스크탑) 의 와이파이 환경에서의 내부ip이며 172.2.2.192.4 는 컴퓨터의 가상이더넷에 연결된 WSL의 ip주소입니다

      3. 본문 내용대로 설정하지 않은채 WSL2을 사용하신다면 WSL2의 주소를 적으시면 됩니다.

      4. 네 맞습니다. Powershell에서 실행하시면 됩니다. 스크립트 내용 상단을 보시면 "bash ~~"로 대략 wsl에서 구문을 실행시키는 동작이 있습니다.
      이 부분을 통해 Powershell에서 bash명령을 통해 wsl의 ip주소를 가져오고 이후 작업을 하게 됩니다
  • 프로필 사진
    2020.09.13 02:17
    선생님.. Powershell에서 실행도 잘 되는데 ipconfig해서 WSL IP로 들어가려하면 연결이 재설정됬다고 하면서 사이트에 연결할 수 없다고 합니다.. 혹시 재시작을 해줘야 하나요?
  • 프로필 사진
    2020.09.22 11:06 신고
    감사합니다. 이거때문에 골치앓고 있었는데 드디어 해결되었네요.
  • 프로필 사진
    2020.11.09 15:53
    같은 문제로 일주일째 고민하다가 해결했습니다. 그런데 동일 Wifi상태에서는 접속이 되는데 다른 망에서는 접속이 안되네요, 권한이나 방화벽 문제인것같은데 더 건드려야 할 곳이 있을까요...
    • 프로필 사진
      2020.11.09 17:52 신고
      내부 네트워크에선 잘 되셨다면 제 생각엔 공유기 상에서의 포트관리 문제인 것 같아보여요
  • 프로필 사진
    2021.04.18 23:34 신고
    혹시 bash shell에서 ifconfig했을 때 IPv4주소와 PowerShell에서 ipconfig했을 때 wsl2전용 IPv4주소가 다를 수도 있나요?? wsl2로 ubuntu 실행 후 ifconfig했을 때랑 로컬 bash shell 실행 후 ifconfig했을 때는 주소가 같은데 PowerShell이랑은 다르네요ㅠㅠ
  • 프로필 사진
    2021.05.03 22:51
    좋은 정보 감사드립니다. 이거 사용하고 있는데 한가지 질문이 있습니다.

    Windows SSH로 연결해서 WSL2 사용중인데요.
    SSH에서 WSL2 실행시켰을 때, SSH연결이 끊겨도 WSL이 계속 작동하게 하는 방법이 있을까요?
    • 프로필 사진
      2021.05.05 02:06 신고
      Windows SSH로 연결이 윈도우에서 SSH로 WSL2를 접속하여 사용하고 계시다는 말씀이실까요?
      그렇다면 screen을 사용해보시는 것도 추천드립니다
      screen이나 tmux를 사용해보시는걸 권해드립니다. 우분투에선 apt 패키지로 제공하고 있는데 재접속시에 화면이 유지될 수 있게 해줍니다
  • 프로필 사진
    2021.06.05 16:44
    정말 좋은 정보 감사합니다. 막혔던 것이 인제 잘 해결되었습니다!
  • 프로필 사진
    2021.07.08 02:00
    안녕하세요~ 하다하다가 안되서 이렇게 씁니다 ㅠㅠ
    외부(다른 네트워크를 쓰는 컴퓨터)에서 wsl2로 들어가고 싶은데
    wsl2 우분투에서 /etc/ssh/sshd_config 의 포트를 22로 잡아준 상태고 (기본 주석 해제하고 Port 22 명시)
    wsl2를 호스트하는 윈도우의 방화벽도 포트번호 22로 뚫은 상태인데요

    *.ps1 에 포트는 2091로 적어둬서 실행이 잘됐는데, >> $ports=@(2091);
    포트포워딩 할때 내부아이피가 192.xx.xx.xx로 하고 내부 포트는 22로 잡아야 하나요 2091?로 잡아야 하나요
    그리고 외부에서 ssh 접속할 때는 >> ssh account@172.xx 으로 줘야하는지 호스트하는 윈도우의 외부 아이피(이거 일것 같은데..)로 줘야 하는지 >> ssh wsl_account@172.xx 그리고 포트는 22인지 2091인지..??

    하다하다 모르겠어서 이렇게 물어봐요 ㅠㅠ
    컴퓨터를 잘 몰라서 질문이 바보같을지도..;; 부탁드립니다ㅠㅠ

    • 프로필 사진
      2021.07.08 02:12 신고
      글에 첨부한 스크립트 동작에선 포트가 listen과 connect 둘 모두 동일하게 연결되어 있습니다.
      네트워크 외부에서 ssh접속할 땐 외부 아이피를 주시면 됩니다!
  • 프로필 사진
    2021.11.17 21:55
    wsl2 도커 사용하고있는데 iptables 설정이 안먹히네요 알아보니 도커가 알아서 잡아서 iptables를 설정한다고 한다는데 그럼 어차피 포트포워딩했고 윈도우 방화벽을 설정했으니 그냥 쓰면 되나요?
    • 프로필 사진
      2021.11.18 09:01 신고
      환경마다 모두 달라 정확한 답변은 드리지 못하나, 포트 오픈 체크로 정확하게 파악해보심이 좋을 것 같습니다
  • 프로필 사진
    2021.11.29 00:11
    뭔가 tricky한 방법같지만,
    WSL2의 IP가 172. 로 시작된다는 전제(?)를 이용하면
    ifconfig 대신 이렇게 쓰는게 통하긴 합니다..
    $remoteport = ipconfig | grep 172.
    • 프로필 사진
      2021.12.02 22:23 신고
      내부 네트워크를 쓰는 별다른 프로세스가 없다면 이걸로도 방법이 되겠군요
      참신한 정보 감사합니다ㅎㅎ