WSL 외부에서 ssh 접속하기 (2024)

WSL의 새로운 설정 (networkingMode=mirrored)를 통해 wsl로 ssh 접속을 할 수 있도록 설정 하는 방법을 소개한다.

개요

WSL의 단점 중 하나로, 네트워크를 통해 외부에 WSL 인스턴스를 노출시키기 위해 부단한 삽질이 필요했다는 것이다. 실제로 WSL과 SSH라는 키워드로 검색을 해보면 팔자에도 없던 PowerShell을 공부하여 자동화 스크립트를 짜는 등 많은 분들의 삽질을 확인할 수 있다.

networkingMode 기본값(NAT) 상태. 저 172.xxx로 시작하는 '내부' ip가 재부팅 시 매번 변경된다.

MS의 2023년 9월 WSL 2.0 업데이트mirrored라는 새로운 네트워킹 모드가 소개되었는데, 이것을 통해 얻어지는 feature 중 3번째로

  • Connect to WSL directly from your local area network (LAN)

라는 항목이 있었다👍

간단한 설정만으로 실제로 기대했던 것과 같이 잘 동작했고, 겪었던 몇가지 문제를 함께 소개해본다.

설정 과정

(1) Windows 및 wsl 버전

Windows 11 22H2를 사용해야한다. Windows 10에서는 동작하는지 확인해보지 못했다. 이 기능이 소개된 것은 버전 "2.0.0"으로, 현재 시점(2024년 4월) 기준 WSL 버전은 "2.1.5" 였다.

(2) .wslconfig을 생성하여 적용

networkingMode는 wsl 전역 설정인 .wslconfig 파일을 통해 설정할 수 있다. wslconfig에 대한 자세한 설명은 오피셜 가이드 링크로 대체한다.

C:\Users\{사용자 이름}\.wslconfig 파일을 생성하고, 아래와 같이 내용을 채워준다.

C:\Users\{사용자 이름}\.wslconfig
🐛
이 때, 나는 메모장으로 파일을 생성하고 편집했는데, .wslconfig.txt 라는 이름으로 파일이 만들어져 설정이 적용되지 않았다. 어이없는 실수지만, 혹시 같은 문제로 삽질 하실 수도 있을 것 같아 공유해본다.😂

파일을 저장한 뒤, PowerShell에서 wsl --shutdown 명령어를 입력하여 모든 wsl 인스턴스를 종료하자.

wsl 인스턴스 종료.

이 후 wsl 인스턴스를 실행시키면 새로운 wsl 설정이 적용이 된다.

(3) .wslconfig 설정 결과

eth1에 192.168.1.xxx 와 같이 ip 주소가 할당된 것을 볼 수 있다.
⚙️
eth0, eth1, eth2 3개의 네트워크 어댑터가 있는 이유는, 2개의 랜포트와 무선랜을 가진 미니 PC이기 때문이다. 보통의 PC라면 eth0만 나올 것이다.

설정 후 wsl 인스턴스를 실행하여 ip 주소를 확인했더니 의도한 것과 같이 공유기가 할당한 ip 주소가 설정된 것을 볼 수 있었다🚀 그러나 이것만으로 ssh를 통해 wsl에 접속할 순 없었다.

(4) 방화벽 설정

마지막으로 Hyper-V 방화벽 설정을 추가로 해줘야 wsl 인스턴스로 SSH 접속을 할 수 있었는데, 이 github comment로부터 얻은 PowerShell 명령어를 공유한다. PowerShell을 키고 아래 명령어를 실행하자.

New-NetFirewallHyperVRule -DisplayName "allow WSL ssh" -Direction Inbound -LocalPorts 22 -Action Allow

PowerShell 실행 화면

(5) 네트워크를 통해 ssh 접속 결과

맥북에서 ssh 접속한 모습

1~5번까지 설정을 마치고, 같은 네트워크 상의 맥북에서 ssh 접속을 시도했다. 캡쳐와 같이 정상적으로 접속이 되는 것을 확인할 수 있었다.

마치며

리눅스 개발환경을 얻기 위해서는 사실 ubuntu desktop 같은 것이 가장 마음이 편하다. 하지만 리눅스의 큰 단점은 보편적인 사용에 제약이 걸린다는 것이다. 아무리 많은 서비스들이 브라우저를 통해 제공되어도 결국 리눅스는 윈도우만큼 다양한 활용이 불가능하다.

그런 부분에서 WSL은 개발 환경 구축에 있어 게임 체인저였다. 윈도우에서 네이티브 리눅스와 같은 것을 구동할 수 있다는 점은 큰 장점으로 다가왔다. 하지만, ssh 접속과 더불어 '일반 리눅스 데스크탑/서버'라면 생기지 않았을 문제들이 많았고 이런 부분들에 대한 피드백을 많이 수집했을 것으로 보인다. systemd과 같은 것들도 아쉬운 부분이었는데 해결된 것으로 보인다.

어쨌든 중요한 점은 시간이 걸렸을 뿐, MS가 해결법을 제시했다는 것이다. MS는 최근 5년간 WSL의 활용도를 높이기 위해 Windows Terminal, VS Code, Docker 등의 integration에 힘쓰며 개발자의 편의성을 상당히 끌어올렸다. 그러면서 이런 사소한 아쉬움들까지 개선된 모습을 보니 현재 ubuntu로 구축해둔 개발 환경을 다시 Windows + WSL로 옮길까 고민이 된다.

사설이 길었는데, 간단한 설정으로 WSL에 ssh 접속 설정하는 최신 방법에 대해 알아보았다. 추후 기회가 되면 WSL을 활용한 간단한 개발 환경(코딩테스트, 웹 개발 등) 구축 방법을 소개해볼까 한다.