本連載では、Linuxのデスクトップ環境からWindowsを操作するためのツールとしてVNCを紹介してきました。VNCにはさまざまな実装が存在するものの、前回紹介したように、手元ではWindows側はUltraVNCのサーバ、Linux側はTigerVNCのビューワ、という組み合わせで安定、快適に動作するようになり、この組み合わせで当初の目的だったVHDカラオケのキャプチャ作業を進めています。
LinuxからWindowsを操作する、という当初の目的は実現できたものの、VNCについてあれこれ調べているうちに、Windowsの世界でも「リモートデスクトップ接続」という名称で、別の場所にあるWindowsをネットワーク経由で利用する技術が存在し、その技術をLinuxから利用するためのソフトウェアも開発されていることに気づきました。今回は、そのあたりの話を紹介してみます。
リモートデスクトップ接続とRDP
UNIX/Linuxの標準的なGUI環境であるX Window System は、元々はマサチューセッツ工科大学(MIT)が学内のコンピュータシステムを統合するために開発した「プロジェクト・アテナ (Project Athena) 」用のウィンドウシステムとして設計されました。
「プロジェクト・アテナ」は、MIT学内に存在するさまざまなメーカ製のコンピュータをネットワークで結び、どこからでも同じ手順で操作できる環境を作ることを目指していました。そのため、その環境用に開発されたX Window Systemも当初からネットワーク透過的 に設計されていて、DISPLAY環境変数を指定するだけで、離れたところにあるコンピュータの画面を手元のディスプレイに表示することができるようになっています。
一方、MS-DOSにGUI環境を付加する ことが目的だったWindowsは、ネットワーク経由で使うことは考えられていませんでした。しかし、Windows NTの世代になると、Windows機がサーバ用途にも使われることが増えてきて、それと共にシステムをリモートから管理したいというニーズも増えてきました。
そのためにMicrosoftが採用したのが米国Citrix Systems社が開発したWinFrame と呼ばれる技術です。WinFrameは、Windows NTを複数の端末から、複数のユーザが同時利用できるようにする拡張機能で、1995年に発表され、Citrix Systemsの主力商品となりました。
この機能に関心を持ったMicrosoftは、Citrix Systemsと共に開発を進めて、Windows NT 4.0用の追加機能として「ターミナルサービス 」を提供しました。この「ターミナルサービス」は、WinFrame同様、複数のユーザが複数のクライアント端末からサーバとして動作しているWindows NT機に接続して利用できるサービスで、この機能によって、Windowsはリモートからも操作できるOSになったわけです。「 ターミナルサービス」は、その後、「 リモートデスクトップ 」に名称を変更し、Windows XP以降ではOSの標準機能として組み込まれることになりました。
図1 リモートデスクトップ接続画面
この「リモートデスクトップ」サービスを実現しているのが「リモート・デスクトップ・プロトコル (RDP) 」という通信プロトコロルです。
前回までに紹介したVNCが利用しているRFB(Remote Frame Buffer)プロトコルは、描画した画面を画像データとして転送するためのシンプルなプロトコルだったのに対し、RDPはWindowsの画面を別のマシン上で描画する ために必要な情報をやりとりする、かなり複雑なプロトコルになっています。
RDPの詳細を説明するのは筆者の手に余るものの、ざっと調べた限りでは、ITU-T(国際電気通信学会)が定めたビデオ会議用の通信プロトコル群(T.120)の内、T.128(T.SHARE)と呼ばれるアプリケーション共有用プロトコル を元に、いくつか機能を追加、拡張したプロトコルになっているそうです。
前述のように、基本的な部分はCitrix Systemsが開発していたこともあって、RDPの最初のバージョンはWindows NT 4.0(Terminal Server Edition)に搭載されたRDP 4.0 になっています。その後、Windows2000 Serverに搭載されたバージョンが5.0、Windows XPに搭載されたバージョンが5.1と、Windowsのバージョンに合わせるようにRDPのバージョンも進化して行き、最新のバージョンはWindows 8.1とWindows Server 2012 R2に搭載されているRDP 8.1 です。
RDPのフリーな実装
前節で紹介したように、最初のバージョンであるRDP4.0を採用したWindows NT 4.0 Terminal Server Editionが公開されたのは1998年のことでした。その直後から開発が始まったのがrdesktop というUNIX/Linux用のRDPの実装です。rdesktopの最初のバージョンは、SourceForgeから2001年に公開されました。
図2 rdesktopのサイト
rdesktopはUNIX/LinuxからWindowsのRDS(リモートデスクトップ・サービス)に接続するためのツールとして広く認知され、GNOME(Gnome-RDP)やKDE(krdc)用のフロントエンドツールが開発されたり、Mac OS Xにも移植(CoRD)されたりしています。
最近では、RDPの仕様は"Open Specification(公開仕様)"としてインターネットに公開されているものの、rdesktopの開発が始まったころはWindows専用の商用プロトコルとして詳細は公開されていなかったため、開発者たちはやりとりされるパケットを解析してプロトコルの詳細をリバース・エンジニアリングする等、苦労したそうです。
しかしながら、2006年ごろになるとrdesktopの開発は停滞しがちになり、RDPのバージョンアップに伴なう新機能への対応が進まなくなりました。そこで新しく始まったのがFreeRDP プロジェクトです。
図3 FreeRDPのサイト
FreeRDPは、もともとはrdesktopからのフォークとして始まったものの、その後、積極的にソースコードの見直しと各機能のモジュール化を進め、バージョン1.0になると「rdesktop由来のソースコードが無くなった」として、ライセンスもApache Licenseに変更しています(rdesktopはGPL) 。
FreeRDPは、RDPのバージョンアップに伴なって追加された機能にも積極的に取り組み、最近のバージョン(1.0.2)ではRDP 8.0の機能の大部分 に対応しているそうです。
一方、2011年になると、停滞していたrdesktopの開発を、Linux用の端末サーバやThinクライアントを開発しているスウェーデンのCendio社が率いることとなり、再び新しいバージョンがリリースされるようになりました。rdesktopの最新版は1.8.2で、RDP 5.2の大部分と、それ以後に追加された機能のいくつか が実装されているそうです。
rdesktopの使用例
前述のように、現在、RDPを扱うフリーなソフトウェアにはrdesktopとFreeRDPの2種があります。両者のうち、FreeRDPの方が後発な分、新機能への対応も進んでいるものの、各機能がモジュール化された動的ライブラリになっていることもあって、ビルドやインストールはやや面倒になっています。そのため、以下ではrdesktopをソースコードからビルドしてRDSに接続する例を紹介しましょう。
rdesktopは、上記rdesktopの公式サイトからソースコードをダウンロードできます。最新版は、2014年5月に公開された、rdesktop-1.8.2です。
$ wget http://sourceforge.net/projects/rdesktop/files/rdesktop/1.8.2/rdesktop-1.8.2.tar.gz
$ tar xvf rdesktop-1.8.2.tar.gz ; cd rdesktop-1.8.2
このソースコードにはconfigureスクリプトが用意されているので、ビルドは簡単です。ただし、Plamo Linux環境でビルドするには--disable-credssp と--disable-smartcard を指定する必要がありました。CredSSPとは最近のWindowsが採用している新しいネットワークレベル認証用の機能、smartcardはいわゆるICカードを操作する機能で、Plamo Linuxの環境からこれらを利用するには、いくつかライブラリを追加する必要があるようです。
$ ./configure --disable-credssp --disable-smartcard
checking build system type... i686-pc-linux-gnu
checking host system type... i686-pc-linux-gnu
...
checking for setmntent... yes
configure: creating ./config.status
config.status: creating Makefile
後は make するだけです。
$ make
gcc -g -O2 -Wall -I/usr/include -I/usr/include/alsa -DPACKAGE_NAME=\"rdesktop\"
-DPACKAGE_TARNAME=\"rdesktop\" -DPACKAGE_VERSION=\"1.8.2\" -DPACKAGE_STRING=\"rdesktop\ 1.8.2\"
-DPACKAGE_BUGREPORT=\"\" -DPACKAGE_URL=\"\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1
....
作成されるのは "rdesktop" という1つの実行ファイルのみなので、インストールせずに試してみることもできます。
$ ./rdesktop -xl 192.168.1.11
Autoselected keyboard map ja
Connection established using SSL.
WARNING: Remote desktop does not support colour depth 24; falling back to 16
ERROR: SSL_read: 5 (接続が相手からリセットされました)
Disconnected due to network error, retrying to reconnect for 70 minutes.
Connection established using SSL.
図4 rdesktopでRDSに接続
上記コマンド例のうち、オプションに指定している-xl は「LAN並みの通信速度を利用する」という指定で、このオプションを指定しないと、通信データを抑制するため背景画像が表示されない等の制限が生じるようです。rdesktopにはこれ以外にもさまざまなオプションが用意されているので、詳細はヘルプメッセージやマニュアルを参照してください。
$ ./rdesktop -h
rdesktop: A Remote Desktop Protocol client.
Version 1.8.2. Copyright (C) 1999-2011 Matthew Chapman et al.
See http://www.rdesktop.org/ for more information.
Usage: ./rdesktop [options] server[:port]
-u: user name
-d: domain
-s: shell / seamless application to start remotly
-c: working directory
...
-4: use RDP version 4
-5: use RDP version 5 (default)
なお、外部からの接続を受けつけるWindows側では、あらかじめ「リモートデスクトップの接続を許可する」ための設定をしておく必要があります。
その設定は、Windows 7の場合、「 コントロールパネル」 →「 システムとセキュリティ」 →「 システム」と進んで、「 リモートの設定」タブの中にあります。
図5 リモートデスクトップ接続を許可する指定
今回のビルドでは、configure時に--disable-credsspを指定してCredSSP機能を無効にしているので、よりセキュリティが高い「ネットワークレベル認証」は利用できません。「 ネットワークレベル認証」を使わねばならない場合は、rdesktopとは異なる実装を用いているためlibgssglueが不要なFreeRDPを利用する方がいいでしょう。
rdesktopがCredSSP用に使っているlibgssglueは、元々NFSv4用に開発されていたライブラリなものの、最近はNFSv4でもこのライブラリは不要になったため、Plamo Linuxではobsoleteとして削除しています。
画面の画像データしか転送しないRFBプロトコルとは異なり、RDPの場合はサウンドデータをクライアント側に転送することも可能なので、より実機に近い操作感を得られるような気はします。その一方、サーバ側の設定次第で、1つのサーバ機に複数のビューワから同時接続することも可能なVNCに対し、RDPでは「同一ユーザがログインできるのは1つの端末のみ」という設計になっていて、新しくログインしようとすると、古いセッションは切られてしまい。「 実機にログインしたまま、ネットワーク経由で進行状況を眺める」という使い方はできないようです。
別のマシンからログインし直しても動作しているプロセスは新しい端末に引き継がれるので、ビデオキャプチャ中に別のマシンに移動してもキャプチャが中断することは無さそうですが、当初の目的だった「ビデオキャプチャ状況のモニタ」程度の作業なら、VNCを押してきた欲目もあって「RDPよりもVNCを使う方が簡単」と感じています(苦笑。