WSL2 외부 접속 설정

AIVILLAIN·2023년 4월 11일
2

사무실의 인터넷과 노트북의 성능 한계에 부딪히면서 처음으로 VS Code 환경에서 작성하던 코드를 날려먹은 빡침에 바로 집의 Window PC에 구성된 WSL2 환경을 외부에서 접속하기 위해 서베이하였고, 여러 자료들을 토대로 성공한 방법을 정리한다.

1. 원격으로 접속할 PC의 공유기 내부 아이피 고정

나는 유플러스 인터넷을 사용하고 있는데 다른 공유기들은 설정 UI는 다르겠지만 근본적으로 방식은 동일하다.
나의 경우, 포트 포워딩해서 외부에서 언제든 접속 가능한 PC 환경을 만들어 놓는 것을 좋아하기 때문에 이부분은 어느정도 설정이 되어 있었다.

따로 PC의 아이피를 고정한 것은 아니고, 초기에 공유기 및 인터넷 설치하고 나서 PC를 연결했을 때 공유기 내부 아이피가 192.168.219.100과 같은 형태로 잡혔고, PC를 끄거나 켜도 아이피가 변경되지 않아 해당 아이피가 PC를 가리키고 있음을 알고 있다.

설정 방법

이를 확인하고 설정하기 위해서는 본인이 가지고 있는, 사용하고 있는 인터넷의 관리 사이트에 접속하는 방법이 필요하다.

가장 보편적인 회사들로 정리를 해보자면

웹 브라우저에서 해당 주소로 접속하면 공유기 설정 페이지가 나온다.
default 접속 아이디 비밀번호 등은 'KT 공유기 설정' 등과 같이 검색하여 확인한다.

IP에 대한 정보는 메뉴 중 DHCP 할당 정보와 관련된 메뉴가 있을 것이다.

보통 이런 형태로 DHCP를 맥 주소를 기준으로 고정 할당 가능하다.
PC의 맥 주소는 친절하게 현재 연결된 디바이스를 기준으로 검색이 가능할 수도 있고, 아닐수도 있으니 찾는 방법은 터미널을 열어

ipconfig /all

을 입력하면 확인 가능하다.

맥 주소를 확인하여 해당 맥 주소의 디바이스를 특정 IP로 고정해주는 작업을 수행한다.

2. WSL2 SSH 설정

OpenSSH Server 설치

wsl 설치 시 기본으로 제공되는 openssh-server에는 문제 발생 요지가 있다고 하기에 안전하게 삭제하고 재설치한다.

sudo apt remove openssh-server
sudo apt update
sudo apt install openssh-server net-tools

net-tools를 함께 설치한 이유는 뒤에 다룬다.

이후 ssh 설정 파일을 살짝 수정해준다.
에디터는 편한대로 사용하며 나는 nano editor가 편하기에 nano로 한다.

sudo nano /etc/ssh/sshd_config

# Ctrl + W를 누르고 특정 단어를 입력하면 해당 단어 위치를 알려준다.

#Port 22 -> # 제거하고 보안상의 이유로 사용하고 싶은 다른 포트로 변경

PasswordAuthentication no -> yes로 변경

저정도만 설정해도 일단 테스트는 가능하니 나머지 설정들에 대해서는 필요하다면 찾아보기로 하자.

Ctrl + S, X로 저장하고 빠져나온다.

sudo service ssh --full-restart

# 만약 여기서 sshd: no hostkeys available 에러가 뜬다면
sudo ssh-keygen -A
# 위 명령어 입력 후 다시 해본다

ssh 서비스 부팅 시 자동 실행 설정

내가 이부분을 찾기 귀찮아서 예전에 WSL2 외부 접속을 시도하다가 포기했었다.
윈도우를 부팅한다고 해서 WSL2가 실행되는 것은 아니며, ssh 서버 또한 자동 실행되지 않기에 이를 자동으로 시작하도록 설정해주어야 한다.

윈도우 화면에서 메모장을 키고

@echo off
"C:\Windows\System32\bash.exe" -c "sudo service ssh start"

