리눅스에서의 원격접속

리눅스에서의 원격접속

본 포스팅에서 다루는 원격접속의 구분

리눅스 환경에서 생활하다보면 원격접속이 필요한 경우가 자주 발생한다. 본 포스팅에서는 리눅스 GUI와 리눅스 CLI, 그리고 윈도우 사이의 원격 접속에 대해서 다루고자 한다. 이때, 상업용 소프트웨어(teamViewer, chrome remote desktop, anydesk)를 사용한 방식은 제외하고 오로지 오픈소스 진영에서 사용 가능한 방식만을 그 대상으로 한다. (개인적으로 상업용 원격 접속 소프트웨어들은 느리며 보안 측면에서도 신뢰할 수 없다고 생각한다.)

원격접속을 하는 경우를 분류해보면 다음과 같다.

  1. 리눅스 GUI/CLI, 윈도우 → 리눅스 CLI : SSH 사용
  2. 리눅스 GUI, 윈도우 → 리눅스 GUI : VNC+SSH tunneling 사용
  3. 리눅스 GUI, 윈도우 → 윈도우 : RDP 사용

분류 1. 리눅스 GUI/CLI, 윈도우 → 리눅스 CLI : SSH 사용

개요

GUI가 없는 서버를 관리할 때 사용하는 방식으로, 터미널 환경에서 서버를 관리하거나 코딩을 할 때 사용하는 방식이다. 이 경우 원격접속은 간단하게 ssh을 사용하면 된다. vscode를 사용한다면 ssh extension을 통해 로컬 directory에서 코딩하는 것처럼 작업이 가능하다.

Server 설정

ssh을 사용하기 위해서는 접속하려는 기기(서버)에 다음처럼 서버 설정이 필요하다.

  1. ssh 포트(default = 22)에 대한 접속이 공유기와 방화벽에서 허용되어 있어야 한다.
  2. ssh server daemon(sshd)이 작동(active)상태여야 한다.
  3. ssh configuration 파일 내에서 접속에 사용할 사용자에 대한 ssh 접근을 허용된 상태여야 한다.

자세한 서버 설정 방법은 여기 를 참고하자.

Client 설정

SSH을 쓰려면 SSH client가 설치되어 있어야 한다. 보통 윈도우와 Mac, 리눅스 모두 SSH clinet를 내장하고 있다. 리눅스는 경우에 따라 없기도 한데, 이 경우에는 openSSH 패키지 를 설치하면 된다.

SSH 사용법

bash
ssh -p <PORT> <USER_ID>@<SERVER_IP>

ssh은 위와 같은 코드로 사용한다. 여기서 -p는 port 번호를 입력하는 옵션이다. 리눅스는 터미널에서, 윈도우는 cmd나 powershell 혹은 putty 등 ssh 프로그램에서 이를 입력하면 된다. 입력하면 해당 계정의 비밀번호 입력을 요청하는데, 이를 입력하면 서버의 터미널로 연결된다.

연결된 상태가 되면 프롬프트(will@archlinux와 같은 부분)의 형태와 색상이 바뀌는 것을 알 수 있다.

원격 서버에 ssh로 연결된 터미널
원격 서버에 ssh로 연결된 터미널

분류 2. 리눅스 GUI, 윈도우 → 리눅스 GUI : VNC+SSH tunneling 사용

개요

일반적으로 리눅스 GUI(그러니까 리눅스의 x환경)에 원격접속하는 경우는 잘 없을 것 같다. 웬만한 작업은 1)에서 다룬 ssh를 통해 처리할 수 있기 때문이다. GUI 환경을 원격으로 사용해야 한다면 리눅스 환경으로 넘어가는 것을 고려하면서 일단 리눅스를 맛보려는 사람들이지 않을까 생각된다.

리눅스 GUI로의 연결에 사용하는 두 가지 프로토콜은 VNC와 RDP가 있다. 이들 중 RDP는 마이크로소프트에서 개발한 프로토콜이지만 리눅스 환경에서도 Xrdp 등의 패키지를 통해 사용이 가능하다. 그러나 필자가 사용해본 경험이 없기에 여기서는 VNC를 사용한 방식만을 설명한다. VNC 또한 다양한 패키지를 사용할 수 있지만 여기서는 tigerVNC를 사용한 방식만 설명한다.

Server 설정

아마 원격으로 리눅스를 찍먹하려는 사람들이 리눅스 GUI 환경에 원격으로 접속을 할텐데, 서버(리눅스 GUI) 단 설정 절차가 꽤나 복잡한 편이다. 일단 순차적으로 해야할 것들을 작성을 하긴 할텐데, 각 작업들을 수행하기 위해 아치위키 등 메뉴얼을 잘 따라가야할 것 같다.

