이전 포스팅에서 WSL2 환경을 통해 Tensorflow GPU를 구축했습니다. 

이번 포스팅은 WSL2를 원격 서버(SSH 통신)으로 삼아 외부에서도 내부에 있는 데스크탑에서 코딩하듯이 사용하는 방법에 대해서 서술하겠습니다. 글을 읽어보면 다음과 같은 의문이 남을 수 있습니다.

 

"밖에서 코딩할 일 있으면 노트북에서 직접 하면 되지 뭐하러 원격 코딩을 해?"

👉 노트북의 성능은 한계가 있습니다. 원격 코딩의 목적은 사람에 따라 다르겠지만 이 포스팅의 경우 데스크탑의 성능을 끌어오기 위함입니다. 또한 딥러닝같이 오랜 시간 풀로드로 돌리는 경우 노트북 수명에도 문제가 발생할 수 있습니다.

 

"팀뷰어, 크롬 원격 등 편한 화면 원격 제어 프로그램이 있는데 왜 굳이 그렇게 귀찮게 해?"

👉 물론 화면 원격 제어 프로그램을 통해서 해결할 수도 있습니다. 제일 편리하니까요. 다만 화면 원격 제어 프로그램은 기본적으로 유선 랜을 쓰거나 무선을 쓴다면 네트워크 퀄리티가 상당히 좋은 환경이어야 딜레이, 화질 문제에 벗어나 쾌적하게 사용할 수 있습니다. 또한 제 아무리 네트워크 환경이 좋다해도 네이티브로 코딩하는 것만큼 스무스하지는 않습니다. 

 

 

0. 시작하기 전에...

진행에 앞서, 본 포스팅에서는 외부 접속까지 고려하고 있기에 웹에서 공유기 설정을 건드려야하는 과정이 있습니다. 제조사마다 관리자 웹 페이지가 다르므로 이 부분은 숙지하고 계시고 본인이 갖고 계신 제조사의 관리자 페이지 설명이 적힌 글을 참고하시길 바랍니다. 본 포스팅에서는 iptime 제조사의 관리자 웹 페이지를 다룹니다.

 

 

1. 공유기 설정 및 포트포워딩 설정

외부 접속이 필요없으시면 2장으로 넘어가셔도 됩니다. 또한 회사나 학교 등은 일반적으로 외부 접속이 막혀있는 구조가 많으므로 제대로 작동되지 않을 수 있습니다.

이 포스팅을 검색해서 들어오시는 분들이라면 어느정도 네트워크 지식이 있을 것으로 예상되지만 모르시거나 까먹으신 분들도 계실거라 생각되어 이 장과 관련된 네트워크 지식에 대해서 얘기해보도록 하겠습니다. * 제가 네트워크 전문가 아니기에 전문적인 설명을 하지는 못합니다. 따라서 외부접속 설정에 필요한 매우 기본적인 네트워크 지식만 작성했습니다.

 

네트워크 구성이 다음과 같이 되어있다고 가정하겠습니다. 통신사에서 제공한 모뎀이 있고 이 모뎀을 연결한 공유기가 있고, A 공유기에 물린 수많은 전자기기들이 있습니다. 외부에서 제 데스크탑으로 접속하려면 어떻게 해야할까요?외부 IP가 111.222.333.444니까, 단순히 111.222.333.444의 원격 서버로 보내줘! 라고 요청하면 되는걸까요? 아닙니다. 111.222.333.444 IP 안에는 무수히 많은 전자기기들이 있습니다. 원격 서버가 여러 개가 존재할 수도 있죠. 따라서 이를 구분해주거나 우선순위를 매겨야 할 필요성이 있습니다.

구분해주는 방법은 다양하게 있지만 기본적으로 포트 번호로 할 수 있습니다. 포트번호는 'IP주소:포트번호'로로 주소를 구성합니다. 가령 http의 포트번호는 일반적으로 80을 사용합니다.

예를 들어봅시다. 네이버의 ip주소는 223.130.195.200 입니다.(명령 프롬프트에서 ping www.naver.com을 치시면 IP 주소를 확인 하실 수 있습니다.) 223.130.195.200을 주소창에 입력하면 네이버로 들어갑니다. 또한 223.130.195.200:80을 주소창에 입력하면 마찬가지로 네이버로 들어갑니다. 포트번호 80 대신 다른 숫자를 넣으면 들어가지지 않습니다. 

 

