윈도우 서버 2022에 WSL 2 설치하고 서버 역할로 돌리는 법

Composite·2022년 6월 9일
3

한국 시각으로 5월 27일부터 드디어 윈도우 2022에 WSL2 가 공식 출시했다.
전에는 20H2 인사이더에서 잠깐 제공하고 없애버렸지만, 서버 제품군 고객들의 끊임없는 요구를 3월에 마소가 드디어 받아주고 거의 3개월만에 WSL 2를 탑재했다.
이는 이미 윈도우 서버에 WSL 탑재가 큰데, 만약 아예 WSL 자체를 탑재하지 않았다면 WSL2 요구는 묻어도 됐을 것이다.
그러나 이미 WSL이 탑재된 이상, 윈도우 서버가 그저 서버만의 역할이 아닌, 워크스테이션 및 개발 서버 용도로 다양하게 활용하는 이상, 기성 윈도우 서버 제품군 고객이 과연 가만히 있었을까?
아마 한국 한정이라면 안했을 것이다. (아, 참고로 이슈에 해외거주 한국인이 해달라고 이슈에 도배해서 OffTopic 취급된 건 덤)

어쨌든, WSL2 now available on Windows Server 2022 공식 사이트에서 설명한다.
일반적인 사용자라면, 단 3단계로 끝낼 수 있다.

  1. KB5014021 업데이트 및 확인
  2. Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux 파워쉘 명령어로 WSL 설치 후 재시작
  3. wsl --install 명령어로 WSL 커널과 기본 배포본(주로 우분투) 설치

이게 끝이다. 하지만, 여기서 끝났다면 내가 이 글을 올릴 필요도 없었을 것이다.
이제부터 윈도우 2022에서 본격적으로 WSL2를 무사히 설치할 수 있는 가이드를 제시할 것이다.

준비물

기본적으로 관리자용 파워쉘을 기준으로 하겠다.

먼저, Administrator가 아닌 사용자 계정을 준비한다. 만약 윈도우 서버를 처음 설치하면 사용자 입력란 없이 설치하여 그냥 Administrator 비번만 입력하고 시작할 것이다. 컴퓨터 관리(윈도우 아이콘 오른쪽마우스 클릭)에 들어가 사용자 및 그룹에서 사용자를 추가해야 한다. 이 때, 그룹에는 기본적으로 Users가 들어가는데, 반드시 Administrators 그룹을 추가하여 관리자 권한도 실행이 가능해야 한다. WSL 관리 자체는 관리자 권한을 요구하기 때문이다. (물론 사용자만 딸랑 만들고 관리자 권한 요구 시 Administrator 비번을 입력해도 되긴 하는데, 위험하고 불편하고 추천하지 않는 방법이다)
이건 기존 윈도우 10에서도 마찬가지인데, 윈도우 10에서도 Administrator 계정으로는 MS 스토어 앱 및 WSL 사용이 막힌다. MS가 보안을 위해 고의적으로 막은 것이다.

어쨌든, 준비했고, WSL 설치했다면, 이제 본격적으로 리눅스를 설치하고 실행할 차례. 아, 물론 WSL 기능 자체는 Administrator 계정으로 설치 가능하니 참고하도록.

wsl --install 치면 안되는 경우가 많을 것이다. Installing: 같은 메시지가 아닌 그저 사용 방법이 출력된다면 수동으로 해야 한다.

먼저, Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform 명령어로 가상머신 플랫폼을 설치해야 한다. 재시작은 덤이다.
또는 서버 역할에서 Hyper-V 추가해서 설치해도 된다. 가상머신 플랫폼이 따라서 깔린다.
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V

그다음, WSL Update Package 파일을 다운받아 설치한 후, 또 재시작한다.

이렇게 한 다음에, 원하는 리눅스 플랫폼을 골라 설치한다. 그냥 우분투 추천한다. 공식적으로 CentOS는 레드햇 분쟁 우려로 지원하지 않고, 대신 오라클 리눅스가 지원된다. CentOS와 똑같으니 CentOS 환경 원한다면 오라클 리눅스를 깔면 되지만, 난 그냥 우분투 추천한다.
wsl --install -d Ubuntu

