방화벽을 우회하여 사내망에 다이렉트로 접근할 수 있는 방법에 대한 문서이다.

 

1. 들어가며

WFH 시 오피스 외부에서 오피스 내부 네트워크에 연결하기 위해서는 VPN을 이용해야 한다.

우리 한국 오피스에는 VPN가 없기 때문에 해외 VPN 서버에 연결을 해야한다. 보통 가장 가까운 일본 오피스의 VPN 서버를 이용한다.

VPN을 통해 일반 적인 업무를 보는데는 무리가 없지만 한국 Office 내의 장치(랩탑, 서버 등)에 접근해야하는 경우,

해외를 경유해야 하는 거리적인 한계로 레이턴시가 높기 때문에 원활한 리모트 컨트롤이 힘든 경우가 있다.

이것을 개선하는 방법에 대해 기술한다.

 

2. VPN을 통한 연결

2.1. 연결 그림

아래 그림의 빨간색 화살표가 VPN을 통해 한국 Office의 PC에 연결되는 모습을 보여준다.

< 그림 1 >

ovpn-NRT-udp 프로파일로 연결되는 VPN Server WAN IP를 확인해 보면 아래와 같다.

https://www.ip-adress.com/ip-address/ipv4/66.187.238.70
IP Address
66.187.238.70

City
Ebisu

Country
Japan

ISP
Red Hat

* 위 일본쪽 WAN ip로 ping test를 하면 상태가 좋을 때 100ms 정도된다.
그런데 한국 Office 까지 패킷이 가기 위해서는 더 많은 hop을 거쳐야 하고 VPN 구간에서 암호화도 있다보니 레이턴시는 더 올라갈 수 밖에 없다.

 

2.2. 왜 느린가?

<그림 1>에서 보다시피 외부에서 한국 Office에 접근하기 위해서는 일본을 경유해야하기 때문에 느리다.

노란색 화살표처럼 연결해야 국내망 끼리 연결이 되어 빨라질 수 있다.

 

2.3. 직접 연결?

< 그림 2 >

<그림 2>처럼 회사 보안 정책상 허가되지 않은 외부 호스트의 접근을 차단하고 있다.

따라서 방화벽 통제 아래 있는 Office 내의 장치를 다이렉트 인바운드 방식으로 접근하여 제어하기는 힘들다.

 

3. Reverse Connection with Tunnel

터널을 통한 역방향 연결…

3.1. 원리

외부에서 인바운드 접근이 안되므로 역으로 아웃바운드 연결 후 그 연결 통로로 인바운드 연결하는 원리이다.

Office PC가 Home PC의 ssh port로 아웃바운드 세션을 맺고, 그 아웃바운드 세션 터널을 이용하여 Home PC가 Office PC로 인바운드 형태로 연결하는 것이다.

즉, 인바운드 패킷아웃바운드 세션에 캡슐화되어 통신되므로 방화벽의 통제를 뛰어 넘는 것이다. 이 방법은 VPN 터널링과 비슷한 기법이다.

 

3.2. 연결 모습

그림으로 표현하면 아래와 같다.

< 그림 3 >

* My Home 쪽의 Firewall은 인터넷 Wifi 공유기 임(공유기가 NAT 방화벽 역활을 함)

이렇게 연결을 하면 VPN을 통해 연결할때 대비 Latency가 최소 수십배가 낮아진다.

일반적으로 보안 정책상 Office 네트워크를 기준으로 인바운드 접근은 막지만 아웃바운드 연결에 대해서는 차단하지 않는 점을 이용한 것이다.

 

4. 터널링 구성 및 접속

이제 위 방법을 구현할 수 있도록 구성해 보자. 여기서는 Windows 10 기준으로 구성을 하였다.

 

4.1. 준비물

– Home PC (Windows 10) : SSH 서버 역활

– Office PC (Windows 10) : Plink 를 통한 SSH 터널 생성