다음으로 모뎀, 공유기에서 데이터를 포워딩(전달)할 때 포트별로 우선순위를 매기는 방법이 있습니다. 만약 111.222.333.444:22 주소에 접근하면 데스크탑으로 포워딩 해달라고 모뎀, 공유기에게 요청하고 싶습니다. 이럴때 사용하는 방법은 DMZ, 포트포워딩이 있습니다. DMZ는 모든 포트번호에 대해서 입력한 IP 주소로 전달하라는 의미입니다. 반면 포트포워딩은 특정 포트번호에 대해서만 입력한 IP 주소로 전달하라는 의미입니다. 참고로, DMZ와 포트포워딩이 모두 입력된 포트의 경우 포트포워딩의 우선순위가 높습니다. 가령 100번 포트에 대해서 DMZ는 노트북에, 포트포워딩은 데스크탑으로 등록해두었다면 포트포워딩으로 설정된 데스크탑이 우선순위를 갖게 됩니다. 그리고 DMZ는 모든 포트가 외부에 노출되므로 보안에 매우 취약하여 추천하지 않습니다.

하지만 여전히 해결해야 할 문제가 있습니다. 위에서 살펴본 네트워크 구성도를 보시면 통신사 모뎀과 개인 공유기, 두 단계를 거쳐 데스크탑에 도달하는 것을 확인할 수 있습니다. 개인 공유기 설정만해서는 안된다는 것이죠. 먼저 통신사 모뎀에서 개인 공유기 IP(192.128.0.5)를 2222번 포트에 대해서 포트포워딩 설정해주고, 개인 공유기에서 데스크탑 IP(192.168.0.2)를 이용해 2222번 포트에 대해서 포트포워딩을 설정해야합니다. 모뎀에서 설정하나 공유기에서 설정하나 기본적인 방식은 같으므로 공유기에서 설정하는 방식만 살펴보겠습니다.

 

  • 192.168.0.1 주소로 들어갑니다. (주소는 네트워크 환경에 따라 다를 수 있습니다.)
  • 로그인을 해야하는데 iptime의 경우 따로 설정을 안하셨다면 아이디 admin, 비밀번호 admin 입니다.
  • 로그인하고 관리도구로 들어갑니다.

  • 현재 기기의 내부 IP 주소를 확인해야합니다.
  • 고급 설정 - 네트워크 관리 - 내부 네트워크 설정으로 들어갑니다.
  • 아래 연결된 기기들이 나열되어있는데 포트포워딩으로 설정할 기기의 내부 IP를 확인할 수 있습니다.
  • 아래 예시의 경우, 192.168.0.2가 데스크탑 내부 IP주소입니다.

  • 고급 설정 - NAT/라우터 관리-포트포워드 설정으로 들어갑니다.
  • 규칙 이름은 적당히 지어주고 앞서 찾은 내부 IP 주소를 입력합니다.
    프로토콜은 TCP로 설정하고 외부 포트 2222~2222, 내부 포트 2222~2222로 값을 넣고 적용 버튼을 누른 뒤 저장합니다.
  • 기본 SSH 포트번호는 22지만 필자는 NAS 서버도 외부 접속을 허용하고 있어서 유니크한 포트번호인 2222를 선택했습니다. 다른 번호로 설정하셔도 상관없습니다.

  • 마찬가지로 모뎀에서도 적용해줍니다.
  • 모뎀의 경우에는 포트포워딩 내부 주소로 공유기의 IP 내부 주소를 입력해야합니다. 포트는 동일하게 2222로 두시면 됩니다.
  • 이러면 외부 접속을 위한 준비는 완료되었습니다.

 

 

2. WSL2에 SSH 설치 및 세팅

WSL2에서 SSH 설치하는 과정에 대해서 알아보겠습니다. WSL2 설치 방법은 이전 포스팅을 확인해주세요. Ubuntu 20.24 기준으로 작성되었습니다.

 

  • SSH 서버를 설치합니다.
sudo apt-get install openssh-server
  • 아래 명령어를 입력합니다.
sudo nano /etc/ssh/sshd_config
  • Before: 아래 사진과 같습니다.
#Port 22
...
#PasswordAuthentication no
  • After: 아래 사진과 같습니다.
  • '#'이 주석처리고 우리는 Port 번호를 바꿔야하니 주석을 지워주시고 포트 번호를 22 대신 2222로 수정합니다.
  • PasswordAuthentication도 주석을 지우고 no를 yes로 수정합니다. 이 기능을 키면 로그인 시 암호를 물어봅니다.
Port 2222
...
PasswordAuthentication yes
  • ssh 서버를 킵니다. 끄는 방법은 start 대신 stop을 입력하시면 됩니다.
sudo service ssh start
  • 혹시 오류가 난다면 아래 커맨드를 입력해 키를 생성합니다. 보안, 인증을 위해 키를 생성합니다.