라고 입력한 뒤, sshd.bat으로 저장한다. (sshd.bat.txt 아니다.)
Win + r키 눌러 실행 창 띄우고 shell:startup으 입력하여 시작프로그램 폴더를 띄우고 sshd.bat 파일을 해당 폴더에 넣어준다.

ssh service sudo 비밀번호 없이 시작하도록 설정

WSL2의 service를 멈추거나 실행하기 위해서는 sudo 권한이 필요하다.

sudo visudo

# 열린 파일 가장 밑에 이 구문을 추가한다.
%sudo ALL=NOPASSWD: /usr/sbin/service

이로써 window 실행 시 자동으로 openssh 서버를 시작하게 했다.

3. WSL2 IP 포워딩 설정

기본적으로 공유기가 연결되어 있는 환경에서 내 PC에 항상 같은 ip로 접속하기 위해 1번에서 DHCP 설정을 해주었는데 WSL2 이 그지같은 놈이 이전의 공유기와 PC 관계처럼 PC 내에서 WSL의 가상 ip 주소가 재부팅시마다 변한다.

이를 포워딩해주기 위해 위대한 누군가가 PowerShell Script를 작성하였고 우리는 항상 감사한 마음을 가지면서 잘 가져다 쓰면 된다.

비슷한 스크립트들이 있었는데 내가 적용 가능했던 스크립트로 기록한다.

스크립트 안에 $ports = @(); 이라는 부분이 있는데, 괄호 안에 포워딩하고 싶은 포트를 입력해준다.
그렇게 해주면 공유기에서 할당된 PC의 IP:Port가 WSL2의 가상 IP:Port로 포워딩된다.
나는 WSL에 SSH 말고는 외부에서 접속할 일이 없으므로 하나의 포트만 포워딩했다.

아래 스크립트를 파일명.ps1 확장자로 저장한다.(뒤에는 숫자 1이다)

If (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) {   
  $arguments = "& '" + $myinvocation.mycommand.definition + "'"
  Start-Process powershell -Verb runAs -ArgumentList $arguments
  Break
}

$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 {
  Write-Output "The Script Exited, the ip address of WSL 2 cannot be found";
  exit;
}

$ports = @(3000, 3001, 5000, 5500, 19000, 19002, 19006);

Invoke-Expression "netsh interface portproxy reset";

for ( $i = 0; $i -lt $ports.length; $i++ ) {
  $port = $ports[$i];
  Invoke-Expression "netsh interface portproxy add v4tov4 listenport=$port connectport=$port connectaddress=$remoteport";
}

Invoke-Expression "netsh interface portproxy show v4tov4";

그리고 해당 스크립트 파일은 안건드리고 싶기도 하고 숨겨진 위치에 놓고 싶어서 C:\PowerShellScript 폴더를 만들어서 해당 위치에 넣어줬다.

테스트해보고 싶으면 Windows PowerShell을 관리자 권한으로 열어서 해당 스크립트를 실행시켜 볼 수 있으며 실행 시켜보면 다음과 같다. (어차피 PC 껏다 켜질때마다 실행되야 하는 스크립트이니까 겁먹지 말고 실행 해보자. 혹시 오류는 뜨지 않는지.)

이부분에서 WSL2에 net-tools가 설치되어 있지 않다면 에러가 뜨기에 위에서 미리 설치했다.. 나는 왜 에러뜨나 화났었는데.. 보는 사람은 화나지 않도록!

4. WSL2 가상 ip 포워딩 자동화를 위한 작업 스케줄러 작성 및 ExecutionPolicy 지정

생각보다 해줄 게 많다.

