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