Step. 1 tigerVNC를 설치하고, 초기설정을 수행하고, tigerVNC 데몬을 실행한다.

공식 repo의 tigerVNC를 설치한다.(가장 쉬운 부분) 그리고 이어서 초기 설정을 수행해야 한다. 초기설정은 1) vncpasswd를 통한 비밀번호 생성, 2)vncserver의 사용자 설정, 3)session config 파일 생성 순서로 수행한다. 자세한 절차는 아치위키의 initial setup 부분 을 따라하면 된다.

다음으로 데몬을 start/enable 해준다. 앞서 2)vncserver의 사용자 설정에서 1번 user를 등록해줬다면 여기서는 @:1과 같이 사용자 1로 표기된 서비스 데몬을 실행해줘야 한다.

bash
sudo systemctl enable vncserver@:1.service
sudo systemctl start vncserver@:1.service

Step. 2 SSH 접속이 가능하도록 SSH 서버 설정을 한다.

의문이 든다. 왜 VNC를 하다말고 ssh를 설정하는가? 다 이유가 있다. VNC 프로토콜은 안타깝게도 자체적으로는 암호화 기능이 없기 때문에 client에게 평문의 형태로 화면을 전송한다. 이런 특성 때문에 앞서 Step 1의 3)session config을 설정할 때 localhost로 작성을 한 것이고, 이것이 VNC의 default이다.

어쩔 수 없이, 우리는 VNC 자체가 갖추지 못한 암호화 기능을 ssh tunneling 을 통해 보완하여 사용한다. 서버가 있는 pc에 ssh tunneling을 통해 패킷을 전송하는데 사용할 터널을 열어놓고, 그 터널을 통해 VNC 패킷들을 전송받도록 한다. SSH Tunneling을 사용할 경우, ssh port를 통해 해당 pc 내부에서(그러니까 localhost에서) 접속하는 것 같은 효과가 있기 때문에 config에서 localhost로 설정했음에도 VNC를 사용할 수 있게 된다.

자세한 ssh 서버 설정은 분류 1. 리눅스 GUI/CLI, 윈도우 → 리눅스 CLI : SSH 사용을 참고하자.

Client 설정

Client 단에서 설정도 ssh tunneling을 위해 조금 까다로울 수 있다. SSH tunneling을 사용하는 방식은 두 가지로 구분할 수 있다.

  1. 터미널을 통해 터널을 열고 터미널창을 열어두는 방식
  2. 터미널을 별도로 열어두지 않고, remmina 자체에 내장된 SSH tunneling을 사용하는 방식

두 방식 모두 터널링을 사용하기는 하지만 tunneling 터미널을 열어두느냐 아니면 내장된 tunneling 기능을 사용하느냐의 차이 뿐이다.

Case 1. 터미널을 통해 터널을 열고 터미널창을 열어두는 방식

터미널을 연다. 그리고 다음처럼 코드를 쓴다. (아래 코드에서 <…>로 표기된 부분은 괄호 통째로 제거 후 개인의 환경에 맞게 수정하여 사용하면 된다.)

bash
ssh -p <SSH PORT NO.> -L <SERVER USER>@<VNC SERVER IP> <CLIENT단에서 VNC로 연결할때 사용할 PORT NO.>:localhost:<SERVER의 사용자에 맞는 VNC PORT, 여기선 5901>

코드가 길어서 예시를 봐야 이해가 될 것 같다. 다음의 예시에서는 ssh port 번호는 2222, server의 user는 will, VNC server ip는 192.168.122.35, client에서 VNC 접속에 사용할 port 번호는 8241, 서버 사용자 1의 VNC port 번호인 5901을 사용하고 있다.

bash
ssh -p 2222 -L 8241:localhost:5901 will@192.168.122.35

이렇게 입력을 하면 비밀번호를 요구한다. 비밀번호를 입력해주자. 그러면 ssh tunneling이 된 터미널이 만들어졌다. 이 창을 끄지 않은 상태로 원격접속에 사용할 VNC client 프로그램을 통해 VNC 연결을 하면 된다.

여기선 오픈소스 프로젝트인 remmina 를 사용한다. remmina를 활용하기 위해 패키지 매니저를 통해 remmina와 libvncserver를 설치해야 한다. 설치 후 remmina의 새 연결에서 프로토콜은 Remmina VNC Plugin으로 선택하고 다음의 이미지처럼 Server, Username, User password 부분을 작성한다.

