본문 바로가기

Programming

ssh reverse tunneling for reverse RDP connection

RDP 접속을 하고싶은데 윈도우가 NAT 뒤에 있거나 방화벽에 막혀있는경우 어디서든 접속가능한 sshd 서버를 프록시로 경유해서 커넥션 하는 방법.


- A: NAT 뒤에 숨은 윈도우

- B: 공인 ip 로 접속가능한 Linux 서버


이때 B 를 프록시로 경유해서 A 로 접속하는 방법은.

1. 먼저 A (3388 포트에서 서비스 러닝중인 컴퓨터) 에서 B (프록시 해줄 서버. daehee.kr 등) 로 터널링 접속(putty 또는 ssh 로)

ssh -R *:7777:127.0.0.1:3388 root@daehee.kr


-R [bind_address:]port:host:hostport

             Specifies that the given port on the remote (server) host is to be forwarded to the given host

             and port on the local side.  This works by allocating a socket to listen to port on the remote

             side, and whenever a connection is made to this port, the connection is forwarded over the secure

             channel, and a connection is made to host port hostport from the local machine.


             Port forwardings can also be specified in the configuration file.  Privileged ports can be for‐

             warded only when logging in as root on the remote machine.  IPv6 addresses can be specified by

             enclosing the address in square brackets.


             By default, the listening socket on the server will be bound to the loopback interface only.

             This may be overridden by specifying a bind_address.  An empty bind_address, or the address ‘*’,

             indicates that the remote socket should listen on all interfaces.  Specifying a remote

             bind_address will only succeed if the server's GatewayPorts option is enabled (see

             sshd_config(5)).


             If the port argument is ‘0’, the listen port will be dynamically allocated on the server and

             reported to the client at run time.  When used together with -O forward the allocated port will

             be printed to the standard output.


이렇게 접속하면 A 에서 B 로 ssh 접속을 한 뒤에 B 쪽에 7777번 포트가 열림.
이 ssh 접속을 유지하는 상태에서 B 쪽에서 *:7777 로 접속을 하면 A 컴퓨터의 3388 로 포워딩됨. 
[중요] 이때 *:7777 처럼 bind address 를 와일드카드로 쓰려면 B쪽 컴퓨터의 /etc/ssh/sshd_config 에 GatewayPorts 를 yes 로 지정해줘야함. 이거 sshd 디폴트가 아니기때문에 꼭 설정 추가해주고 service sshd restart ㄱㄱ


2. 1 을 유지한상태에서 B 의 7777 로 RDP 접속을 하면 A 로부터 (127.0.0.1 를 소스아이피로서... 3388을 돌리는 서비스가 IP 바인딩을 0.0.0.0 으로 했다면 구지 127.0.0.1 일필요는 없지만 localhost 로 바인딩해서 돌고있다면 이렇게 지정해줘야함) A 의 3388 을 돌리는 TCP 로 접속하는것과 같은꼴.