* 이 문서에서는 Windows 10을 사용하였지만, 양쪽 PC의 OS가 무엇이든 상관 없다.

 

4.2. Office PC에 접속 (Home PC에서)

먼저 외부(집)에서 Red Hat VPN을 연결 후 Office PC(랩탑 또는 서버 등)에 접속한다.

* 사전에 Office PC에는 RDP(또는 VNC, SSH Server 등) 서버가 설정되어 있어야 한다.

 

4.3. plink 설치 (Office PC에서)

아래 사이트에서 자신의 OS에 맞는 것을 Office PC에 다운받아 설치 한다.

https://www.puttygen.com/download-putty

* plink는 putty를 인스톨하면 함께 설치된다.

 

4.4. SSH 서버 설정 (Home PC에서)

윈도우 10 Version 1709 이상부터 native sshd 를 사용할 수 있게 되었다.

* 윈도우 Version 확인 : 윈도우 설정 – 시스템 – 정보- 버전 확인

아래와 같이 sshd를 활성화 시킨다. (Home PC에서)

윈도우 설정 창을 띄운 후,

 

마지막으로 서비스 시작
(컴퓨터 관리 – 서비스 및 응용프로그램 – 서비스 – OpenSSH SSH Server – 시작유형 '자동' 선택 후 '시작' 버튼 클릭)

 

윈도우 CMD 창을 띄운 후 아래와 같이 ssh (22 port) 포트 LISTEN을 확인한다. (Home PC에서)

C:\Users\mvm7>netstat -an | findstr :22 | findstr LISTEN
  TCP    0.0.0.0:22             0.0.0.0:0              LISTENING
  TCP    [::]:22                [::]:0                 LISTENING

* 환경에 따라 OS 자체 방화벽에서 sshd(22 포트)에 대한 인바운드 허용 룰 설정이 필요할 수 있다.

 

4.5. My Home의 공유기 설정 (Home PC에서)

집에서 인터넷 공유기를 사용한다는 전제로 설명한다.

1) Windows 10 IP 확인 (Home PC에서)

Gateway로 설정된 이더넷 어댑터의 IP를 확인

C:\Users\mvm7>ipconfig
Windows IP 구성
이더넷 어댑터 Ethernet0:
   연결별 DNS 접미사. . . . :
   링크-로컬 IPv6 주소 . . . . : fe80::20cb:aa94:e7c5:6851%8
   IPv4 주소 . . . . . . . . . : 192.168.0.176
   서브넷 마스크 . . . . . . . : 255.255.255.0
   기본 게이트웨이 . . . . . . : 192.168.0.1

– PC IP : 192.168.0.176 (공유기 제공의 NAT 사설 IP)
– Gateway IP : 192.168.0.1 (공유기 IP)

* PC 및 Gateway IP Address는 환경에 따라 상이하게 출력됨

 

2) 웹브라우저의 주소 창에 192.168.0.1 을 입력 후 관리자 창 로그인

– '고급설정 – NAT/라우터 관리 – 포트포워드 설정' 창에서

빨간색 박스처럼 설정 후 적용을 누르면 파란색 박스와 같이 적용된다.

* 외부 포트 2155는 자신이 원하는 다른 포트로 변경 가능하다. 보안상 외부 포트로 22를 사용하지 않는 것을 권장한다.
* 공유기 설정은 ipTIME 공유기 기준이며 공유기에 따라 화면 구성, 설정 방법이 상이할 수 있음.

 

3) My Home의 인터넷 IP 확인 (외부 IP 주소)

* 참고로 공유기의 '특수기능 – DDNS 설정'을 이용하면 IP가 아닌 DNS 이름으로 외부에서 접근할 수 있다.

 

4.6. ssh 접속 테스트 (Office PC에서)

* Home PC 쪽으로 ssh 접속이 잘 되는지 확인을 위한 것으로 테스트를 안해도 상관은 없다.

1) Home 인터넷 IP와 ssh Port(2155)를  입력 후 연결

 

