필자는 Ubuntu 20.04 를 사용하고 있다.
계속해서 프로젝트를 진행하던 중
서버와 클라이언트를 연결하는데 자꾸 wsl의 ip가 변경되다 보니 거슬렸다.
물론 다른 해결방법도 있었지만 wsl의 ip를 정적으로 고정하고자 한다.
Ubuntu 18.04 이전 버전들은
/etc/network/interfaces
를 통해 ip를 설정하곤 했었다.
필자가 사용하는 20.04 버전을 포함한 18.04 부터의 버전들은
/etc/netplan
위의 경로에
*.yaml
파일을 통해 설정한다.
파일의 이름은 중요하지 않으며, yaml파일로 작성한다.
파일의 내용은 아래와 같다.
정적으로 설정할 때는 반드시 dhcp를 no로 해주어야 한다.
eth0 위치에는 현재 자신이 사용 중인 인터페이스를 기입해준다.
그 후,
sudo net apply
를 통해 적용하려 했지만
위와 같이 에러 메시지를 뱉어냈다...
에러 메시지를 계속해서 읽어보며 구글링을 하다가
subprocess.CalledProcessError: Command '['systemctl', 'stop', '--no-block', 'systemd-networkd.service', 'netplan-wpa@*.service']' returned non-zero exit status 1.
에러 메시지의 가장 마지막 줄을 다시 한번 읽고,
systemctl
위 명령어도 입력해보았더니
똑같은 에러를 뱉었다.
이를 기반으로 다시 서칭하여
sudo apt-get update && sudo apt-get install -yqq daemonize dbus-user-session fontconfig
sudo daemonize /usr/bin/unshare --fork --pid --mount-proc /lib/systemd/systemd --system-unit=basic.target
exec sudo nsenter -t $(pidof systemd) -a su - $LOGNAME
snap version
https://gist.github.com/alyleite/ca8b10581dbecd722d9dcc35b50d9b2b
일련의 과정을 수행한 결과
결국 정적 ip 할당에 성공하였다.
!!
+ 22.05.07.
재부팅할 때마다 ip 설정이 초기화되는 문제를 발견하고 다른 방법을 통해 문제를 해결했었는데,
글을 업데이트하지 않은 것을 이제야 깨달았다.
WSL2는 재부팅 과정에서 IP 주소를 변경하므로
위와 같이 ubuntu에서 설정하듯이 정적으로 ip를 설정해준다고 해도 유지되지 않는다.
때문에,
script 파일을 생성하여 매번 부팅 시마다 바뀌는 WSL2의 ip를 연결해주는 방식으로 수고를 덜고자 하였다.
https://github.com/microsoft/WSL/issues/4150#issuecomment-504209723
Script file
$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,4000,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";
}
우선 위와 같이 스크립트 파일을 준비한다.
D:\wsl\wsl-connect-external.ps1
파일은 위 경로에 wsl-connect-external.ps1과 같은 이름으로 저장해두었다.
위 스크립트 파일은 아래의 일련의 과정을 수행한다.
- WSL 2 시스템의 IP 주소 가져오기
- 이전 포트 전달 규칙 제거
- 포트 전달 규칙 추가
- 이전에 추가한 방화벽 규칙 제거
- 새 방화벽 규칙 추가
작업이 성공적으로 완료되면, Host Window의 NIC를 통해 WSL2로의 액세스가 가능해진다.
그다음, 스케줄러를 설정해주기 위해 작업 스케줄러를 실행한다.
taskschd.msc
우선 작업을 하나 만들어준다.
그리고 로그온 할 때 동작하도록 트리거를 설정한다.
실행할 작업은 runfile.bat으로 설정하였는데,
PowerShell.exe -ExecutionPolicy Bypass -File "D:\wsl\wsl-connect-external.ps1"
해당 파일의 내용은 위와 같다.
왜 바로 스크립트 파일을 실행하지 않는가?
그 이유는 PowerShell이 해당 스크립트를 실행하기 위해선 관리자 권한으로 실행해야 하기 때문에,
위와 같이 bat 파일에 명시하여 관리자 권한으로 정상적으로 작업을 수행하도록 한 것이다.
최종적으로 확인할 수 있는 스케줄러의 모습은 다음과 같다.
위 스크립트가 성공적으로 작업을 완료하면 Host Window를 통해 WSL로 액세스가 가능해진다.
이제 Port Forwarding을 통해
고정된 ip를 통해 액세스가 가능하도록 설정해주겠다.
위와 같이 client, server용으로 포트 2개를 포트 포워딩해주었다.
포트 포워딩 관련 포스트는 공유기 별로 검색하면 쉽게 찾을 수 있으므로 생략하도록 하겠다.
드디어 매번 ip주소를 확인할 필요 없는 환경 구축에 성공하였다.
..!!
'Dev' 카테고리의 다른 글
Github Copilot 설정하기 (2) | 2022.04.25 |
---|---|
address already in use 에러 해결하기 ( awk와 함께 ) (0) | 2022.04.02 |
TypeORM - 버전 0.3 && ORM이란? (0) | 2022.03.28 |
Linux alias(별칭 지정) 명령어 영구 등록 (0) | 2022.02.14 |
WSL2 - putty로 SSH 연결하기 (0) | 2021.12.31 |