설치까지 끝나면, 초기화를 시도할 것이다. 만약 아래와 같은 메시지가 나온다면,
WslRegisterDistribution failed with error: 0x800706be
그건 네가 WSL 리눅스를 Administrator 계정으로 실행해서 그런 것이다. 그래서 내가 일반 사용자 계정으로 로그인하고 설치하라고 한 것이다.

이렇게 해서 초기화가 끝나고 아이디와 비밀번호까지 입력하면, 기본적인 리눅스 준비는 끝이다.

SSH 서버를 설치 후 서버답게 쓰기

사실 이 때부터는 윈도우 10에서 WSL2 운용하는 방법과 아주 동일하게 쓰면 된다.
이제부터 골칫거리가 생기기 시작하는데, 너희들이야 당연히 서버에다가 리눅스 서버를 설치했으니 서버답게 쓰고 싶을 것이다.
하지만, 윈도우 10때도 그랬지만 녹록치 않음을 명심하라.

하지만 어느 한국인이 스크립트 솔루션을 공유했는데, 내가 이걸 개조했다.
내가 어떻게 개선을 했냐면,

  • 처음 실행 시 리눅스의 포트포워딩과 방화벽을 등록하고, 리눅스에 할당받은 IP를 파일에 저장한다.
  • 만약 기등록한 파일에 기재된 IP를 다시 가져와 현재 할당받은 IP가 같으면 재등록하지 않고, 바뀌어야 재등록한다.
  • 작업 스케줄러를 위한 로그 기능이 추가되었다.
  • 이따금씩 할당받은 IP가 여러개일 수 있으므로 처음 하나만 받도록 수정했다.
  • 작업 후 wsl sudo service ssh start 등의 시작 스크립트를 추가하였다.

이 때, 기본적으로 sudo 실행 시 비밀번호를 요구하므로, sudo visudo 명령어를 통해 권한 설정 파일을 편집기로 열어서,

# 첫번째 username 은 네가 쓰는 리눅스 사용자 아이디로 바꿔야 한다.
username ALL=(ALL:ALL) NOPASSWD: /sbin/service, /usr/sbin/service

이렇게 하면 service 실행 시 비밀번호를 묻지 않을 것이다. 아니면 아예 NOPASSWORD: ALL 로 바꿔서 모든 sudo 프로세스 실행 시 비밀번호를 묻지 않도록 할 수 있는데, 이 때 SSH 접속할거면 비밀번호가 아닌 공개키파일로 로그인하는 걸 추천한다. 이에 대한 가이드는 후술.

이렇게 하면 위 스크립트가 원만하게 실행할 것이며, 체크하는 방법은 간단하다.

  1. wsl hostname -I 쳐서 리눅스가 할당받은 IP를 뽑아낸다. IP가 여러개 받을 수도 있는데, 처음 IP만 보면 된다.
  2. 그다음, netsh interface portproxy show v4tov4 쳐서 포트포워딩 목록을 본다. 리눅스 할당받은 IP와 22번 포트 등등으로 뜨면 성공.
  3. 마지막으로 Windows 고급 방화벽에 인바운드 규칙에서 WSL 2 Firewall Unlock 문구가 뜨는지 확인한다. 뜨면 성공.

자, 이제 SSH 세팅을 해야 한다. sudo vi /etc/ssh/sshd_config 파일을 root권한으로 편집하여,

# 둘 중 하나만 해도 되고, 둘 다 해도 됨.
PubkeyAuthentication yes # 공개키로 로그인하고 싶다면 yes 아니면 no
PasswordAuthentication yes # 비밀번호로 로그인하고 싶다면 yes 아니면 no

이렇게 설정 내용이 되었는지 확인하고 아니면 수정하고 저장하면 된다.
이제 외부에서 SSH 접속을 해봐서 접속되면 성공이다.
공개키를 통한 접속 방법은 구글링 통해서 터득하도록. 개인적으로 이걸 추천한다. 비밀번호 입력이 필요없고 공개키만 노출 안되는 범위 내에 가져가서 써먹으면 되니까. 게다가 뽀록났다 싶으면 로컬에 접속해서 ssh-keygen 명령어로 키파일 갈아엎으면 되고.

