이 글에서는 Windows 10에 기본 탑재된 OpenSSH 서버를 활용해 SSH 터널을 통해 포트를 포워딩하는 방법을 소개합니다. SSH 포트 포워딩을 사용하면 로컬 컴퓨터의 애플리케이션 포트를 원격 서버로 전달하거나, 그 반대 방향으로도 터널링할 수 있습니다. 예전에는 Linux/Unix 환경에서만 사용할 수 있었던 SSH 터널링이지만, 이제는 Windows 10/Windows Server 2016 이상에서도 손쉽게 활용할 수 있습니다. 여기서는 Windows 환경에서 SSH 터널(TCP 포트 22)을 통해 RDP 연결을 설정하는 실제 사례를 다룹니다.
SSH 터널링은 주로 방화벽 뒤에 있는 원격 컴퓨터에 접속해야 하는 상황에서 유용하게 사용됩니다. 예를 들어, Windows Server의 SSH 포트(TCP 22)만 열려 있고 나머지 모든 포트가 하드웨어 방화벽이나 Windows 방화벽에 의해 차단되어 있다고 가정해 보겠습니다. 원격 데스크톱 포트인 3389가 막혀 있기 때문에 RDP 클라이언트로 직접 접속하는 것은 불가능해 보입니다. 하지만 SSH 터널을 통한 포트 포워딩 기법을 활용하면 이 문제를 해결할 수 있습니다.
SSH 터널링의 대표적인 활용 시나리오는 다음과 같습니다.
- 로컬 TCP 포워딩(Local TCP Forwarding): 로컬 포트를 원격 서버로 전달하는 방식
- 원격 TCP 포워딩(Remote TCP Forwarding): 원격 포트를 로컬 컴퓨터로 전달하는 방식
- 이중 SSH 터널(Double SSH Tunnel): 공인 IP가 없는 NAT 뒤의 컴퓨터들을 SSH 서버를 경유해 연결하는 방식(OpenVPN을 적용할 수 없는 경우에 유용)
SSH 터널을 통한 RDP 접속 (로컬 TCP 포워딩)
이 모드에서는 자신의 컴퓨터에 로컬 TCP 포트를 생성하고, 해당 포트로 들어오는 모든 연결을 SSH 터널을 거쳐 원격 서버의 지정된 포트로 전달합니다. 이 예제에서는 로컬 포트 8888을 만들고, 이 포트로의 연결을 원격 Windows 컴퓨터의 RDP 포트 3389로 포워딩하겠습니다. 전체 연결 구조는 아래 그림과 같습니다.

Windows 10 1809 및 Windows Server 2019부터 기본 포함된 내장 SSH 클라이언트를 사용해 SSH 터널을 생성하려면 다음 명령어를 실행합니다.
ssh -L 8888:192.168.1.90:3389 root@192.168.1.90
SSH 터널을 백그라운드에서 동작하게 하려면 -f 옵션을 추가하면 됩니다.

SSH 터널을 통해 원격 컴퓨터의 데스크톱에 접속하려면 RDP 클라이언트(mstsc.exe)를 사용해 자신의 컴퓨터 로컬 포트 8888로 연결하면 됩니다.
127.0.0.1:8888

원격 컴퓨터에 로그인한 후 RDP 세션에서 안전하게 작업할 수 있습니다(방화벽에서 3389 포트는 여전히 닫혀 있는 상태). TCPView 도구를 사용하면 RDP 연결이 로컬에서 시작되었음을 확인할 수 있습니다. 즉, RDP 연결은 로컬에서 실행 중인 SSH 서버에 의해 시작되는 것입니다.

참고로, 암호화되지 않은 애플리케이션 트래픽을 포워딩하는 경우에도 공용 네트워크를 통과하는 구간에서는 암호화되어 전송됩니다. 이러한 트래픽은 SSH 연결의 한쪽 끝에서 암호화되고 다른 쪽 끝에서 복호화됩니다.
또한 로컬 네트워크의 다른 컴퓨터들도 이 방식을 활용해 RDP 서버에 접속할 수 있습니다. SSH와 RDP 어느 쪽으로도 직접 연결이 허용되지 않는 경우에도 마찬가지입니다. 이를 위해서는 해당 컴퓨터들이 SSH 터널이 생성된 컴퓨터의 8888 포트로 RDP 클라이언트를 통해 접속하면 됩니다.
mstsc.exe /v 10.10.1.220:8888

원격 TCP 포워딩으로 로컬 컴퓨터 접근 허용
SSH 터널의 또 다른 활용 사례는 원격 TCP 포워딩입니다. SSH 터널을 사용하면 원격 서버가 내 컴퓨터의 로컬 포트나 로컬 네트워크에 있는 다른 컴퓨터의 포트에 접근할 수 있도록 허용할 수 있습니다. 예를 들어, 외부 서버(200.168.1.90)가 인터넷에 공개되지 않은 내부망 사이트에 접근하도록 하고 싶다고 가정해 보겠습니다. 역방향 SSH 터널을 생성하려면 다음 명령어를 사용합니다.
ssh -R 8080:internalwww:80 user@200.168.1.90
원격 SSH 서버에서 internalwww 사이트에 접근하려면 브라우저에 다음 주소만 입력하면 됩니다. https://localhost:8080
참고로 모든 Windows 버전에서는 netsh interface portproxy 명령을 사용해 포트 포워딩 규칙을 생성할 수도 있습니다.
SSH 터널을 활용하면 포트 포워딩 체인(chain)을 구성하는 것도 가능합니다. SSH 터널링을 활성화하거나 비활성화하려면 OpenSSH 설정 파일(%programdata%\ssh\sshd_config)에 다음 지시문 중 하나를 추가합니다.
AllowStreamLocalForwarding yes AllowTcpForwarding remote