Win + r 눌러 실행 창을 띄우고 taskschd.msc를 실행하여 작업 스케줄러를 열어준다. (윈도우키 누르고 검색에 작업 스케줄러 입력해도 됨)

  • 우측에 작업 만들기 클릭
  • 일반 설정 탭
    작업 이름은 기억하기 좋은 걸로 설정 (WSL network Forwarding 등)
    하단에 '가장 높은 수준의 권한으로 실행' 체크
  • 트리거 탭
    새로 만들기
    작업 시작 : 로그온할 때 (이부분때문에 외부에서 PC 재시작 시켰을 때 바로 실행 안되고 원격으로 접속해서 로그온까지 해줘야 WSL2 SSH 접속 가능한 거 같은데 막상 시작할 때로 하기에는 다른 프로그램들도 시작이 안돼서 울며 겨자먹기로 그냥 이렇게 써야할 것 같다..)
    하단 고급 설정에 작업 지연 시간 체크하고 30초 ~ 1분 정도 (ssh 서버 여는 시작프로그램 먼저 실행하기 위해)
  • 동작 탭
    새로 만들기
    동작 : 프로그램 시작
    프로그램/스크립트 : %SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe (PowerShell 실행 경로다.)
    인수 추가 : -ExecutionPolicy Bypass -File .\3번에서 만든 스크립트 파일.ps1
    시작 위치 : 나는 C:\PowerShellScript 에 놓았으니 해당 경로로 입력해주었다.
    아니면 시작 위치는 비우고 인수 추가의 -File 뒤에 Full Path 입력해줘도 된다.
  • 조건 탭
    컴퓨터의 AC 전원이 켜져 있는 경우에만 작업 시작 체크 해제
  • 설정 탭
    다음 시간 이상 작업이 실행되면 중지 체크 해제

확인 누르고 저장한다.

그리고 확인을 위해 PowerShell 관리자 권한으로 열고

PowerShell.exe -ExecutionPolicy Bypass -File <아까 만든 .ps1 스크립트 경로>

한 번 실행해보고 지정된 파일을 찾을 수 없습니다 같은 오류가 뜨면 한 번 더 실행해보자.

그러고 나서 cmd창 열어서

ssh 유저@ip주소 -p 설정한포트

입력해서 접속 되나 확인 한 번 해본다.

5. 공유기 포트포워딩

작성하다 보니 시간이 생각보다 많이 흘렀다.

아까 1번에서 접속한 공유기 설정 페이지에서 공유기 외부 공인 ip의 특정 포트로 접속하면 DHCP 설정한 PC ip의 ssh 서버 설정 포트로 포워딩 되게 설정해주고 스마트폰이나 외부에서 접속 테스트를 해본다.

나는 이 과정을 통해

이런식으로 맥에서 내 집에있는 데스크톱 WSL에 SSH로 접속하여 VS Code 작업을 수행할 수 있게 설정하였다!

Reference

WSL2 외부 remote ip 접속 가능하도록 설정하기, 방화벽 해제

WSL2 프로세스 외부 접속을 위한 포트포워딩

WSL2에 ssh 서버와 외부연결 환경 구축

WSL 외부 접속 설정하기 - ssh, 포트포워딩

[Error] sshd: no hostkeys available -- exiting.

여담

한 가지 아쉬운게 있다면 이 설정 부분은 아니지만 스마트폰 모바일 네트워크로 테더링 쓰는 부분인데 이전 갤럭시 S20에서는 통신사 네트워크를 우회하는 방법으로 사용할 수 있었지만 플립4로 바꾸면서 그 방법이 적용이 안되고 있어서 NetShare라는 어플로 내 모바일 네트워크를 사용하고 있는 것처럼 속이는 꼼수를 쓰고 있는데, 이게 HTTP/S 프록시를 설정하고 사용해야 하다 보니 카톡도 사용을 못하고 이 네트워크에서는 원격 데스크톱이나 WSL2 외부 접속도 불가능해서 이 부분을 해결할 수 있는 부분이 있는지 찾아봐야겠다..

profile
소신있는 오픈마인드

2개의 댓글

comment-user-thumbnail
2024년 1월 23일

안녕하세요 작업 내용 따라하다가 4번 ssh 유저@ip주소 -p 설정한포트 부분에서 막혀서 질문 드립니다. 유저랑 ip주소는 wsl에 있는 내용을 입력하는게 맞을까요??

1개의 답글