今回は第208回 以来約8年ぶりに、X Window Systemで動作するRDP(Remote Desktop Protocol)サーバーである、xrdpを使用する方法を紹介します。
Ubuntuとxrdp
xrdp をめぐる状況は、第208回 で紹介したときとはずいぶんと変わっています。
第549回 で少し取り上げましたが、Hyper-Vクイック作成でインストールできるUbuntuにはすでにxrdpがインストールされており、拡張セッション機能を提供する役割を担っています。
もちろんxrdpはHyper-V専用ではありません。Hyper-Vクイック作成を使用しないでUbuntuをインストールした場合は、linux-vm-tools にあるシェルスクリプトを実行すれば拡張セッションを有効にできます。よって、このシェルスクリプトを参考にすればHyper-V環境下でなくてもいい感じにxrdpが使用できるという推測が成り立ちます。
今回はUbuntu 20.04 LTSでしか動作確認していませんが、18.04 LTSなどでも同様に動作するでしょう。
なお、注意というほどでもないのですが、本記事の公開時点でUbuntu 20.04 LTS用のスクリプトはPull Request の状態にあり、今後リリースされるものとは差異がある可能性があります。しかし筆者の環境で数日運用した限りでは特にエラーなどは表示されませんでしたので、問題ないものと思われます。
準備
いうまでもありませんがUbuntu 20.04 LTSを準備します。実機にxrdpをインストール機会がどの程度あるかはわかりませんが、まずは仮想マシンで試してみるのがいいでしょう。
xrdpをインストールするには、端末を起動して次のコマンドを実行してください。
$ sudo apt install xrdp
実はこの状態でもxrdpが使用できますが、セッションがおかしくなってしまいます(図1 )ので、続けて次項で説明することを行ってください。
図1 何も設定しない状態でxrdp経由でログインすると、左側にDockが表示されないなどの差異がある
実行するスクリプト
次の内容でシェルスクリプトを作成します。例としてスクリプト名はenhanced-session-mode.shとし、Ubuntu 20.04 LTSのホームフォルダーにコピーしたものとします。
なお前述のとおりlinux-vm-toolsのリポジトリにあるスクリプトを参考にしていますが、一部変更しています。
#!/bin/sh
# Add script to setup the ubuntu session properly
if [ ! -e /etc/xrdp/startubuntu.sh ]; then
cat >> /etc/xrdp/startubuntu.sh << EOF
#!/bin/sh
export GNOME_SHELL_SESSION_MODE=ubuntu
export XDG_CURRENT_DESKTOP=ubuntu:GNOME
exec /etc/xrdp/startwm.sh
EOF
chmod a+x /etc/xrdp/startubuntu.sh
fi
sed -i_orig -e 's/startwm/startubuntu/g' /etc/xrdp/sesman.ini
# rename the redirected drives to 'shared-drives'
sed -i -e 's/FuseMountName=thinclient_drives/FuseMountName=shared-drives/g' /etc/xrdp/sesman.ini
# Changed the allowed_users
sed -i_orig -e 's/allowed_users=console/allowed_users=anybody/g' /etc/X11/Xwrapper.config
# Configure the policy xrdp session
cat > /etc/polkit-1/localauthority/50-local.d/45-allow-colord.pkla <<EOF
[Allow Colord all Users]
Identity=unix-user:*
Action=org.freedesktop.color-manager.create-device;org.freedesktop.color-manager.create-profile;org.freedesktop.color-manager.delete-device;org.freedesktop.color-manager.delete-profile;org.freedesktop.color-manager.modify-device;org.freedesktop.color-manager.modify-profile
ResultAny=no
ResultInactive=no
ResultActive=yes
EOF
# https://askubuntu.com/questions/1193810/authentication-required-to-refresh-system-repositories-in-ubuntu-19-10
cat > /etc/polkit-1/localauthority/50-local.d/46-allow-update-repo.pkla<<EOF
[Allow Package Management all Users]
Identity=unix-user:*
Action=org.freedesktop.packagekit.system-sources-refresh
ResultAny=yes
ResultInactive=yes
ResultActive=yes
EOF
このスクリプトにはあまり解説すべきところはありません。3行目から20行目までがxrdp自体の設定であり、22行目から40行目までがxrdp使用中にパスワードを聞かれることがあるため、それを防ぐための設定です。32行目から40行目まではlinux-vm-toolsのスクリプトにはなく独自に追加しています。
次のように実行します。
$ sudo bash ./enhanced-session-mode.sh
実行後は再起動してください。なお、xrdp経由でのログイン時は「ログインのキーリングのロック解除」でパスワードを入力する欄が表示される場合があります(図2 ) 。
図2 「 ログインのキーリングのロック解除」にログインパスワードを入力する
RDPクライアント
Remmina
RDPクライアントを2種類紹介します。まずはUbuntuにインストールされているRemminaです。こちらはバージョンに応じてUIに差異がありますが、設定項目は同じなので18.04 LTSの例で紹介します。
Remminaについては図3 を見てもらえばわかるとおり、「 サーバー」( ホスト名またはIPアドレス)は必須で、「 ユーザー名」と「User password」はなくても構いません。「 解像度」も任意ですが、ここでは「1152x864」としています。これは筆者は仮想マシンをこの解像度で動作させているからであり、深い意味はありません。
図3 Remminaでの設定
「色数」と「共有フォルダー」は注意が必要です。「 色数」は「True color (24bpp)」くらいにしておくのが妥当と思われます。「 GFX」や「RemoteFX」が付いているものにすると接続できませんでした。「 共有フォルダー」はフォルダーであれば何でもいいですが、アルファベットのフォルダーであることが望ましいです。
VPSなどインターネットに直接アクセスできる環境下でRDPを使用する場合は「SSH Tunnel」を設定するのが望ましい(といいつつ事実上必須)ですが、本稿では解説を省略します。間違ってもポート3389を開放するようなことは避けてください。
リモートデスクトップ接続
Windowsにインストールされているリモートデスクトップ接続の場合も、設定する項目自体はほぼ同じです。実のところ第549回 で紹介したのと似たような感じですが、改めて紹介します。
リモートデスクトップ接続の「全般」タブでは「コンピューター」にホスト名またはIPアドレスを入力します。「 ユーザー名」はなくても構いません(図4 ) 。
図4 「 全般」タブの設定
「画面」タブでは解像度と色数を設定してください(図5 ) 。「 ローカルリソース」タブでは「プリンター」のチェックを外し、「 詳細」をクリックしてください(図6 ) 。「 ローカルディスク」にチェックを入れると、手元のハードドライブ(HDDやSSDなど)の共有ができます(図7 ) 。あとは「接続」をクリックして接続してください。
図5 「 画面」タブの設定
図6 「 ローカルリソース」タブでは「プリンター」のチェックを外す
図7 「 ローカルディスク」にチェックを入れると共有フォルダーになる
最近のWindows 10にはsshクライアントがインストールされています。そこで、VPSなどインターネットに直接アクセスできる環境下でRDPを使用する場合は、PowerShellを起動してsshクライアントで3389ポートを転送する、という手も使えます。