Remmina에서 설정할 네가지 항목: Protocol, Server, Username, User password
Remmina에서 설정할 네가지 항목: Protocol, Server, Username, User password
  • server는 터널로 연결된 상태이므로 localhost로, 그 포트는 앞서 터널에서 접속에 사용할 port로 지정한 8241을 입력한다.
  • User는 앞서 VNC 사용자 1번으로 등록한 계정명을 입력한다.
  • User password는 vncpasswd를 통해 생성한 비밀번호를 입력한다. (계정의 비밀번호가 아니다)

그러면 다음처럼 ssh tunnel을 통해 VNC가 잘 연결되는 것을 볼 수있다.

좌) Remmina VNC로 연결된 원격 linux pc, 우) ssh tunneling을 위해 열어둔 터미널
좌) Remmina VNC로 연결된 원격 linux pc, 우) ssh tunneling을 위해 열어둔 터미널

Case 2. Remmina에서 ssh tunneling 통합 기능을 활용한 방식

Case 1은 터미널을 열어둔 채로 사용해야 한다는 점이 어찌보면 조금은 신경이 쓰이고 깔끔하지 않은 느낌이 난다. 다행히 remmina에는 자체적으로 VNC에 ssh tunneling까지 함께 수행하는 기능을 갖추고 있다. 앞서 설정과 조금은 다른 점이 있을 수 있다.

먼저 Basic 탭을 설정한다. 여기서 설정할 사항은 Protocl, Server, User password이다.

  • Protocol은 동일하게 VNC로 설정한다.
  • Server는 아까와 달리 서버의 localhost:VNC 포트 번호를 입력해준다. 예시에서는 localhost:5901이다.
  • User password는 vncpasswd를 통해 생성한 비밀번호를 입력한다. (계정의 비밀번호가 아니다.)
Basic 탭 설정 항목
Basic 탭 설정 항목

다음으로 SSH Tunnel 탭을 설정한다. 여기서 설정할 사항은 Custom과 Authentication type, Username, Password이다.

  • Custom은 <VNC 서버의 ip>:<VNC 서버의 ssh 포트 번호>로, 여기서는 192.168.122.35:2222이다.
  • Authentication type은 별도로 ssh key 사용을 설정하지 않은 경우라면 Password로 선택한다.
  • Username은 ssh로 접속하는 서버의 계정으로, 여기서는 will이다.
  • Password는 ssh로 접속하는 계정의 비밀번호를 입력해준다.
SSH Tunnel 탭 설정 항목
SSH Tunnel 탭 설정 항목

그러면 다음처럼 터널이 연결된 터미널이 없더라도 VNC가 연결이 된다.

SSH tunnel 터미널이 열리지 않은 상태에서도 VNC 연결이 된 모습
SSH tunnel 터미널이 열리지 않은 상태에서도 VNC 연결이 된 모습

분류 3. 리눅스 GUI, 윈도우 → 윈도우 : RDP 사용

개요 : 한국에서 리눅스 유저로 살기

아마, 한국의 리눅스 native 사용자들이 반드시 숙지하고 있어야 할 원격접속 유형이 아닐까 생각한다. 한국에서 직장생활을 한다면 리눅스 유저로써 피할 수 없는 상황들이 있다.

  1. 카톡으로 개인 연락 혹은 업무 연락
  2. 한글 프로그램으로 공문 송수신, 보고서 작성
  3. MS office 프로그램으로 공문 송수신, 보고서 작성
  4. 은행업무를 pc로 처리

하나같이 navtive linux 환경에서는 사용할 수 없는 것들이다.

물론, MS는 office365를 구독할 경우 웹에서 어느정도 수준까지는 문서작업이 가능하고, 한글 또한 웹 버전을 무료로 사용할 수 있긴 하다. 그러나, office365는 치사하게도 일부 기능들(예를들면, ppt의 슬라이드 마스터 기능)은 웹에서 사용이 안된다. 한글의 경우는 웹 버전에서 파일을 수정할 경우, 원본파일 자체가 한글의 클라우드 서비스 상에 저장되어 회사 업무를 수행할 때 찝찝기도 하고 리눅스 한글 입력기와 호환성이 안좋은지 입력이 안되거나 오입력이 되는 경우가 잦은데 오류를 보고했음에도 몇년 째 해결되고 있지 않다. (리눅스 사용자는 소수라서 어쩔 수 없나보다.)

