안녕하세요, 넷마블 기술전략실 조병승입니다.
WSL2에서는 ‘shutdown’으로 재부팅을 하거나 로컬 PC를 재부팅하면, 매번 IP 주소를 새로 할당받습니다. 로컬호스트(127.0.0.1)로도 동작하기 때문에, 큰 이슈 없이 사용하시는 분들도 계십니다. 하지만 여러 VM을 올려서 사용하거나, 로컬 PC 외부와 통신하면서 사용하시는 분들에게는 매번 IP주소가 바뀐다는 자체가 매우 성가실 수밖에 없습니다. (WSL2를 쓰면서 기록했던 몇가지 주의점은 지난 글인 “가볍게 쓰려했던 WSL2가 무겁게 다가온 순간”에서 보실 수 있습니다.)
저의 경우에는 WSL2 우분투에 워드프레스를 최초 설치하면서 입력하는 사이트 주소를 매번 수작업으로 바꿔줘야 해서 어떻게든 고정 IP를 부여해주고 싶었습니다. 게다가 워드프레스 DB를 다른 VM에 올려두고, 화이트리스트 방식 원격 접속 계정을 생성해 고정 IP로만 접속할 수 있게 설정하려던 이유로 더욱 간절했습니다.
파워셸 스크립트 활용
구글링으로 찾아본 솔루션에서는 WSL 설정 파일을 수정하고 파워셸 스크립트를 써서 배치 작업을 추가하는 방법이 대다수였습니다. 이를 활용한 ‘wsl2-boot’, ‘WSL-IpHandler’, ‘wsl2-custom-network’, ‘hyperv-fix-for-devs’ 같은 프로젝트 리포지터리도 찾을 수 있었습니다.
- wsl2-boot: https://github.com/ocroz/wsl2-boot
- WSL-IpHandler: https://github.com/wikiped/WSL-IpHandler
- wsl2-custom-network: https://github.com/skorhone/wsl2-custom-network
- hyperv-fix-for-devs: https://github.com/jgregmac/hyperv-fix-for-devs
하지만 파워셸에 익숙하지 않은 저에게는 새 허들이 될 뿐이었습니다.
통상 방식으로 사용하는 우분투 서버라면 18.04 버전 이후로는 ‘/etc/netplan/’에 yaml 파일을 수정해서 네트워크 설정을 추가할 수 있습니다. 여기서 추가한 yaml 파일은 ‘netplan apply’를 실행한 이후에는 재부팅을 하더라도 기본 설정값으로 쓸 수 있습니다. 하지만 이 방식은 WSL2에서 동작하지 않습니다.
제어할 수 있는 네트워크 인터페이스 추가
앞서 본 프로젝트 중 차용할 수 있는 기본 개념은 간단했습니다. Hyper-v와 WSL2에 기본 설정으로 잡혀있는 네트워크 인터페이스를 제어할 수 없다면, 제어할 수 있는 네트워크 인터페이스를 추가해서 붙이는 방식이었습니다.
포트포워딩
이렇게 네트워크 인터페이스를 추가해서 WSL2 네트워크 어댑터 IP 주소와 로컬 PC 내부 IP를 연결하는 방식을 “포트포워딩”이라고 합니다. 로컬 PC 외부에서 로컬 PC 내부에 있는 WSL에 접속하고 싶으실 때도 이 방식을 활용하시면 됩니다.
간단히 실행하는 명령어 2줄
Hyper-v가 WSL2에 할당하는 사설 IP 대역은 172.x.x.x입니다. 그래서 제어할 수 있는 네트워크 인터페이스를 추가할 때 192.168.x.x IP 대역을 활용하면 자칫 헷갈릴 수 있는 여지를 줄일 수 있습니다.
192.168.254.16으로 고정한 IP 주소 대역을 WSL2 우분투에서 쓴다고 가정한 설정 방법을 소개합니다.
WSL 디스트리뷰션에 eth0:1을 추가
이 과정은 WSL2에 우분투를 설치하고, 최초 실행을 마친 후에 실행해야 합니다.
명령어 자체는 간단합니다. 먼저 윈도우 터미널을 열고, WSL2에 설치한 우분투 디스트리뷰션(Distribution)에 포트포워딩을 적용할 IP 주소를 추가합니다.
$ wsl -d Ubuntu -u root ip addr add 192.168.254.16/24 broadcast 192.168.50.255 dev eth0 label eth0:1
그리고 WSL2와 연결할 로컬 PC 내부 IP 주소를 추가합니다.
$ netsh interface ip add address "vEthernet (WSL)" 192.168.254.100 255.255.255.0
네트워크 확인
설정이 잘 잡혔는지 확인해보겠습니다.
$ WSL hostname -I
172.30.204.109 192.168.254.16
기존에는 172.x.x.x 대역만 나왔었습니다만, 명령어가 정상 동작했다면 위처럼 192.168.254.16 IP가 추가돼 나오는 것을 볼 수 있습니다. 이후에 외부 통신이 막힌 것이 아닌지 의심되신다면, WSL 우분투에서 ‘apt-get update’나 ‘curl’ 등을 실행해 확인해보시면 됩니다.
작업 스케줄러
이렇게 추가 설정해도 재부팅이나 재가동 이후에는 초기화됩니다. 저의 경우, 업무용으로 노트북을 사용 중이라 절전모드에서 해제될 때 초기화되기도 했습니다. 그래서 위에 나온 명령어를 배치 파일로 만들어서 작업 스케줄러에 추가하면, 기본 환경에서 수작업으로 실행하지 않더라도 고정 IP를 활용할 수 있습니다.
배치 파일 생성
파워셸에 익숙하시다면 파워셸 스크립트로 배치 파일을 만드시면 됩니다. 하지만 저처럼 파워셸에 익숙하지 않으시다면 간단히 윈도우 메모장에서 ‘.bat’ 파일을 만드시면 됩니다.
작업 스케줄러에 추가
이제 윈도우에서 제공하는 작업 스케줄러에 위에서 만든 배치 파일을 추가하면 됩니다. 먼저 작업 스케줄러를 실행합니다.
추후 관리 편의성을 위해, ‘새 폴더’를 추가해 작업을 넣어두는 것이 좋습니다. 저는 ‘wsl-static-ip’라는 폴더를 만들었습니다.
‘wsl-static-ip’ 폴더를 클릭하고, 오른쪽 탭 메뉴에서 ‘작업 만들기’로 들어갑니다. 일반 탭에서 이름을 입력하고, ‘가장 높은 수준의 권한으로 실행’을 켜고 구성 대상에서 운영체제 버전을 선택합니다.
트리거 탭에서 ‘새로 만들기’를 누른 후, 배치 파일을 실행하는 조건값을 입력합니다. 저는 간단히 ‘로그온할 때’로 골랐습니다. 말 그대로 배치 파일을 실행하는 발동 조건이므로 각자 편의에 맞는 옵션을 고르시면 됩니다.
동작 탭에서 ‘새로 만들기’를 눌러 실행할 배치파일을 입력합니다. 찾아보기를 눌러서 배치 파일을 선택하면 기본값으로 배치 파일 디렉터리까지 포함한 문자열이 입력됩니다. 이 경우 해당 디렉터리값을 정상적으로 불러오지 못하는 경우가 있어서, 배치 파일만 ‘프로그램/스크립트’ 필드에 남기고 디렉터리는 ‘시작 위치(옵션)’ 필드에 입력했습니다.
이제 모든 설정을 마쳤습니다. 특별히 추가할 다른 조건이 있다면 자유롭게 설정하시면 됩니다.
불완전한 트리거
외부와 네트워크 통신을 맞출 요량이 아니거나 도커 컨테이너 네트워크 설정에 익숙하시다면, WSL2에 고정 IP를 꼭 설정하지 않아도 특별히 불편한 요소는 없을 수 있습니다. 또한, 작업 스케줄러에 등록한 트리거가 불완전해서 모든 상황을 다 커버하지 못할 수도 있습니다.
하지만 WSL2 환경에서 IP가 고정되지 않기 때문에 발생하는 불편함 해소가 최초 목적이었으므로, 파워셸 스크립트를 몰라서 학습 시간이나 허들을 높인다거나 작업 스케줄러 트리거 조건을 100%에 맞추기 위해 튜닝하는 것은 최초 목적에서 살짝 옆으로 빠져나간 문제일 수 있다는 점에 대해서도 함께 고려해보시면 좋을 것 같습니다.
다음 기회에는 WSL2가 아닌, 멀티패스(Multipass)에서 동일한 개념으로 고정 IP를 잡는 방법으로 돌아오겠습니다.
감사합니다.