LoginSignup
4
2

More than 1 year has passed since last update.

GCP Ubuntu VMにリモートデスクトップ接続する

Last updated at Posted at 2023-04-17

目標

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接続さえできればいいので、スペック等には拘らず必要最低限の項目のみ設定した。

本当はネットワークとサブネットもデフォルトではなく自分で作成したものを使った方がよい。

設定が終わったら作成をクリックする。

結果
スクリーンショット 2023-04-17 162455.png

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)の接続を許可する(下図)。

image.png

引用元: 踏み台サーバはもういらない。IAP(Identity-Aware Proxy)の便利な使い方

1.2ではSSHとRDPに加えて一般のHTTPトラフィックも有効にしたが、これはVMインスタンスにGUI環境を導入するときにapt get等をするため。構築後にHTTPトラフィックをする予定がない場合、構築完了後に無効にした方がよい (4.2)。

結果
スクリーンショット 2023-04-17 162714.png

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-osloginTRUEにしていることがある(参考)。その場合はCompute OSログインロールも追加する。

これで1.2で作成したVMインスタンスにSSH接続できるようになった。

1.6 VMインスタンスにSSHで接続する

作成したVMインスタンスの接続 > SSHをクリック。

結果
スクリーンショット 2023-04-17 114349.png

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。

結果
image.png

3.4 ログインする

2.2で設定したユーザとパスワードを入力して、少しの間待つ。

結果
image.png

成功!

4. 後処理

4.1 接続を切る

Ubuntuデスクトップの右上にあるメニューからログオフする。
接続元のターミナルでCtrl+CでIAPを切断する。

4.2 外部IPアドレスを削除する

*この作業は任意です。

セキュリティ確保のため、今後はIAP経由のログインのみを許可することにする。
VMインスタンス一覧に戻る > instance-ubuntu-1をクリック > 編集から

項目
ネットワークインターフェース 外部IPv4アドレスなしに設定
ファイアウォール Allow HTTP trafficのチェックを外す

のように設定し、作成をクリックする。

結果

  • 外部IPの値が空白になっており、ネットワークタグfw-allow-iapのみになっている。
  • 引き続きSSH (1.6)とIAP経由のRDP (3)で接続できる。

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接続すると、アカウントを入力して接続しようとした瞬間に接続が切れる。

解決

  • XRDPユーザをssl-certグループに追加する (2.4)。
  • リモートデスクトップ接続アプリケーションのオプションを適切に設定する (3.3)。

前者をサボると、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

参考

構築の際に参考にしたもの

下記のサイトを中心に参考にしたが、どのサイトの手順も微妙に足りない部分があったため、試行錯誤の末今回の記事のような手順になった。

トラブルシューティングで参考になったもの

今回のケースには当てはまらなかったもの

トラブルシューティングの際に下記の解決策も試したが、結果的に今回のケースには関係ないことが分かり、最終的には 適用しなかった もの。

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2