はじめに
Private DaaS的なものを作ってみようコーナーの第二回です。
このコーナーの背景は以下のリンクの「はじめに」を参照ください。
前回はWindows Remote Desktop Servicesセッションホスト型を作ってみたので、今回は同Windows Remote Desktop Services仮想化ホスト型の作り方です。
これにより、任意のユーザーが其々のWindows仮想マシンにアクセスできる環境を作ることができます。
IBM Cloud上にWindows Remote Desktop Services環境を構築し、任意のユーザーが任意のWindows仮想マシンにアクセスできる環境を作る
Windows Remote Desktop Services(以下、Windows RDS)を活用してDaaS(Desktop αs α Services)のようなものを作ってみます。
今回は、物理サーバーを使って、Windows端末を複数台搭載する仮想化ホストを作ってみます。
今回、簡単な技術検証として手順を作りましたが、やってみると、Windows Remote Desktop Servicesの仮想化ホスト方式は少し変えるだけで導入できなくなるケースが多々あり、少し(?)癖のある製品だとわかりました。
ちゃんと作るときは専門家に依頼することをお勧めします。
なお、Windows RDSは何ぞやという方は公式ドキュメントがおすすめです。
ただ、こちらも参考になるかもしれません。
https://www.hitoriit.com/entry/2018/04/16/174701
今回の準備もの
・仮想サーバー1台 Virtualserver1 (Windows Server 2019 Standard)=Active Directory、DHCP
・仮想サーバー1台 Virtualserver2 Windows RDSの管理サーバーとして利用 (RDS管理サーバーとActive Directoryは同居できないことに注意!)
・物理サーバー1台(Windows Server 2019 DataCenter)=Windows RDSの実行サーバーとして利用
・ポータブルサブネット(*1) VMに割り当てるためのサブネットとIPです。
・ゲストOS(ライセンス)
・OpenDHCP(Windows Server同梱のDHCPでは実装できなかったので・・)
*仮想化ホストは、セッションホストのRDS CALの他にWindows VDA(仮想化環境に搭載するWindows OSライセンス)が必要になります。このライセンス周りが難解で、私は問い合わせしてもなんとなくしかわからなかったので、マイクロソフト社に必要なライセンスについて問い合わせを行い、適切なライセンスを購入してから実装することをお勧めします。
(ライセンスさえ調達できれば、構築は思ったより簡単ですよ!)
*ここではオプション作業として、物理サーバーを1台追加したスケールアップの方法も記載しておきます。
最小構成としては、仮想サーバー1台(ADサーバー、DHCPサーバー)と物理サーバー1台(RDSサーバー)でも作れなくはないです。
作業概要
1.仮想サーバー1,2と物理サーバー1を作る
2.仮想サーバー1にActive Directoryを構築する
3.物理サーバー1, 仮想サーバー2をADのドメインに参加させる
4.仮想サーバー2でWindows RDSを入れる。この時、実行サーバーに物理サーバーを選ぶ
5.Hyper-Vの設定を行い、仮想マシンを作る。
6.ログインテストを行う
(option)7.必要なら物理サーバーを増やして仮想化ホストを追加することで拡張できます
各サーバーの前提作業
仮想サーバーにはSecurity Groupというポートを閉じる(いわゆるFirewall)が設定できます。よくあるケースとして、Public NetworkのSecurity GroupにAllow Outboud(サーバーから外部に向けてのみネットワーク接続を許可)ということをしてある場合、他サーバーとPublic ネットワーク側で通信を優先してしまうと不都合が起きます。例えば、仮想サーバーに追加したActive Directoryの提供するドメインに参加できないなど。
そこで、ADやWindows RDSの通信の優先順位をPublic Networkと Private Networkの優先順位を変更します。
私が知る限り、簡単な方法はGUIでPrivateのネットワークアダプターのMetricを手動:1に変更しておくことです。
また、Public側のNICはDNSを使わないのでOFFにしておきましょう。
物理サーバーのFirewallについて
物理サーバーはFirewallが無効となっているケースがあります。検証用とはいえ、野晒しにするわけにもいかないので、Firewallを有効化することが望ましいと考えます。
ただ、何もせずに有効化するとリモートデスクトップも遮断されてしまうので、その場合は、KVMで復帰させましょう。
https://qiita.com/ymaruoka/items/89fcfc4dd3ae0d1eb18d
仮想サーバー1でのAD・DHCP導入作業
Active Directoryを導入する
役割の追加で、Active Directoryを追加します。
役割が追加されたら、OSを再起動したあと、サーバーマネージャーにて、新しいドメインを作ります。
今回のドメインはrds-poc.localとしました。
(ここでも言われているようにlocalドメインは推奨ではありませんが、exampleドメインを使うとADが適切に動かないようだったので断念しました。
https://www.picturecode.co.jp/faq/dot-local-domain/)
今回は構築のお試しなので、特に変更なくNEXTを繰り返す。
ちゃんとした構成にするときはDatabase folderの置き場所などは設計しましょう。
OUとユーザーを作る
Windows RDSではOUとユーザーが必要となります。
サーバーマネジャーのActive Directory Users and Computersにて、OUとユーザーを作ります。
- OU : OU-RDS-POC
- ADとRDSの管理用ユーザー : ユーザー名:なんでも。所属グループ:Domain Admins, Administartors
- このユーザーはRDSの役割追加時に使用します
- RDSログイン用ユーザー : ユーザー名:なんでも。所属グループ:Domain User, Remote Desktop Users
OUを作るときは、protect container from accidental deletionのチェックボックスをOFFにしておくこと。
仮想サーバー1に、DHCPサーバーを導入
MSのDHCPサーバーでは動かなかったのでDHCPサーバーを入れます。
DHCPサーバーを入れる前にポータブルIPを設定します。
NetworkのPrivate NIC側に、IPの2つ目にポータブルIPの1つのIPを設定し、Metricを1に設定します。
DHCPサーバーをダウンロードします。
https://sourceforge.net/projects/dhcpserver/files/latest/download
単に導入するだけなら、NEXTボタン→Installボタンを押すだけです。
C:\OpenDHCPServerにあるOpenDHCPServer.iniの設定に必要な設定を加える。
[LISTEN_ON]
自分のサーバーで使うLISTENのIP
[LOGGING]
なんでもいいですが、テストならLogLevel=Allの方が問題判別が楽です。
[RANGE_SET]
DHCPRange=ポータブルサブネットで割り当てられたIPのレンジを指定します
SubnetMask=ポータブルサブネットのマスク
DomainServer=今回構築した仮想サーバー1(AD)に割り当てたポータブルサブネットのIPアドレス
Router=ポータブルサブネットのデフォルトゲートウェイ
AddressTime=IPのリース時間。デフォルトの360でいいと思います。
コントロールパネルからFirewallのAdvanced Settingsを開き、FirewallのInboundを開けます。
物理サーバー1、仮想サーバー2をADのドメインに所属させる
物理サーバーも仮想サーバーも同じ作業なので、ここでは物理サーバーをドメインに所属させる手順で記載します。
物理サーバーにログインします。
DNSサーバーを仮想サーバーに設定します。
仮想サーバー1で作ったドメインに所属させます。
コントロールパネル>システム>
ドメイン参加時の注意。Windows Defender Firewallを有効にしている場合、ドメイン参加後のFirewallはRemote Desktopの遮断する設定になります。そのため、このダイアログの再起動後にリモートアクセスできなくなる場合があります。
それを防ぐには、このダイアログでOKを押す前に、Firewallの設定を変更しておく必要があります。簡単な変更としてはFirewallのアプリの許可をしておくことです。
このダイアログのボタンを押してリスタートする前にFirewallの状態をチェックすること。
再起動後は、ADで作成した管理ユーザーでログインしておきましょう。
仮想サーバー2にWindows Remote Desktop Servicesを導入する
作成したドメイン管理者のユーザーで仮想サーバーにログインします。
仮想サーバー2の管理対象サーバーに物理サーバーを追加
仮想サーバー2のサーバーマネージャーにて、物理サーバー1を追加します。
Find Nowボタンを押すと、追加した物理サーバーが見えると思いますので▲ボタン>OKボタンを押して、追加します。
仮想サーバー2にWindows Remote Desktop Servicesを導入
通常のRoleの導入ではなく、Remote Desktop Services専用のラジオボタンを選びます。
RD Connection Brokerは仮想サーバーを指定します。
RD Virtualization Hostは物理サーバーを指定します。
チェックをONにしてDeployを実行すれば導入できます。
導入が完了すると、以下のようにサーバーマネージャーにRDSのコンソールが出るようになります。
物理サーバーにて、Hyper-Vのネットワークを設定する。
Hyper-Vを起動します
サーバーマネージャーからHyper-V Managerを選ぶ。
NWスイッチを作ります。画面右部のVirtual Switch Managerを選びます。
リモートデスクトップのネットワークが一時的に断線しますが、リモートデスクトップの再接続を行えば復帰できます。
IPの2つ目にポータブルIPの1つのIPを設定し、Metricを1に再設定します。
設定の正しさを確認するために、コマンドプロンプトでDHCPサーバーに割り当てたポータブルIPにPingが通ることを確認しておく。
物理サーバー1で、RDS用の仮想マシンテンプレートをセットアップする。
物理サーバーにて、仮想マシンをHyper-Vに搭載します。
この搭載された仮想マシンは Windowsにて、Sysprepコマンドで初期化しておく必要があります。
(MSのWebサイトにいくと、開発用の仮想マシンなるものもありますが、こういった構築してみるテストで使っていいのかはわかりません。実運用するときはライセンスを買いましょう。ライセンスは普通のものではダメで仮想マシンとして使う用の特別なものが必要となります)
https://developer.microsoft.com/ja-jp/windows/downloads/virtual-machines/ )
サーバーマネージャーからHyper-V Managerを選ぶ。
Windowsを入れます。細かい画面は省略します。
ユーザー名は何でもいいです。
物理サーバー1上の仮想マシンをSysprepでテンプレート化する
その上で、Windowsにログインし、コマンドプロンプトを起動します。
コマンドラインで以下のフォルダに移動
C:¥Windows¥System32¥Sysprep
VMウィンドウの「クリップボードからテキストを入力する」を選び、コマンドを実行する
sysprep /oobe /generalize /shutdown /mode:vm
実行すると、Sysprepで自動的にシャットダウンされます。
これでテンプレート化が完了です。
RDSコンソール画面から、仮想マシンを導入してみる。
RD Collectionを作ることで仮想マシンを実装できます。
RDSの仮想マシン作成のための事前準備
RDSが仮想マシンを作るためにはWindows Serverの一部区画にアクセス権限が必要となります。
OUへのコンピューター作成権限付与
AD User and Computerにて、OUに権限を付与します。
メニューのViewを選択し、Advanced Futures(拡張表示)を選びます
そうすると、権限設定のダイアログが出てくるのでObject Typesをクリックし、Computersを追加します。
Create Computre objectとDelete Computer objectにチェックを入れてOKを押す
これで権限が付与できました。
さらに権限付与するので、またAddを押します。
同じように、principalに仮想サーバーを選びます。
その上で、Applies to を Descendant Computer objectsを選びます。
そして、Full ControlのチェックをオンにしてOKを押します。
### ユーザープロファイル用共有フォルダ
仮想マシンのユーザーごとの情報を格納するユーザープロファイルを作ります。
今回は共有フォルダとして作り、OUと同様にアクセス権限を付与します。
対象フォルダのプロパティのSharingタブを選び、Advanced Sharingを選びます。
OU権限付与と同じ手順でComputreにチェックを入れ、仮想サーバーを選べびます。
RD Collection作成
RD Virtualization Hostにある、Create Collectionを選びます。
今回は、端末をログアウトごとにリフレッシュするプール型を選びます。
プールされた仮想マシンと個人用仮想マシンの違いはMSの情報を参照ください。
先ほど作った仮想マシンのテンプレートが見えるので、選びます。
コレクションの仮想マシンにログインするユーザーを指定します。
ここでは今回作ったドメインのドメインユーザーが対象となっています。
ユーザープロファイルディスクの格納場所を指定します。
ここで指定したCドライブのフォルダは、新規作成でつくったユーザープロファイル用の共有フォルダです。
Createを押して構築します。
仮想マシンのバージョンをアップする(Collectionを再作成)
バージョンアップには、バージョンアップされたテンプレートVMを用意し、Collectionを再作成します。
既存のCollectionを用いて、再作成します。
RDS管理画面から、Collectionの再作成を選びます。
テンプレートVMを設定。
つまり、バージョンアップしたテンプレートを用意しておけば、バージョンアップができるということです。
仮想マシンを増やしたいときは、物理サーバー2を追加し、Collectionに仮想マシンを追加するか、Collectionを再作成します。
前提作業
物理サーバー2をオーダーします。
物理サーバー1と同じように、各サーバー共通の設定(NICの設定)を行った後、ドメインに参加します。
仮想サーバー2の管理サーバーに物理サーバー2を追加
そして、仮想サーバー2(RDS管理サーバー)にて、Add Serverでサーバーを追加します。
物理サーバー2のRDSサーバーとして役割の追加とNWスイッチの設定
RDSの管理サーバーにて、Add RD Virtualization Host serversを選び、物理サーバー2を追加します。
物理サーバー2を選びます。この時、画面下部の仮想スイッチの作成はOFFにします。
参考)物理サーバー2にHyper-Vが導入されているはずです。
物理サーバー2にログインして、Hyper-Vの仮想スイッチの設定を行います。設定方法は物理サーバー1と同じです。
*仮想スイッチの対象がわからないときは、次の画面のようにNetworkの設定を確認し、Private NetworkのTeamedを選ぶ。
物理サーバー1と同様に、仮想スイッチを作成後、仮想スイッチにポータブルIPの1つを割り当てする。
Addボタンを押し、Portable IPを追加する。
Metricが1ではない場合、1に変更しておく。
既存のCollectionにVMを追加する。
## 物理サーバー1,2のVMの配置数を再構成するために新たにCollectionを作る
既存のCollectionが削除されていることを前提に進めます。
CollectionはRemove Collectionで削除できます。
ただし、User Profileも使えなくなるので、サーバー追加の時は既存にVM数を増やす方法をとったほうが良いです。
Windows Remote Destkop Servicesを使った、仮想マシンへのアクセスの仕方
1.RD Webにアクセスし、リモートデスクトップのアクセス情報を取得。
2.アクセス情報のショートカットを修正
3.ショートカットを使ってRD Connection Brokerのサーバーにアクセス
4.RD Connection Brokerが適切な仮想マシンへ接続をリダイレクトし、接続完了する
RD Webへのアクセスによるアクセス情報取得から、仮想マシンへの接続までの手順
RD Webをインストールしたサーバーにアクセスします。
https://10.x.x.x/RDWeb/
ログインのUserName ,Passwordは、少なくとも初期手順にあったADのOU内で作ったユーザーで試すことができます。
Collectionを選ぶことで、対象端末にアクセスするショートカットがダウンロードされる。
ただし、ショートカットはRD Connection Serverのホスト名が記載されており、ローカルPCは名前解決できないので、ローカル端末のHosts編集あるいは、ショートカットの名前をRD Connection ServerのPrivate IPに変更する必要があります。
ホスト名をIPに変更した例(18、19行目参照)
参考情報)RDSの内部的な振る舞い。
・ログインするとユーザープロファイルディスクがつくられます。
・2ユーザーでログインした際にRDS管理画面を見ると、RD Connection Serverを踏み台にして、物理サーバー1と物理サーバー2の仮想マシンに分散して同時並行でログインができていることがわかります。
終わりに
今回は、RDS仮想化ホストの構築を行なってみました。
狙い通り、仮想サーバーと物理サーバーで実装ができました。
また、スケールアウトを想定した物理サーバーの追加と物理サーバー上の仮想マシンの追加も行なえることがわかりました。
細かい設定や運用監視については省略しているので、その辺りについても設計したい場合はシステム構築の専門家(SIベンダーなど)に相談するようにしましょう。
補足1:ポータブルサブネットのオーダー(*1)
サブネットの作成から、以下のような設定でオーダーすれば作れます。
補足2:トラブル系情報
1.VMの作成時にOUへのアクセス権限が足りないというエラーが出る
・権限が不足しているかの確認方法
https://thewolfblog.com/2014/03/26/deploying-vdi-for-rds-2012-2012r2-part-i/
・あるいはADとRDS管理サーバーを同居している可能性。その場合、エラーになります。
https://ogawad.hatenablog.com/entry/20140630/1404142403
2.仮想スイッチが作成できない場合、以下の対応で解決できる可能性がある。
https://techgenix.com/resolving-problems-creating-a-hyper-v-virtual-switch/