目標
Google Cloud Platform (GCP)上にUbuntu環境のvirtual machine (VM)インスタンスを作成し、Remote Desktop Protocol (RDP)経由で接続する。
この手の記事はググると沢山出てくるのだが、それらに従って構築した際にそこそこトラブったので、自分用メモ&トラブルシューティングとして書き残しておく。
前提知識
- GCP
- SSH
- RDP
環境
- ローカル
- Windows 11 Pro 22H2
- VM
- GCPは無料トライアル枠の個人アカウント
- Ubuntu 18.04 LTS(これから作成)
1. GCPでVMインスタンスを作成する
1.1 GCPのアカウントとプロジェクトを作成する
この辺を参考にして進める。
1.2 VMインスタンスを作成する
GCPコンソール
> ≡
> Compute Engine
> 仮想マシン
> VMインスタンス
に行く。
APIを有効にしていなければ有効にする。
+インスタンスを作成
をクリックし、好きなVMインスタンスを作成する。今回は以下の通りにする。
項目 | 値 | 参照 |
---|---|---|
名前 | instance-ubuntu-1 | |
リージョン | asia-northeast-1 | |
ゾーン | asia-northeast1-b | |
ブートディスクOS | Ubuntu 18.04 LTS | |
ブートディスクサイズ | 50 GB | |
アクセススコープ | すべてのCloud APIに完全アクセス権を許可 | 1.4 |
ファイアウォール |
HTTPトラフィックを許可する をオン |
1.3 |
ネットワークタグ | fw-allow-iap |
1.3 |
これら以外の項目の値はデフォルトから変更なし。今回はとりあえずRDP接続さえできればいいので、スペック等には拘らず必要最低限の項目のみ設定した。
本当はネットワークとサブネットもデフォルトではなく自分で作成したものを使った方がよい。
設定が終わったら作成
をクリックする。
1.3 ファイアウォールを作成する
作成したVMインスタンスに誰でも接続できるのはセキュリティ上よろしくないので、ファイアウォールを利用して接続を制限する。ここではGCPからのSSHとRDPのみを許可する。
GCPコンソール
> ≡
> VPCネットワーク
> ファイアウォール
から+ファイアウォールルールの作成
をクリックして、下記のルールを作成する。
項目 | 値 |
---|---|
名前 | fw-allow-iap |
ログ | オン |
ターゲットタグ | fw-allow-iap |
送信元IPv4範囲 | 35.235.240.0/20 |
プロトコルとポート | TCP 20,3389 |
その他の項目の値はデフォルトのまま。
ログ
はデバグ用にオン
にしたが、後でオフにしてよい。
fw-allow-iap
はIdentity-Aware Proxy (IAP)の設定。IAPとは外部インターネットからVirtual Private Cloud (VPC)に接続するための踏み台みたいなもので、35.235.240.0/20
からtcp:20
(SSH)とtcp:3389
(RDP)の接続を許可する(下図)。
1.2ではSSHとRDPに加えて一般のHTTPトラフィックも有効にしたが、これはVMインスタンスにGUI環境を導入するときにapt get
等をするため。構築後にHTTPトラフィックをする予定がない場合、構築完了後に無効にした方がよい (4.2)。
1.4 IAPを有効にする
GCPコンソール
> ≡
> セキュリティ
> Identity-Aware Proxy
からAPIを有効にする
をクリックして、IAPのAPIを有効にする。
有効にしたAPIの一覧はAPIとサービス
> 有効なAPIとサービス
から確認できる。
1.5 サービスアカウントにIAMロールを付与する
作成したVMインスタンスをクリック > APIとIDの管理
からサービスアカウント
を確認しておく。
GCPコンソール
> ≡
> IAMと管理
> IAM
から、上で確認したサービスアカウントの鉛筆アイコンをクリックして、下記のロールを追加する。
- Computeインスタンス管理者 (v1)
- IAPで保護されたトンネルユーザー
組織アカウントでVMインスタンスを作成している場合、VMインスタンスのメタデータとして
enable-oslogin
をTRUE
にしていることがある(参考)。その場合はCompute OSログイン
ロールも追加する。
これで1.2で作成したVMインスタンスにSSH接続できるようになった。
1.6 VMインスタンスにSSHで接続する
作成したVMインスタンスの接続
> SSH
をクリック。
2. VMにリモートデスクトップ環境を導入する
1.6の画面上で以下の作業を行う。
2.1 インストール済みパッケージのアップデート
お決まりのやつ。
$sudo apt update
$sudo apt -y upgrade
2.2 ユーザの追加
$sudo adduser xxxxx(ユーザ名)
パスワードの設定を求められるので、好きなパスワードを設定する。続いてフルネームやら電話番号やらの入力もできるが、空白のままエンターキー連打でOK。
次に、作成したユーザに
$sudo gpasswd -a xxxxx(ユーザ名) sudo
でsudo
権限を与える。
2.3 Gnomeデスクトップのインストール
VMインスタンスにGUI環境を導入する。今回はGNOMEデスクトップを採用する。
$sudo apt -y install ubuntu-desktop
インストール完了までそこそこ($>$10分)時間がかかるので注意。完了したら再起動する。
$sudo reboot
(再起動するとSSHウィンドウごと切れるので再びSSH
をクリックしてSSHする。接続に失敗することがあるが、再接続
をクリックするとそのうち成功する。)
結果
ディスプレイマネージャにgdm3
が正しく設定されている。
$cat /etc/X11/default-display-manager
/usr/sbin/gdm3
GNOME以外のデスクトップについてはこの辺を参照。
2.4 XRDPのインストール
XRDPはLinux用のRDPサーバソフトウェア。バックエンドとしてxorgxrdpを用い、システムのX Window System (X.org)上にデスクトップを表示させる。
$sudo apt install -y xrdp
カーソルの設定を変更する。
$sudo sed -e 's/^new_cursors=true/new_cursors=false/g' -i /etc/xrdp/xrdp.ini
上で作成したユーザに移動して……
$su xxxxx(上で作成したユーザ名)
$cd
~/.xsession
を作成する。
$sudo echo "gnome-session" > ~/.xsession
$chmod +x ~/.xsession
~/.xsessionrc
を作成する。
$DESKTOP=/usr/share/ubuntu:/usr/local/share:/usr/share:/var/lib/snapd/desktop
$cat << EOF > ~/.xsessionrc
export GNOME_SHELL_SESSION_MODE=ubuntu
export XDG_CURRENT_DESKTOP=ubuntu:GNOME
export XDG_DATA_DIRS=${DESKTOP}
export XDG_CONFIG_DIRS=/etc/xdg/xdg-ubuntu:/etc/xdg
EOF
認証ダイアログを繰り返し表示させないようにする。
$cat << EOF | sudo tee /etc/polkit-1/localauthority/50-local.d/xrdp-color-manager.pkla
[Netowrkmanager]
Identity=unix-user:*
Action=org.freedesktop.color-manager.create-device
ResultAny=no
ResultInactive=no
ResultActive=yes
EOF
$cat << EOF | sudo tee /etc/polkit-1/localauthority/50-local.d/45-allow-colord.pkla
[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
[Allow Package Management all Users]
Identity=unix-user:*
Action=org.debian.apt.*;io.snapcraft.*;org.freedesktop.packagekit.*;com.ubuntu.update-notifier.*
ResultAny=no
ResultInactive=no
ResultActive=yes
EOF
$sudo systemctl restart polkit
XRDPユーザをssl-certグループに追加する。
$sudo gpasswd -a xrdp ssl-cert
XRDPを再起動する。
$sudo systemctl restart xrdp
$sudo systemctl enable xrdp.service
$sudo systemctl enable xrdp-sesman.service
XRPが起動していることは下記の通り確認できる。
user@instance-ubuntu-1:~$ sudo systemctl status xrdp
● xrdp.service - xrdp daemon
Loaded: loaded (/lib/systemd/system/xrdp.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2023-04-17 04:41:38 UTC; 31s ago
Docs: man:xrdp(8)
man:xrdp.ini(5)
Main PID: 17978 (xrdp)
Tasks: 1 (limit: 4656)
CGroup: /system.slice/xrdp.service
└─17978 /usr/sbin/xrdp
Apr 17 04:41:37 instance-ubuntu-1 systemd[1]: Starting xrdp daemon...
Apr 17 04:41:37 instance-ubuntu-1 xrdp[17977]: (17977)(139958685501248)[DEBUG] Testing if xrdp can listen on 0.
Apr 17 04:41:37 instance-ubuntu-1 xrdp[17977]: (17977)(139958685501248)[DEBUG] Closed socket 7 (AF_INET6 :: por
Apr 17 04:41:37 instance-ubuntu-1 systemd[1]: xrdp.service: Can't open PID file /var/run/xrdp/xrdp.pid (yet?) a
Apr 17 04:41:38 instance-ubuntu-1 systemd[1]: Started xrdp daemon.
Apr 17 04:41:39 instance-ubuntu-1 xrdp[17978]: (17978)(139958685501248)[INFO ] starting xrdp with pid 17978
Apr 17 04:41:39 instance-ubuntu-1 xrdp[17978]: (17978)(139958685501248)[INFO ] listening to port 3389 on 0.0.0.
3. リモートデスクトップに接続する
今回は外部IPアドレス経由ではなくIAP経由でログインする。
3.1 gcloudのインストール
接続元(ローカルPC)のターミナルにgcloudをインストールする。手順は省略。
3.2 IAPトンネリング
接続元からVMインスタンスへのIAP接続を確立する。
$gcloud compute start-iap-tunnel [インスタンス名] 3389 \
--zone=[ゾーン名] \
--project=[プロジェクト名] \
--local-host-port=localhost:[ポート番号]
例えば
-
[インスタンス名]
: 今回はinstance-ubuntu-1
-
[ゾーン名]
: 今回はasia-northeast1-b
-
[ポート番号
]: 接続元のポート番号。今回は13389
に設定する(0
を入れれば空いている番号が自動で割り当てられる)。
結果
$gcloud compute start-iap-tunnel instance-ubuntu-1 3389 \
--zone="asia-northeast1-b" \
--project=[project_name] \
--local-host-port=localhost:13389
WARNING:
To increase the performance of the tunnel, consider installing NumPy. For instructions,
please see https://cloud.google.com/iap/docs/using-tcp-forwarding#increasing_the_tcp_upload_bandwidth
Testing if tunnel connection works.
Listening on port [13389].
これでlocalhost:13389
につなげばIAP経由でVMインスタンスにログインできるようになる。
3.3 接続を実行する
Windowsにデフォルトで入っているリモートデスクトップ接続
アプリケーションを使って接続する。
アプリケーションを立ち上げ、オプションの表示
から
-
ローカルリソース
タブ >ローカルデバイスとリソース
のプリンター
-
エクスペリエンス
タブのビットマップのキャッシュを保持
のチェックを外して、オプションを閉じる。
コンピュータ
欄にlocalhost:13389
を入力し、接続
をクリックする。
警告は無視して進んでOK。
3.4 ログインする
2.2で設定したユーザとパスワードを入力して、少しの間待つ。
成功!
4. 後処理
4.1 接続を切る
Ubuntuデスクトップの右上にあるメニューからログオフする。
接続元のターミナルでCtrl+C
でIAPを切断する。
4.2 外部IPアドレスを削除する
*この作業は任意です。
セキュリティ確保のため、今後はIAP経由のログインのみを許可することにする。
VMインスタンス一覧に戻る > instance-ubuntu-1
をクリック > 編集
から
項目 | 値 |
---|---|
ネットワークインターフェース |
外部IPv4アドレス をなし に設定 |
ファイアウォール |
Allow HTTP traffic のチェックを外す |
のように設定し、作成
をクリックする。
結果
4.3 インスタンスを停止する
インスタンスの起動中は課金が発生するため、使い終わったら停止すること。
うっかり防止のため停止をスケジューリングしてもよい。
ハマったところ
IAPにつながらない
問題
IAPにつなごうとしても
ERROR: (gcloud.compute.start-iap-tunnel) While checking if a connection can be made: Error while connecting [4003: 'failed to connect to backend']. (Failed to connect to port 3389)
と表示され、つながらない。
解決
ファイアウォールを正しく設定した (1.3)。
ログインした瞬間に接続が切れる
問題
3.4に従ってRDP接続すると、アカウントを入力して接続しようとした瞬間に接続が切れる。
解決
前者をサボると、VMインスタンスの/var/log/xrdp.log
における
[WARN ] local keymap file for ~~~~~ found and doesn't match built in keymap, using local keymap file
という怒られの原因になる。
ログインが青い画面のまま進まない
問題
3.4に従ってRDP接続すると、青い画面(緑色の画面)のまま応答がない。5分くらい待つと
connecting to sesman ip ~~~~ port 3389
sesman connect ok
sending login info to session manager, please wait...
login successful for display 10
started connecting
connection problem, giving up
some problem
と表示され、接続できない。
解決
-
~/.xsession
を作成する (2.4)。 -
$pkill gnome-session
を実行し、ログイン済みの他ユーザのセッションを切断する。
トラブルシューティング
トラブルの際はVMインスタンスにある下記ファイルをチェックすると解決のヒントになる。
/var/log/xrdp.log
/var/log/xrdp-sesman.log
~/.xsession-errors
参考
構築の際に参考にしたもの
下記のサイトを中心に参考にしたが、どのサイトの手順も微妙に足りない部分があったため、試行錯誤の末今回の記事のような手順になった。
- GCPでUbuntu Desktopの環境を作り、従量課金制(10円/h)のGUI PCを作ろう
- IAP を使って外部 IP を持たない Compute Engine(WindowsVM)にリモートデスクトップ接続する方法
- Ubuntu on GCP にリモートデスクトップ接続
- Ubuntu 18.04: GNOMEデスクトップ環境にXRDPで接続する
- Ubuntu18.04LTS(GCP)にWindowsリモートデスクトップ接続
- Ubuntu 20.04 LTS に GUI(GNOME デスクトップ)をインストールする
トラブルシューティングで参考になったもの
- リモートデスクトップ接続がすぐに切れる場合の原因と対処
- Linuxにリモートデスクトップで入った時に出るダイアログを消す
- pkill gnome-session
- screen stays blue for a really long time and then errors out
- xrdpユーザをssl-certに追加する
今回のケースには当てはまらなかったもの
トラブルシューティングの際に下記の解決策も試したが、結果的に今回のケースには関係ないことが分かり、最終的には 適用しなかった もの。