AmazonLinux
RDP
socat

Linux経由でリモートデスクトップ接続をフォワーディング

More than 1 year has passed since last update.

概要

リモートデスクトップ接続を通常の接続ではなく、Linuxサーバを経由して接続する場合、sshのポートフォワーディングなどの方法がありますが
これは接続しようとするユーザに、やや負担があります。

また、Apache Guacamoleを利用して、ブラウザ経由でリモートデスクトップ接続させることもできますが、環境構築がやや面倒ですし、できればWindow標準のリモートデスクトップクライアントで繋ぎたいです。

そこで、以下の方法でより簡易にフォワーディングすることができます。

イメージ図

Connection Image

インストール

まずLinuxサーバにsocatが入っていなければsocatをインストールします。

$ uname -a
Linux ip-hogehoge 4.4.44-39.55.amzn1.x86_64 #1 SMP Mon Jan 30 18:15:53 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
$ sudo yum install socat
$ socat -V
socat by Gerhard Rieger - see www.dest-unreach.org
socat version 1.7.2.3 on Mar  6 2014 21:44:52
   running on Linux version #1 SMP Mon Jan 30 18:15:53 UTC 2017, release 4.4.44-39.55.amzn1.x86_64, machine x86_64
features:
  #define WITH_STDIO 1
  #define WITH_FDNUM 1
  #define WITH_FILE 1
  #define WITH_CREAT 1
  #define WITH_GOPEN 1
  #define WITH_TERMIOS 1
  #define WITH_PIPE 1
  #define WITH_UNIX 1
  #define WITH_ABSTRACT_UNIXSOCKET 1
  #define WITH_IP4 1
  #define WITH_IP6 1
  #define WITH_RAWIP 1
  #define WITH_GENERICSOCKET 1
  #define WITH_INTERFACE 1
  #define WITH_TCP 1
  #define WITH_UDP 1
  #define WITH_SCTP 1
  #define WITH_LISTEN 1
  #define WITH_SOCKS4 1
  #define WITH_SOCKS4A 1
  #define WITH_PROXY 1
  #define WITH_SYSTEM 1
  #define WITH_EXEC 1
  #define WITH_READLINE 1
  #define WITH_TUN 1
  #define WITH_PTY 1
  #define WITH_OPENSSL 1
  #undef WITH_FIPS
  #undef WITH_LIBWRAP
  #define WITH_SYCLS 1
  #define WITH_FILAN 1
  #define WITH_RETRY 1
  #define WITH_MSGLEVEL 0 /*debug*/

socatを起動

以下のように3389で待ちうけて、対象サーバへフォワーディングします。

$ socat tcp4-listen:3389,reuseaddr,fork TCP:35.160.1.26:3389

すると、「63.36.3.10」へ接続するだけで、うまく接続を「35.160.1.26」へフォワーディングしてくれます。
RDP Client

試してダメだったこと

最初はnc(netcat)を利用してやろうとしましたが、できませんでした。
ncは標準で入っていたnc(BSD版?)やGNU Netcatでやりましたが、結果は同じく、繋いだ瞬間に"connection reset by peer"となりました。

BSD_netcat
$ mkfifo fifo
$ nc -l 3389 < fifo | nc 35.160.1.26 3389 > fifo
GNU_netcat
$ nc -L 35.160.1.26:3389 -p 3389 -vvv

追記

試しに多段経由もしてみましたが、問題なく接続できました。

参考

proxying through complex situations