sudo ssh-keygen -t rsa
sudo ssh-keygen -t dsa
  • 테스트 해봅시다. 외부 네트워크에 접속한 기기가 있다면 가장 좋습니다. 우리는 이미 하나씩은 갖고 있습니다. 바로 스마트폰입니다.
  • Wi-Fi 말고 외부 망을 사용하는 LTE, 3G로 사용하여 SSH 서버에 접속합니다. 스마트폰에서 SSH Client 앱(Terminus, xTerminal, WebSSH 등)을 설치합니다.
  • 외부 주소를 알아야하는데 공유기 관리자 웹 사이트에서도 확인이 가능하지만 더 간단한 방법은 네이버로 들어가 'ip 주소 확인'이라고 검색하면 외부 주소를 알려줍니다. 이 주소를 기억해둡시다.

  • 앱에서 SSH 서버 정보를 입력하고 접속해서 확인해봅시다. 정상적으로 접속이 된 것을 확인할 수 있습니다.

 

 

3. Windows에서 방화벽 설정 및 WSL2 포트 허용

Windows는 방화벽이란 보안 시스템이 존재하여 외부 접근을 의도적으로 막습니다. 예외를 추가하여 특정 포트의 외부 접근을 허용하게 만들수도 있습니다.

  • 검색 - Windows Defender 방화벽 - 고급 설정을 들어갑니다.
  • 인바운드 규칙을 누르고 우측에 [새 규칙...]을 누릅니다. 아래와 같이 선택하여 추가합니다.

  • 위 과정을 아웃바운드 규칙에서도 동일하게 적용하여 추가합니다. 


방화벽을 통해 외부 접근을 허용하게 만들었어도 Windows가 WSL2로 직접 포워딩해주진 않습니다. WSL은 이름 그대로 Windows Sub systems for Linux, 윈도우의 리눅스 서브 시스템이기 때문입니다. 따라서 특정 포트에 대해서 이 포트는 Windows가 아닌 Subsystem인 WSL로 전달하라고 요청을 해야합니다.

 

  • 아래와 같은 소스를 가진 *.ps1 확장자 파일을 작성합니다.
  • $ports=@(포트번호);에 앞서 설정한 포트번호로 수정해야합니다. 경로는 아무데나 두셔도 상관없습니다.
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{
  echo "The Script Exited, the ip address of WSL 2 cannot be found";
  exit;
}

$ports=@(2222);

iex "netsh interface portproxy reset";
for( $i = 0; $i -lt $ports.length; $i++ ){
  $port = $ports[$i];
  iex "netsh interface portproxy add v4tov4 listenport=$port connectport=$port connectaddress=$remoteport";
}
iex "netsh interface portproxy show v4tov4";
  • Windows PowerShell을 관리자 권한으로 실행시킵니다.
  • 소스를 저장한 폴더로 들어가 아래 커맨드를 입력합니다.
PowerShell.exe -ExecutionPolicy Bypass -File .\wsl2_port.ps1

 

 

4. VSCode로 SSH 원격 코딩 테스트

  • VSCode 좌측 메뉴에 Extensions에서 ssh를 검색해 Remote - SSH를 설치합니다.

 

  • Ctrl+Shift+P를 입력하고 SSH를 검색합니다.
  • [Remote-SSH:Connect to Host...]를 선택합니다.
  • [Configure SSH Hosts...] 를 선택합니다.
  • C:\Users\[사용자 이름]\.ssh\config를 선택합니다.

  • 아래와 같이 수정합니다. IP 주소와 포트 번호는 자신이 앞서 설정한대로 입력해줍니다. User는 WSL2 Linux에서 사용하는 사용자 이름을 입력해야합니다.
Host june@115.XXX.XXX.XXX:2222
    HostName 115.XXX.XXX.XXX
    User june
    Port 2222
  • Ctrl+Shift+P를 눌러 [Remote-SSH:Connect to Host...]에 다시 들어가면 사용자 이름@IP주소:포트번호 형태로 선택지가 생깁니다. 더블클릭하여 들어갑니다.

  • 원격 접속된 것을 확인할 수 있습니다.
  • Linux를 선택하고, Handprint? Handfinger? 어쩌고 나오는데 실수로 바로 넘겨버려서 사진이 없습니다. 아무튼 대충 엔터 눌러서 넘어가시고 비밀번호를 입력합니다.

  • 그럼 서버로 접속이 완료됩니다. 좌측에 보면 폴더에 진입하지 않아 소스를 쓸수가 없습니다.
  • Open Folder 버튼을 눌러 서버 폴더로 진입할 수 있습니다. 적당한 폴더로 들어가 소스를 작성해봅시다.
  • 이전 포스팅에서 작성한 Projects 폴더의 소스를 테스트해보겠습니다.

  • 아래와 같이 정상적으로 잘 동작함을 확인할 수 있습니다.
  • 이렇게 원격 코딩 환경이 완료되었습니다. 이제 어디서든 데스크탑의 리소스를 사용해 코딩을 할 수 있습니다.

 

 

작성일자: 2023-06-25

+ Recent posts