자, 왜 이렇게 고생을 해야 하냐면, WSL 은 첫 프로세스 시작 시마다 IP를 자동으로 할당받는다. 게다가 WSL 프로세스가 윈도우에 상주하는게 없다면, WSL 배포본은 꺼짐 상태가 된다. 따라서 이런 상태에서 다시 리눅스 프로세스를 시작하면 또 IP를 다른 놈으로 할당받는다. 이 때문에 스케줄 돌려서까지 IP 체크하고 할당받은 IP로 포트포워딩하고 해야 한다. 로컬 윈도우에서 로컬 리눅스 서버를 localhost 로 접속 가능한 이유는 WSL 기능 중에 localhost 리디렉션 기능 때문이다. 하지만 이게 곧 외부로 접속 가능한 게 아니다. 그거와 별개다 따라서 피곤하지만 주기적으로 IP 바뀌었는지 체크하고 바뀔 때마다 할당받은 IP로 포워딩 해서 외부접속이 가능케 해야 하는 것이다.
만약 윈도우 11을 쓴다면 가상 네트워크 구축하고(윈도우 10도 이 기능 자체는 되며 이건 내 포스트 참조)이 네크워크를 가리켜 고정IP로 리눅스에서 세팅할 수 있기 때문에 이런 고생 없이 그냥 초기에 한번만 포트포워딩 등록하면 된다. 하지만 아쉽게도 윈도우 서버 2022는 윈도우 10 기반이다. 치사하다. 아 근데, 물론 방화벽 또한 한번만 등록하면 되긴 하는데 원본이 그렇게 되있어서 그거 따라한 거다.

윈도우 RDP 접속 시 직접 대신 터널링 사용

만약 공유기를 통해 윈도우 서버에 접속한다면, 공유기를 활용하는 게 쉬울 수 있다. 포트가 기본적으로 막혀 있고 VPN 기능까지 있으면 금상첨화. 하지만 그런 환경이 아닌 곳이 많을 거기 때문에 그 기준으로 설명하겠다.

다들 아시다시피 RDP 프로토콜은 보안에 취약하다는 말 질리도록 들어도 할 말이 없다. SSH처럼 인증 방식도 유연하지 못하고, 터널링도 지원하지 않고(게이트웨이 같이 엔터프라이즈 위주의 터널링만 지원) 참 피곤하다. 차라리 걍 막는게 상책일 정도다.
하지만, SSH를 통하면 어느정도는 보안이 된 상태에서 RDP 통신이 가능하다. 어느정도는. 그냥 직접 접속하는 것보단 백배천배 낫다.
어쨌든, 하고 싶으면 따라오고, 싫으면 여기부터 안 읽고 끝내도 상관없다. 하고 싶다면, 준비물은 2가지다.

  • 게이트웨이 IP: 게이트웨이가 곧 윈도우 호스트기 때문. 윈도우에서 리눅스 localhost 접속하듯이 이런 식으로 당연히 안 되기 때문에 윈도우 호스트 IP를 알아내야 한다.
  • /etc/hosts 편집하는 스크립트와 cron 스케줄러. 왜인지 후술.

게이트웨이 IP 추출하는 방법은 이렇다.
ip route show | grep -i 'default via'| awk '{print $3 }'
그러니까, IP 정보를 가져오는데, 보통 default 에 기재되어 있고, 이 중 default via 문구 뒤에 있는 IP를 가져오면 된다. 이게 게이트웨이 IP다.
이제 이걸 활용하여 /etc/hosts 에 기록하는 스크립트를 짜보도록 하자.
먼저 sudo -i 쳐서 root 계정으로 들어간 뒤, 적당히 gatehost.sh 파일명을 쓰도록 하고 내용은 아래를 넣는다.

#!/bin/bash