이럴 때 리눅스 환경에서 우리가 사용할 수 있는 방법은 두 가지다. 1)windows pc를 하나 켜놓고 필요할 때 원격접속하여 사용하거나 2)windows를 듀얼부팅하여 필요 서류작업이 있을 때만 사용한다.

2)는 간단하게 ssd 하나를 추가하고 여기를 windows에 통째로 설치하여 부팅 시 선택하여 윈도우로 진입할 수 있도록 하는 방식이다. 이 방법은 리눅스 입문자들이 가장 많이 사용하는 방법이기도 하다. 필자도 처음에는 이 방법을 사용했다. 게임을 할 때나 서류작업을 해야할 때 windows로 부팅하여 이를 처리하는 것이다.

그러나 이 방법은 리눅스에 익숙해지다보면 불편해지는 시점이 도래한다. 매번 껐다켰다하는 것 자체가 귀찮아지고 리눅스에 있는 파일들을 윈도우와 공유하기 위한 방법(usb를 쓴다거나 ntfs로 포멧된 hdd를 둔다거나 하는 등…)을 사용하는 것도 번거롭다. 마치 리눅스에서 사용하는 것처럼 매끄럽게 위의 작업들을 수행하고 싶다는 욕구가 생긴다. 그때 우리는 1)의 방식을 찾게 된다.

1)을 위해서는 windows pc가 한 대 있어야 한다. 물리적으로도 좋고 가상으로 만들어도 좋다 . 필자는 굴리고 있는 서버에 가상으로 윈도우 pc를 생성해두고 리소스를 최소한만 할당하여 사용하고 있다.

Server 설정

여기서 server는 windows pc가 된다. (가상이든 물리적인 pc든 상관없다.) 서버는 다음과 같은 설정이 필요하다.

  1. windows 10/11의 pro 버전이 설치되어 있을 것.
  2. 원격 데스크톱 활성화
  3. password가 설정되어 있을 것

windows 10/11의 pro 버전이 설치되어 있을 것.

윈도우 홈버전은 공식적으로는 원격 데스크톱 사용이 안된다. 그래서 원격 데스크톱 설정 자체가 안된다. 그러나 구글링을 해보면 홈버전으로도 사용이 가능하게 만드는 방법들이 존재하는 것 같다. 필자는 pro 버전을 사용하고 있기에 이 부분은 생략한다.

원격 데스크톱 활성화

윈도우 설정에서 원격 데스크톱의 활성화는 설정의 검색창에서 원격 데스크톱 설정으로 검색하면 아래의 이미지와 같은 설정 페이지로 들어갈 수 있다. 여기서 활성화 해준다.

password가 설정되어 있을 것

password 설정은 로그인 때 비밀번호를 이미 사용하고 있다면 별도로 할 필요가 없다. 그러나 비밀번호를 사용하고 있지 않다면 계정 설정에서 비밀번호를 설정해준다. 이 비밀번호는 remmina에서 원격으로 접속할 때 사용된다.

Client 설정

지금까지 설명한 client 설정 중 가장 쉽다. 그냥 remmina에서 RDP 프로토콜을 선택한다. 여기서 Server, Username, Password를 작성한다. Server는 windows pc의 ip주소, Username/Password는 윈도우의 사용자명과 비밀번호를 입력해준다. 그러면 바로 윈도우로 연결된 창이 뜨게된다. Remmina로 연결된 윈도우 PC는 원격 PC라고 생각이 들지 않을 만큼 충분히 빠른, 쾌적환 환경을 제공해준다. 이는 RDP 자체의 특성 때문일 것이라 생각된다.

좌)연결된 윈도우 화면, 우)Remmina에서 설정해야할 항목의 위치
좌)연결된 윈도우 화면, 우)Remmina에서 설정해야할 항목의 위치

추가로, 필자가 remmina의 RDP 원격접속을 애정하는 이유는, 설정에 있는 Share folder를 설정함으로써 리눅스의 로컬 폴더를 윈도우의 원격 연결된 폴더로 연결시킬 수 있다는 점 때문이다. 윈도우에서만 작업이 가능한 문서들을 이 폴더를 통해 공유하며 작업을 처리할 수도 있고 카카오톡으로 공유하고 공유받은 파일을 이 폴더를 통해 전달할 수 있다.

Share folder 설정
Share folder 설정

포스팅을 마무리하며

상당히 긴 글이 된 것 같다. 이 글 하나로 리눅스에서 필요한 웬만한 원격접속 케이스는 다 할 수 있을 것이라 생각된다. 많은 사람들에게 도움이 되었으면 좋겠다.

Last updated on