Computer >> 컴퓨터 >  >> 시스템 >> Linux

역방향 SSH 터널로 PC에 대한 외부 연결을 허용하는 방법

역방향 SSH 터널로 PC에 대한 외부 연결을 허용하는 방법

인터넷 서비스 제공업체(ISP)에서 전용(고정) IP 주소를 받아 사용하고 있다면 라우터에 몇 가지 포트 포워딩 규칙만 추가해도 홈 서버를 구축해 인터넷에 공개할 수 있습니다. 하지만 ISP가 여러 이웃과 IP를 공유하게 하는 경우라면 포트 포워딩은 소용이 없습니다. 아예 방화벽 규칙으로 외부에서 들어오는 연결 자체를 차단하는 업체도 있습니다.

이런 제약은 가상 사설 서버(VPS)를 활용하면 모두 우회할 수 있습니다. 네트워크 트래픽을 중계하는 역할만 하면 되기 때문에 RAM이 512MB 미만인 저사양 서버도 충분하며, CPU와 메모리 부담도 거의 없습니다. VPS가 들어오는 연결을 받아 '역방향 SSH 터널(reverse SSH tunnel)'이라는 방식으로 내 컴퓨터로 전달해 주는 것입니다. 이렇게 하면 월 몇 달러 수준의 적은 비용으로 어떤 종류의 홈 서버든 운영할 수 있습니다.

예를 들어 파일 업로드 및 동기화를 위한 NextCloud 서버를 만든다고 생각해 보세요. 파일이 집에 있는 서버에 저장되므로 프라이버시가 보장되고, 6TB 하드디스크를 장착해 원하는 만큼의 용량도 확보할 수 있습니다. 부담해야 할 비용은 월 전기요금과 월 5달러 미만의 VPS 요금뿐입니다. 6TB 스토리지를 제공하는 클라우드 서비스의 월 요금보다 훨씬 저렴합니다.

참고: 이 방법은 TCP 네트워크 트래픽 중계에만 동작합니다. TCP는 웹 서버(80/tcp) 등에서 사용되며, UDP는 일부 게임 서버(예: 카운터 스트라이크, 27015/UDP)에서 사용됩니다. UDP 터널링도 일종의 '트릭'을 쓰면 가능하지만, 이는 별도의 튜토리얼에서 다룰 주제입니다.

윈도우 10에는 이제 기본 SSH 클라이언트가 내장되어 있습니다

SSH 연결을 시작하기 위해 더 이상 PuTTY를 사용할 필요가 없습니다. 실제로 이 튜토리얼에서는 윈도우 10에 내장된 OpenSSH 클라이언트를 그대로 사용해 터널을 구성합니다. 내장 클라이언트가 익숙하지 않다면 관련 튜토리얼을 먼저 참고하세요.

연결을 중계할 가상 사설 서버 준비하기

DigitalOcean, Linode, Vultr 등 선호하는 업체에서 가상 사설 서버를 생성합니다. 가장 중요한 것은 네트워크 지연(latency)을 최소화하기 위해 최대한 가까운 리전에 서버를 두는 것입니다. 또한 root 계정으로 바로 로그인할 수 있게 설정하는 것이 좋으며, 가능하면 SSH 키 인증을 사용하세요. 보안상 더 안전할 뿐 아니라, 1024번 미만의 포트(특권 포트)에서 연결을 수신하려면 root 권한이 필요하기 때문입니다.

명령 프롬프트(리눅스라면 터미널)를 열고 SSH로 서버에 접속합니다.

OpenSSH 서버 설정 파일을 편집합니다:

nano /etc/ssh/sshd_config

root가 아닌 일반 사용자로 로그인했다면 파일을 저장할 수 없으므로 다음 명령을 사용해야 합니다:

sudo nano /etc/ssh/sshd_config

아래로 스크롤해 'GatewayPorts' 항목을 찾습니다. #GatewayPorts no처럼 되어 있을 텐데, 앞의 '#'을 삭제해 주석을 해제하고 GatewayPorts yes로 변경합니다.

역방향 SSH 터널로 PC에 대한 외부 연결을 허용하는 방법

해당 항목이 없다면 파일 맨 아래에 직접 추가하면 됩니다:

GatewayPorts yes

Ctrl + X를 누른 후 y, 마지막으로 Enter를 눌러 파일을 저장합니다.

새 설정이 적용되도록 SSH 데몬을 재시작합니다.

systemctl reload ssh.service

SSH 세션에서 빠져나옵니다.

exit

역방향 SSH 터널 설정 방법

명령어 매개변수는 리눅스, 윈도우, BSD 등 어느 운영체제에서나 동일합니다. 기본 문법은 다음과 같습니다:

ssh -R remote_port:host:localport your_username@IP-of-server
  • remote_port: 서버가 해당 포트로 들어오는 연결을 중계하도록 지정합니다.
  • host: 연결을 전달할 대상 IP 주소입니다. 여기서는 자신의 컴퓨터로 전달하기 위해 127.0.0.1을 사용합니다.
  • localport: 데이터 패킷을 전달할 로컬 포트 번호입니다. 로컬 컴퓨터에서 실행 중인 애플리케이션이 수신 대기 중인 포트를 입력하면 됩니다.

예를 들어 서버의 80번 포트로 들어오는 모든 연결을 로컬 컴퓨터의 8080번 포트로 전달하려면 다음과 같이 입력합니다:

ssh -R 80:127.0.0.1:8080 root@203.0.113.1

이 명령은 로컬 머신에서 Apache나 Nginx 같은 웹 서버가 8080번 포트에서 수신 대기 중이라고 가정한 것입니다. 만약 Apache/Nginx가 기본 포트인 80번을 사용한다면, 앞의 명령에서 같은 포트 번호를 두 번 써도 전혀 문제없습니다(두 포트는 서로 다른 서버의 포트이기 때문입니다).

ssh -R 80:127.0.0.1:80 root@203.0.113.1

이제 누군가 브라우저 주소창에 가상 사설 서버의 IP 주소를 입력하면, 그 연결이 중계되어 여러분의 로컬 컴퓨터가 응답하게 됩니다.

역방향 SSH 터널로 PC에 대한 외부 연결을 허용하는 방법

위 이미지에서는 기본적으로 8887번 포트에서 수신 대기하는 크롬용 간단한 웹 서버 앱을 사용했습니다. 해당 앱을 설치하고 이미지와 같은 명령을 실행하면 직접 테스트해 볼 수 있습니다.

주의할 점은 터널을 유지하려면 SSH 세션이 계속 열려 있어야 한다는 것입니다. 터널을 닫으려면 터미널/명령 프롬프트 창에 exit를 입력하면 됩니다.

마무리

보시다시피 역방향 SSH 터널을 만드는 것은 어렵지 않지만, 웹사이트를 안전하게 보호하는 일은 그만큼 까다롭습니다. 따라서 로컬 NextCloud 서버 같은 아이디어를 실제로 구현할 계획이라면 최소한 가상 머신 안에 격리해서 운영하세요. 그래야 웹사이트가 해킹당하더라도 나머지 운영체제는 피해를 입지 않습니다.

그리고 잊지 마세요. 잃으면 곤란한 데이터는 언제나 백업해 두는 것이 최선입니다!