2) 접속 후 파일 확인

* Office PC에서 Home PC의 ssh로 연결이 제대로 되었다면 dir을 입력 시 Home PC 윈도우 계정의 C: 드라이브 폴더 리스트가 출력된다.

 

4.7. 터널 생성 (Office PC에서)

1) cmd 창을 띄운 후 아래와 같이 수행

C:\Users\mapoo>cd "c:\Program Files\PuTTY"
C:\Program Files\PuTTY> plink.exe USER@IPADDRESS -pw PASSWORD -P 2155 -2 -4 -T -N -R 0.0.0.0:5432:127.0.0.1:3389

The server's host key is not cached in the registry. You
have no guarantee that the server is the computer you
think it is.
The server's ssh-ed25519 key fingerprint is:
ssh-ed25519 255 2a:a6:1e:7b:a5:eb:12:e0:16:5c:a9:59:af:c6:2a:ea
If you trust this host, enter "y" to add the key to
PuTTY's cache and carry on connecting.
If you want to carry on connecting just once, without
adding the key to the cache, enter "n".
If you do not trust this host, press Return to abandon the
connection.
Store key in cache? (y/n) y
Using username "USER".
Access granted. Press Return to begin session.

명령 구문 :: plink.exe USER@IPADDRESS -pw PASSWORD -P 2155 -2 -4 -T -N -R 0.0.0.0:5432:127.0.0.1:3389
* 최초 접속 시 Store key in cache –> y 입력, 그리고 Enter 키 입력. (최초 접속이 아니라면 Enter 만 한번 추가로 입력)

  • USER@IPADDRESS : 본인 Home PC에 맞게 입력
  • PASSWORD : 본인 Home PC의 계정 비밀번호
  • -P 2155  : 공유기에서 설정한 ssh 포워딩 외부포트
  • -R 0.0.0.0:5432:127.0.0.1:3389 : 5432 포트는 다른 것으로 변경 가능함
  • 만약 Office PC의 원격제어 프로토콜이 VNC 라면 3389가 아닌 5900(또는 590X)으로 변경할 것

* plink.exe USER@IPADDRESS -pw PASSWORD -P 2155 -2 -4 -T -N -R 0.0.0.0:5433:10.76.161.192:5901

⇒ 이렇게 실행하면 어떻게 될까?
   10.76.161.192 IP를 가진 Office의 다른 시스템에 VNC로 연결을 할 수 있게 된다. 즉, Office PC가 프록시 역할을 하는 것이다.
   5432 포트를 5433으로 변경 하였고, 127.0.0.1 IP를 접근하고자 하는 IP(10.76.161.192)로 변경한 것이다.
   5432 부분의 포트와 127.0.0.1 IP 부분만 변경해 가며 plink를 추가로 실행하면 사무실의 다른 시스템들에 연결이 가능하다.

2) cmd 에서 아래와 같이 수행 (Home PC에서)

C:\Users\mvm7>netstat -an | findstr :5432
  TCP    127.0.0.1:5432         0.0.0.0:0              LISTENING
  TCP    [::1]:5432             [::]:0                 LISTENING

* plink를 통해 정상적으로 ssh 터널링이 되면 위와 같이 local host ip (127.0.0.1) 5432 포트로 LISTEN 하는 것이 확인된다.
* 5432 포트로 LISTEN 되지 않는다면 Home PC의 OS 자체 방화벽, 공유기 포트포워딩, SSH Server (22포트 Listen)구동 여부 등을 점검해 볼 것

 

4.8. Office PC에 rdp로 연결 (Home PC에서)

1) rdp 연결

이제 터널을 타고 Office PC에 다이렉트(VPN 미 경유)로 연결할 준비가 끝났다.

윈도우 실행 – mstsc – Office PC의 User/PW 입력 후 연결.

* localhost 대신 127.0.0.1을 입력해도 된다.

 

아래 그림처럼 SSH 터널을 통해 Office PC의 rdp 연결이 되었다.