IP=$(ip route show | grep -i 'default via'| awk '{print $3 }')
HOST="gateway"

if cat /etc/hosts | fgrep -q "$HOST"
        then sed -i "/$HOST/ s/.*/$IP\t$HOST/g" /etc/hosts
        else echo >> /etc/hosts; echo "$IP\t$HOST" >> /etc/hosts; echo >> /etc/hosts
fi

실행 권한을 위해 chmod +x gatehost.sh 치면 준비 끝.
왠만하면 한 번만 실행하면 되는데, cron으로 등록해야 한다. 왜냐면, WSL 은 프로세스 시작할 때마다 localhost 리디렉션을 위해 상시 /etc/hosts 파일을 초기화한다. 이 때, 기존 내용은 증발하기 때문에, 만약 고정 호스트를 등록하고 싶으면 번거롭게 매번 등록해야 한다. 물론, localhost 리디렉션 포기하는 불편함을 감수하고 /etc/wsl.conf 파일에

[network]
generateHosts = false

이 내용 넣으면 되는데, 살짝 드문 일이긴 하지만 컴퓨터명 바꾸면 알아서 대처해야 한다. 이건 존중이니 취향해 드리겠다.
다시 본론으로 넘어가서, 기능 기본값 그대로 사용하겠다는 사용자 기준으로 계속하겠다.
crontab -e 쳐서 스케줄러 편집으로 들어가서,
*/5 * * * * /root/gatehost.sh
넣으면 된다. 끝. 그러면 호스트 IP는 IP 칠 필요 없이 gateway 로 접속하면 된다.
따라서 SSH 접속시 RDP 터널링을 위해,

# -L 뒤에 숫자에 원하는 포트 지정하면 된다. 33389를 예로 든다.
ssh -L33389:gateway:3389 usernane@external.sshexample.com

이런 식으로 SSH 접속 후 원격 데스크탑으로 localhost:33389 이런 식으로 터널링한 IP 들어가서, 호스트 윈도우 서버에 사용자와 비밀번호 입력 후 접속되면 성공이다.

마지막으로 아까 포트포워딩 파워쉘 스크립트에 시작 스크립트랍시고 넣은 곳에 wsl sudo service cron start 문구를 확인하고 없으면 추가하면 완벽한 환경이 되겠다.

끝이다. 수고들 많았다.

끝으로

초기에 한 번 고생해서 이제 윈도우 서버에 리눅스 세팅하고 외부 SSH 오픈해서 선택적으로 호스트 윈도우 RDP를 터널링까지 해서 완벽한 서버 역할을 구축하였다.
당연하겠지만, 이 팁은 윈도우 서버를 실제 운영하는 서비스가 아닌, 워크스테이션이나 개발 서버 용도로 활용하고자 하는 사용자 및 관리자에게 추천하는 환경이다. WSL은 네이티브 리눅스보다 당연히 느린데, 심지어 기존 Hyper-V 보다도 성능이 떨어진다. 게다가 일반적인 리눅스보다 언제 뻑나갈지도 모르기 때문에 불안정하다. 프로세스가 언제 죽어서 아예 리눅스가 셧다운될 지 모를 일이하는 거다.
만약 실제 서버스로 이고생을 했다면, 윈도우 서버 라이선스 비용으로 헛짓거리 한 셈이 되니, 리눅스 구축할 거면, 다른 물리적 서버나, 클라우드, 하다못해 Hyper-V 라도 구축해서 서비스하기 바란다. 참고로 Essential 에디션은 1개, Standard 에디션은 4개, Datacenter 에디션은 무한개의 라이선스를 별도 라이선스 비용 없이 사용권을 제공한다.
(내가 직접 윈도우 서버 운영했을 시점 기준으로 현재 갱신될 수도 있으니 직접 라이선스 문서 확인 바람)

그럼 이제 다시 즐거운 윈도우 서버 라이프를 즐기기 바란다. 이제 하이퍼브이가 좋아지고 IIS가 쓰레기 됐다 시발 마소 씹쌔끼들... ARR 개구림.

profile
지옥에서 온 개발자

0개의 댓글