玩式草子─ソフトウェアとたわむれる日々

第61回いまさらながらVNC[その3]

本連載では、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 リモートデスクトップ接続画面
図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のサイト
図2 rdesktopのサイト

rdesktopはUNIX/LinuxからWindowsのRDS(リモートデスクトップ・サービス)に接続するためのツールとして広く認知され、GNOME(Gnome-RDP)やKDE(krdc)用のフロントエンドツールが開発されたり、Mac OS Xにも移植(CoRD)されたりしています。

しかしながら、2006年ごろになるとrdesktopの開発は停滞しがちになり、RDPのバージョンアップに伴なう新機能への対応が進まなくなりました。そこで新しく始まったのがFreeRDPプロジェクトです。

図3 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に接続
図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 リモートデスクトップ接続を許可する指定
図5 リモートデスクトップ接続を許可する指定

今回のビルドでは、configure時に--disable-credsspを指定してCredSSP機能を無効にしているので、よりセキュリティが高い「ネットワークレベル認証」は利用できません。⁠ネットワークレベル認証」を使わねばならない場合は、rdesktopとは異なる実装を用いているためlibgssglueが不要なFreeRDPを利用する方がいいでしょう。


画面の画像データしか転送しないRFBプロトコルとは異なり、RDPの場合はサウンドデータをクライアント側に転送することも可能なので、より実機に近い操作感を得られるような気はします。その一方、サーバ側の設定次第で、1つのサーバ機に複数のビューワから同時接続することも可能なVNCに対し、RDPでは「同一ユーザがログインできるのは1つの端末のみ」という設計になっていて、新しくログインしようとすると、古いセッションは切られてしまい。⁠実機にログインしたまま、ネットワーク経由で進行状況を眺める」という使い方はできないようです。

別のマシンからログインし直しても動作しているプロセスは新しい端末に引き継がれるので、ビデオキャプチャ中に別のマシンに移動してもキャプチャが中断することは無さそうですが、当初の目的だった「ビデオキャプチャ状況のモニタ」程度の作業なら、VNCを押してきた欲目もあって「RDPよりもVNCを使う方が簡単」と感じています(苦笑。

おすすめ記事

記事・ニュース一覧