RDP 연결을 direct로 하지 않고 ssh 터널을 통해 연결하는 방법에 대한 내용이다.

목적

  • 보안 강화
    1) ssh 터널 통과로 인한 패킷 암호화
    2) rdp 포트 미노출
    3) administrator와 같은 관리자 계정 미노출
    ** 아래 내용 중 optional 부분을 적용하면 보안성이 강화됨


Server and Client 정보

  • RDP Server : Windows 2016 Server
  • RDP Client : Windows 10
    ** RDP 서버 클라이언트는 RDP가 지원되면 어떤 Windows 버전이든 상관 없음


연결 구성

연결도

RDP Port 번호 변경

where: rdp 서버에서

기존 3389에서 다른 포트 번호로 변경하기 (optional)
[참고] 원격 데스크톱 포트(3389) 변경하기

1. 레지스트리 수정

  • 윈도우 시작 – 실행 – regedit
    HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlTerminal ServerWdsrdpwdTdstcp

    -> 3389에서 3355로 변경

2. 서비스 관리자에서 Remote Desktop Services (재시작)

  • cmd 창에서 아래 명령으로 확인시 3355로 변경되었을을 확인할 수 있다.
    > netstat -an | findstr 3355

3. 방화벽 설정

  • 절차 :
    설정 – 방화벽 – 고급설정 – 인바운드 규칙 – 새 규칙 – 포트 – TCP/특정로컬포트: 3355 – 연결 허용 – 도메인/개인/공용 모두체크 – 이름: rdp – 마침
  • 본인은 3355 포트로 변경하였다.


OpenSSH 설치

where: rdp 서버에서

  • Windows 2016 Server는 sshd를 별도로 설치해 줘야한다.
  • Windows 10(2019년 이후 패치버전), Windows 2019 Server 의 경우에는 자체 내장된 sshd를 기능 추가해서 사용하면 된다.

1. 다운로드
OpenSSH for Windows 다운로드

2. 설치하기
OpenSSH Install on Win2016

3. 포트 변경하기

  • 기본포트 22에서 다른 포트로 변경한다 (Optional)
    > C:Program FilesOpenSSH-Win64sshd_config_default
    --> 위 파일을 편집기로 열고 아래 열을 찾아서 주석을 제거 후 원하는 번호로 변경한다.
    Port 22
  • 본인은 8855 포트로 변경하였다.
  • 보안을 더 강화하기 위한 방법으로 Administrator 외에 계정을 만들고 해당 계정으로만 SSH가 접속되게 허용을 한다. (Optional)

4. 방화벽 설정

  • 절차 :
    Windows 방화벽 – 고급설정 – 인바운드 규칙 – 새 규칙 – 포트 TCP/특정로컬포트: 8855 – 연결 허용 – 도메인/개인/공용 모두체크 – 이름: sshd – 마침

5. 포트포워드
where: 공유기에서

  • 보통 Server 앞단에 물리적인 방화벽이 존재한다. 본인의 경우 앞단에 공유기가 있다.
  • 공유기에서 Windows 2016 Server의 NAT IP에 외부포트:TCP(7001~7100), 내부포트:TCP(8855) 포트포워드 룰을 적용 시킨다.
    -> 외부포트를 8855로 내부포트와 매칭해서 사용해도 상관 없다.
    -> 외부에서 공유기 Wan IP의 7001~7100 사이 포트로 접속하면 Windows 2016 Server의 OpenSSH Port 8855로 연결이 된다.
    ** rdp 포트는 포트포워드를 하지않기 때문에 rdp 포트가 외부에 노출되지 않는다.


ssh client 설치

where: rdp 클라이언트에서

1. 아래 사이트에서 purry msi 파일을 다운받아 설치
Putty for Windows 다운로드

2. ssh 접속 테스트

  • putty와 같은 ssh client 프로그램으로 공유기 Wan IP / 7001~7100 Port 로 연결을 시도해 보자.
  • ssh 연결이 잘되면 ssh 터널을 위한 준비된 것이다.


ssh 터널을 통한 rdp 연결

where: rdp 클라이언트에서