* 밤하늘 바탕화면이 Office PC 의 원격 화면.
* Office PC를 제어해 보면 바로 앞의 PC를 제어 하듯 빠른 화면 응답이 느껴질 것이다.
*
WFH을 위해 회사 랩탑을 가지고 다니셨나요? 이제 회사에 그냥 두고 다녀도 좋습니다. 🙂
* 열정페이로 구축한 테스트 시스템이 느렸나요? 이제부터 빠르게 쓸 수 있습니다. 😛 

 

2) 연결 세션 확인해 보기

터널(ssh 2155 포트 세션)을 통해 rdp(3389 포트 세션)가 localhost로 연결된 것이 확인된다. (Office PC에서)

C:\Users\mapoo>netstat -an | findstr :3389 | findstr EST
  TCP    127.0.0.1:3389         127.0.0.1:50856        ESTABLISHED
  TCP    127.0.0.1:50856        127.0.0.1:3389         ESTABLISHED

ssh 연결 확인 (Office 와 Home PC에서)

- Office PC에서 ssh 세션 확인
C:\Users\mapoo>netstat -an | findstr :2155 | findstr EST
  TCP    10.76.161.102:50753    121.160.140.25:2155    ESTABLISHED

- Home PC에서 ssh 세션 확인
C:\Users\mvm7>netstat -an | findstr :22 | findstr EST
  TCP    192.168.0.176:22       125.143.190.217:20223  ESTABLISHED

* 10.76.161.102 – Office PC 측 사설 IP
* 125.143.190.217 – Office PC 측 인터넷 IP (ISP – KT)
* 121.160.140.25 – Home PC 측 인터넷 IP (ISP – KT)

* 192.168.0.176 – Home PC 측 사설 IP
* 연결 순서 IP/Port ::  10.76.161.102:50753 –> 125.143.190.217:20223   —인터넷—>   121.160.140.25:2155 –> 192.168.0.176:22

 Home 의 인터넷 IP 쪽으로 ping 테스트 (Office PC에서)

C:\Users\mapoo>ping 121.160.140.25 -n 20
Ping 121.160.140.25 32바이트 데이터 사용:
121.160.140.25의 응답: 바이트=32 시간=2ms TTL=52
~~ 생략 ~~
121.160.140.25에 대한 Ping 통계:
    패킷: 보냄 = 20, 받음 = 20, 손실 = 0 (0% 손실),
왕복 시간(밀리초):
    최소 = 2ms, 최대 = 5ms, 평균 = 3ms

* icmp 패킷 응답 속도가 평균 3ms로 확인된다.
* 사무실 인터넷 ISP는 KT로 확인된다. 따라서 본인 집의 인터넷이 KT가 아니라면 레이턴시가 조금 더 높아질 수 있다.

 

5. 정리

5.1. 연결 과정

정리하자면, 아래 그림과 같이 연결되는 것이다.

< 그림 4 >

 

5.2. 전체적인 연결 절차

                    

    < VPN 구간을 통해 Office PC에 접속 >       ⇒      < Office PC에서 Home PC로 SSH 연결 >       ⇒     < SSH 터널을 통해 Office PC에 RDP 연결 >

< 그림 5 >

  • 사전에 plink 설치, SSH 서버 설정, 공유기 포트포워딩 설정을 한번만 해 놓으면,
  • 그 다음부터는 위 <그림 5>와 같이 3단계만 거치면 Office PC에 다이렉트로 연결이 가능하다.

5.3. OS별 프로토콜

  • Home PC가 Mac / Linux 일 경우 –  ssh 서버 기능이 기본 탑재 되어 있음
  • Office PC가 Mac / Linux 일 경우 – RDP 대신 VNC(GUI)/SSH(CLI)를 이용하여 원격 제어

6. 부록

6.1. 연결 스크립트

본인의 경우 Office PC에 아래와 같이 SSH 연결용 bat파일을 적용함.

