【Azure for IT Pro】Azure VM に接続するための RDP ファイルについて

リモートデスクトップサービス(旧 ターミナルサービス)が Windows Server(Windows NT)に実装されてから、もう15年位でしょうかねぇ。その機能はOSのバージョンアップのたびに強化され、気が付けばサウンドカードやグラフィックカードなど、ローカルデバイスを利用できるようにまでなりました。個人的にはローカルドライブをリダイレクトできる機能がお気に入りです。遠隔地にあるサーバーと簡単にデータ交換ができるようになりました。

RDP ファイルとは「Remote Desktop Protocol ファイル」のことで、リモートデスクトップサービスに接続するための定義が書かれたテキストファイルです。mstsc(リモートデスクトップクライアント)を起動すると「保存」「名前を付けて保存」というボタンが目につきますが、このボタンで保存したファイルがRDPファイルです。中身はテキストですので、メモ帳で編集することも可能です。

imageimage

ご存知の通り、Windows Azure に展開したインスタンスにもリモートデスクトップで入り込むことができます。

ここで、気になることがあります。それは、

Windows Auzre 上の インスタンスって、RDPファイル内でどうやって識別されているの?

ってことです。

以下をご覧ください。Windows Azure ポータルから「VMRole1_IN_0」というインスタンスにリモートデスクトップで入り込もうとしているところですが、ログオン画面に表示されているのはサービスの URL だけで、この画面からは変更することができません。これだけ見るとどうやって、「VMRole1_IN_0」と「「VMRole1_IN_1」が識別されているのかが不思議です。

image

そこで、RDPファイルを一度保存して、メモ帳で中身を見てみましょう。

full address:s:vmroletestjunichia01.cloudapp.net username:s:junichia LoadBalanceInfo:s:Cookie: mstshash=VMRole1#VMRole1_IN_0#Microsoft.WindowsAzure.Plugins.RemoteAccess.Rdp

RDPファイルの中身は、基本的に1行1設定であり、コロン(:)で区切られた3つのカラムから構成されています。

<設定名>:<値の型>:<値>

1行目は full address という設定名に、値の型が文字列(s)で、vmroletestjunichia01.cloudapp.net という値が設定されています。vmroletestjunichia01.cloudapp.net は私が展開したサービスのURLですが、これだけではインスタンスは一意に決められません。なぜならばサービスは複数のインスタンスで構成されている場合がほとんどだからです。上の画面でも、2つのインスタンスが展開されていることがわかります。

じゃ、そのインスタンスを特定している設定はどれか...一目瞭然、3行目です。

LoadBalanceInfo:s:=Cookie: mstshashVMRole1#VMRole1_IN_0#Microsoft.WindowsAzure.Plugins.RemoteAccess.Rdp

マイクロソフトの VDI に詳しい方だと、似たような設定を見たことがあるかもしれません。VDI の場合、あらかじめ決められた特定のサーバーに接続するのではなく、複数のサーバーを保持しているサーバープールから、空いているサーバー1つ選択して接続する必要があります。そのような場合には、full address  設定に加えて、以下のような設定が使われます。これは、VMFarm という仮装デスクトップのプールから空いているデスクトップを探し出してリダイレクトするための設定です。もちろんこの仕組みの裏には、セッション管理を行ってくれるセッションブローカー等のサーバーが待機しており、そららの緻密な連携によって実現されています。

LoadBalanceInfo:s:tsv://vmresource.1.VMFarm

この値は、リモートデスクトッププロトコル(RDP)を使用してセッションを確立する前に、コネクションリクエストの一部として送信されます。

では、Windows Azure 場合には、この設定ファイルはどのような意味を持っているのでしょう。なんとなく、ロールインスタンスの名前が指定されていることはわかりますよね。

LoadBalanceInfo:s:Cookie は、クッキータイプの文字列を使用して特定RDPクライアントに対するコネクションリクエスト(X.224 Connection Request)を送付します。

このクッキーの中で使用される値の名前が「mstshash」です。mstshash には、

VMRole1#VMRole1_IN_0#Microsoft.WindowsAzure.Plugins.RemoteAccess.Rdp

という値が格納されます。ちなみに、上の画面ショットをご覧いただければお分かりの通り、「VMRole1」はロールの名前で、「VMRole1_IN_0」はインスタンス名です。2つ目のインスタンスに接続したい場合には、以下のように指定すればよいだけです。

VMRole1#VMRole1_IN_1#Microsoft.WindowsAzure.Plugins.RemoteAccess.Rdp

この文字列が full address で設定したホスト(この例では vmroletestjunichia01.cloudapp.net)に送信され、接続のやり取りが開始されます。

vmroletestjunichia01.cloudapp.net がクッキーを受け入れると、mstsc は vmroletestjunichia01.cloudapp.net との TLS コネクションを張ろうとします。これに対して vmroletestjunichia01.cloudapp.net は VMRole1_IN_0 の X.509 証明書を送付するなどのやり取りが行われて、TLSコネクションが確立します。

これらのやり取りをキャプチャしたのが以下の画面です。

image

Windows Azure の中が、どのようなリモートデスクトップ構成になっているのかはハッキリとは見えないのですが、ひとまず vmroletestjunichia01.cloudapp.net がコネクションブローカーのように見えますね。