1. ssh 터널을 통한 rdp 접속확인

  • cmd 창을 열고 ssh 명령을 통해 아래와 같이 터널링을 만든다.
  • (사전에 Windows client에 ssh가 설치되어 있어야 한다. Windows 10에 ssh 서비스 설치)

    C:UsersUSER>ssh -p7001 myuser@example.com -L 2525:localhost:3355
    -> myuser의 비번을 입력하고 접속한다.

    -> 여기서 myuser는 Windows 2016 Server의 계정, 2525는 Windows Client에서 Listen할 임의의 포트임.
    -> 다른 LISTEN 포트와 겹치지만 않게 아무 포트나 사용 가능.

  • cmd 창 또는 mstsc를 띄워 rdp 연결 시도

    > mstsc /v localhost:2525

    -> localhost는 자기 자신인데?? 이게 좀 핵갈릴 수 있다.
    -> 위의 ssh 명령을 수행하면 클라이언트는 2525 포트를 localhost(127.0.0.1)에 LISTENING 하게된다.
    -> 클라이언트 측 터널의 종단 포트(2525)를 통해 서버 측 터널의 종단 포트인 3355 포트로 연결되는 것이다.
    -> 핵갈리지 않게 일치 실켜도 무관하다. 즉, 3355:localhost:3355 와 같이..

  • 만들어진 터널의 locahost로 연결 접속되는것이 확인된다.
    C:UsersUSER>netstat -an | findstr 2525
    TCP    127.0.0.1:2525         0.0.0.0:0              LISTENING
    TCP    [::1]:2525             [::]:0                 LISTENING
    TCP    [::1]:2525             [::1]:56562            ESTABLISHED
    TCP    [::1]:56562            [::1]:2525             ESTABLISHED


스크립트 생성

where: rdp 클라이언트에서

  • batch, visual basic script를 미리 생성해 두고 편리하게 접속을 하기 위함이다.

1. 디렉토리 생성

  • c: 드라이브에 Bat-files라는 디렉토리를 하나 만든다.

2. ssh 연결 batch 파일 작성

  • 아래 내용으로 ssh-con.bat 이라는 이름으로 batch 파일을 하나 만든다.
@echo off
title Reverse SSH Tunnel
color 3F
mode con cols=70 lines=20

taskkill /im plink.exe /f

setlocal
endlocal

set /a result=(%random% *1 %result%) + 1
set /a result=(%random% * 100 / 32768) + 7001

echo ##### Connected Port : %result% #####
echo y | "C:Program FilesPuTTYplink.exe" myuser@example.com -pw PASSWORD -P %result% -2 -4 -T -N -L 2525:localhost:4455

-> putty에 포함된 plink라는 프로그램이 ssh 터널링을 생성해 준다.
-> PASSWORD 는 Windows RDP Server의 myuser 계정에 대한 PASSWORD임.
-> %result%는 공유기에서 설정한 외부 포트 7001~7100 사이에서 랜덤하게 하나가 할당됨. 할당된 포트가 Windows SSH Server의 8585 포트로 포워딩 된다.

3. rdp 연결 batch 파일 작성

  • 아래 내용으로 myuser-m_rdp.bat 이라는 이름으로 batch 파일을 하나 만든다.
    @echo off
    title myrdp
    color 5F
    mode con cols=25 lines=1
    mstsc /v localhost:2525 /multimon
    exit

4. batch 파일을 실행할 vbs 파일 작성

  • 아래 내용으로 myuser-m.vbs 이라는 이름으로 visual basic script 파일을 하나 만든다.
    Set WshShell = CreateObject("WScript.Shell")
    WshShell.Run chr(34) & "C:Bat-filesssh-con.bat" & Chr(34), 0
    WshShell.Run chr(34) & "C:Bat-filesmyuser-m_rdp.bat" & Chr(34), 0
    Set WshShell = Nothing

    -> 이렇게 실행하는 이유는 2개의 batch 파일을 순차적으로 백그라운드 실행하기 위함


참고하면 좋은 문서

rdp with reverse connection on the ssh server

guacamole-0.9.13 with CentOS 7.4

rdp multimon 옵션으로 연결 시 창 위치

RDP connecting via ssh tunnel
태그:         

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다