1) RSSH_CON.bat – 주석문 포함

@echo off
title Reverse SSH Tunnel
color 3F
mode con cols=70 lines=20

:: result 변수 초기화
setlocal
endlocal
set /a result=(%random% *1 %result%) + 1

:: 2201 ~ 2300 까지의 랜덤수를 생성 (원하는 대로 변경 가능)
set /a result=(%random% * 100 / 32768) + 2201
:: 공유기에서 '외부포트:2201~2300 <-> 내부포트:22'로 포트포워딩이 필요함
:: 만약 2155번 포트 하나만 사용하고 싶으면 아래처럼 설정할 것
:: set /a result=(%random% * 1 / 32768) + 2155

:: ssh server에 연결된 port를 화면에 출력
echo ##### Connected Port : %result% #####

:: 위 범위에서 할당 된 랜덤수(result) 포트로 ssh 서버에 연결, 터널링 생성
echo y | "C:\Program Files\PuTTY\plink.exe" myuser@my.example.com -pw PASSWORD -P %result% -2 -4 -T -N -C -R 0.0.0.0:5432:127.0.0.1:3389

:: myuser@my.example.com / PASSWORD 부분을 자신의 계정과 도메인(또는 IP)에 맞게 수정하여 사용
:: ssh 서버(윈도우/리눅스/맥)에서 local ip 127.0.0.1에 5432 포트로 rdp/vnc 로 연결한다. 여기서는 3389포트를 이용해 rdp 연결을 함.
:: ssh 서버측 local 포트는 5432에서 1 ~ 65535 사이에서 다른 것으로 바꿀 수 있다.

* Office PC에서 Home PC쪽으로 ssh 터널링 생성 시 위 내용의 batch 파일을 Office PC에서 수행.
* ssh 연결 시 마다 ssh 포트를 일정 구간내(2201 ~ 2300)에서 랜덤 포트로 할당하도록 하였고,
  이럴 경우 Home 공유기에서 포트포워딩 시 외부 IP 쪽 포트를 range (2201 ~ 2300) 설정이 필요함. 하지만 포트 하나만 지정해도 무방하다.

 

2) RSSH_CON.bat – 주석제거

위와 같은 batch 파일이며 주석만 제거한 것.

@echo off
title Reverse SSH Tunnel
color 3F
mode con cols=70 lines=20

setlocal
endlocal

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

echo ##### Connected Port : %result% #####
echo y | "C:\Program Files\PuTTY\plink.exe" myuser@my.example.com -pw PASSWORD -P %result% -2 -4 -T -N -C -R 0.0.0.0:5432:127.0.0.1:3389

* 만약 이 문서와 같이 Home PC 쪽 외부인터넷 IP의 ssh 포트를 2155로 하나만 설정 했다면, 아래와 같이 설정하면 된다.
* set /a result=(%random% * 1 / 32768) + 2155
* plink -C 옵션 : ssh 가 제공하는 Compress 기능을 활성화하여 패킷 압축.
* Home PC <-> Office PC간 인터넷 회선 속도가 50Mbps 이하라면 속도 증대 효과를 볼 수 있다.
* 국내 인터넷은 대부분 100Mbps가 넘는다. 인터넷 회선 속도가 50Mbps가 넘는다면 CPU의 압축 속도가 회선 속도를 따라가지 못해 병목 지점이될 수 있으므로 -C 옵션은 제외하는 것을 권장한다.

 

6.2. Remote Desktop Gateway

이 문서에서는 막힌 인바운드를 우회하는 방법을 기술하였다.

아래는 아웃바운드가 막힌 네트워크 망에서 우회하는 방법에 대한 참고 문서이다.

Guacamole – 방화벽을 넘어 원격제어 ~ !

 

이 문서에서 설명한 방법을 알아두면 나중에 다른 곳에도 활용할 일이 있을 것이다.

– 끝 –

 

rdp with reverse connection on the ssh server

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다