VNCとSSHトンネルでOCI Linuxインスタンスに接続する方法

本ブログは、[オラクル・クラウドの個人ブログ](https://qiita.com/letian/items/10152a4fec813c1b7d98)の1つです。

# 初めに
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/327614f8-d8a9-09b3-2212-5e888b168c68.png", width="500", style="border:none;box-shadow:none;">

OCIでOracle Linuxインスタンスを作成した後、デフォルトではGUIデスクトップとVNCサービスがインストールされません。これから、「SSHトンネル＋VNC接続」をセットアップする方法を紹介したいと思います。この接続パターンは、<strong>TCP 5901ポート</strong>をOCIセキュリティ・リスト（またはNSG）に追加する<strong>必要はありません</strong>。 入力ルールには<font color=blue>SSHポート(TCP 22)のみ</font>を許可すればOKです。

__検証環境__

|項目|内容|
|--|--|
|サーバ OS|Oracle Linux 8 (OCI Compute Instance)|
|クライアント OS|Windows Server 2019,2022|
|VNC ソフト|[TigerVNC](https://tigervnc.org/) (v1.12)|
|SSH ソフト|OpenSSH|

今回の接続対象のインスタンスは、直接アクセスできるパブリック・サブネットにあります。もし、インスタンスがプライベート・サブネットにある場合。「<font color=blue>OCI Bastion + SSHトンネル + VNC</font>」のようなソリューションで接続できます。プライベート・サブネット内のインスタンスまたは他のOCIサービスに接続する方法については、私の「[OCI Bastion関連のシリーズ・ブログ](https://qiita.com/liu-wei/items/10152a4fec813c1b7d98#oci-bastion-%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9)」をご参照ください。

__ステップ__
- [1. GNOMEデスクトップのインストール](#1-gnomeデスクトップのインストール)
- [2. TigerVNCのインストールと設定](#2-tigervncのインストールと設定)
- [3. SSHトンネルの作成](#3-sshトンネルの作成)
- [4. VNC接続の作成](#4-vnc接続の作成)
- [接続の問題](#接続の問題)
  - [自動スクリーン・ロック](#自動スクリーンロック)
  - [認証が必要なプロンプト](#認証が必要なプロンプト)

# 1. GNOMEデスクトップのインストール
__インストール__
コマンド: `sudo dnf groupinstall "Server with GUI" -y`
数分間かかります。

グラフィカル・モードをデフォルトのタイプとして設定します。
コマンド: `sudo systemctl set-default graphical`
```bash
[opc@linux8 ~]$ sudo systemctl set-default graphical
Removed /etc/systemd/system/default.target.
Created symlink /etc/systemd/system/default.target → /usr/lib/systemd/system/graphical.target.
[opc@linux8 ~]$
```
サーバーを再起動します（OCIコンソールから再起動することをお勧めします）。

__設定ファイルの編集__
再起動後、インスタンスにログインし、ファイル「<font color=blue>/etc/gdm/custom.conf</font>」の次の行のコメントを解除します。その目的は、VNCがWaylandの代わりにX.orgを使用するようにします。
`WaylandEnable=False`

編集後は、次のようになります（opcユーザーで編集する時、sudoを付けてください）。
```bash
[opc@linux8 ~]$ sudo cat /etc/gdm/custom.conf
# GDM configuration storage

[daemon]
# Uncomment the line below to force the login screen to use Xorg
WaylandEnable=false

[security]

[xdmcp]

[chooser]

[debug]
# Uncomment the line below to turn on debugging
#Enable=true

[opc@linux8 ~]$
```

# 2. TigerVNCのインストールと設定
__インストール__
`sudo dnf install tigervnc-server tigervnc-server-module -y`

```bash
[opc@linux8 ~]$ sudo dnf install tigervnc-server tigervnc-server-module -y
......
Installed:
  tigervnc-selinux-1.12.0-4.el8.noarch     tigervnc-server-1.12.0-4.el8.x86_64     tigervnc-server-module-1.12.0-4.el8.x86_64

Complete!
[opc@linux8 ~]$
```

__VNCパスワードの設定__
※、パスワードは8文字を超えてはいけません。

```bash
[opc@linux8 ~]$ vncpasswd
Password:
Verify:
Would you like to enter a view-only password (y/n)? n
A view-only password is not used
[opc@linux8 ~]$
```

__VNCサービスの設定__
VNCサービスのディスプレイ番号とユーザー名をファイル「<font color=blue>/etc/tigervnc/vncserver.users</font>」に追加します。
`:1=username`

編集後は、次のようになります（opcユーザーで編集する時、sudoを付けてください）。
```bash
[opc@linux8 ~]$ cat /etc/tigervnc/vncserver.users
# TigerVNC User assignment
#
# This file assigns users to specific VNC display numbers.
# The syntax is <display>=<username>. E.g.:
#
# :2=andrew
# :3=lisa

:1=opc
[opc@linux8 ~]$
```

画面解像度をファイル「<font color=blue>/etc/tigervnc/vncserver-config-defaults</font>」に追加します。
`geometry=1280x1024`

編集後は、次のようになります（opcユーザーで編集する時、sudoを付けてください）。
```bash
[opc@linux8 ~]$ cat /etc/tigervnc/vncserver-config-defaults
## Default settings for VNC servers started by the vncserver service
#
# Any settings given here will override the builtin defaults, but can
# also be overriden by ~/.vnc/config and vncserver-config-mandatory.
#
# See HOWTO.md and the following manpages for more details:
#     vncsession(8) Xvnc(1)
#
# Several common settings are shown below. Uncomment and modify to your
# liking.

# session=gnome
# securitytypes=vncauth,tlsvnc
# geometry=2000x1200
# localhost
# alwaysshared

# Default to GNOME session
# Note: change this only when you know what are you doing
session=gnome
geometry=1280x1024
[opc@linux8 ~]$
```

__VNCサービスの起動__
コマンド:
`sudo systemctl daemon-reload`
`sudo systemctl enable --now vncserver@:1.service`

```bash
[opc@linux8 ~]$ sudo systemctl daemon-reload
[opc@linux8 ~]$ sudo systemctl enable --now vncserver@:1.service
Created symlink /etc/systemd/system/multi-user.target.wants/vncserver@:1.service → /usr/lib/systemd/system/vncserver@.service.
[opc@linux8 ~]$
```

VNCサービスのステータスを確認します。
コマンド: `sudo systemctl status vncserver@:1.service`
```bash
[opc@linux8 ~]$ sudo systemctl status vncserver@:1.service
● vncserver@:1.service - Remote desktop service (VNC)
   Loaded: loaded (/usr/lib/systemd/system/vncserver@.service; enabled; vendor preset: disabled)
   Active: active (running) since Mon 2022-05-30 04:36:48 GMT; 8s ago
  Process: 30049 ExecStart=/usr/libexec/vncsession-start :1 (code=exited, status=0/SUCCESS)
  Process: 30038 ExecStartPre=/usr/libexec/vncsession-restore :1 (code=exited, status=0/SUCCESS)
 Main PID: 30059 (vncsession)
    Tasks: 0 (limit: 100056)
   Memory: 1.0M
   CGroup: /system.slice/system-vncserver.slice/vncserver@:1.service
           ? 30059 /usr/sbin/vncsession opc :1

May 30 04:36:48 linux8 systemd[1]: Starting Remote desktop service (VNC)...
May 30 04:36:48 linux8 systemd[1]: Started Remote desktop service (VNC).
[opc@linux8 ~]$
```

# 3. SSHトンネルの作成
この例は、WindowsクライアントとOpenSSHを使用しています。
OpenSSHのインストール方法：PowerShellを起動して、以下のコマンドを実行する（管理者ユーザで実行）。

`Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*'`

秘密キーを`C:\Users\<username>\.ssh`の下に保存し、次のコマンドでSSHトンネルを作成します。
`ssh -L 5901:localhost:5901 opc@<IP address or Hostname>`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/11312553-cbf2-dfae-2e11-bce3d3b9a31e.png)

# 4. VNC接続の作成
TigerVNCを起動し、「localhost:5901」と入力して、「接続」ボタンをクリックします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/14346f04-d6ab-079d-9806-e2acf9bd8938.png", width="450">
CMDから次のコマンドを実行して開始することもできます。
`"C:\Program Files (x86)\TigerVNC\vncviewer.exe" localhost:5901`

VNCパスワード（Step-2で作成）を入力し、OKを押します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/5f1824dc-605e-9f9b-bd8b-afe44e1bc3fb.png", width="450">

次のようなデスクトップが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/1b25c2f9-d655-f79c-7c22-d277a3e472ab.png)

# 接続の問題
## 自動スクリーン・ロック
GNOMEデスクトップとVNCをインストールした後、しばらく経ってから初回ログインする場合、次のように画面ロックが表示されることがあります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/45988db6-1f07-6a66-99aa-625599da5608.png", width="400">
デフォルトでは、`opc`ユーザに対しSSHキー認証を使用するため、パスワードはありません。この問題は2つの方法で回避できます。

- インスタンスに SSH ログインし、コマンド`sudo passwd opc`を実行して`opc`ユーザーのパスワードを作成します。 作成したパスワードを上記画面に入力し、「ロック解除」ボタンを押してください。
- インスタンスを再起動し、すぐに再ログインする（ `opc`のパスワードを作成したくない場合）。


ロック解除ができたら、GNOMEデスクトップに表示されます。必要に応じて、自動ロックを無効にすることができます。

自動ロックを無効にする方法：
Activities -> Show Applications -> Settings -> Privacy -> Screen Lock
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/3c8a62de-cfbf-ed59-e08f-e081cd6f4d19.png)

## 認証が必要なプロンプト
私が下記のプロンプト画面に遭ったことがありますが、「キャンセル」をクリックしてスキップしました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/624a5809-6123-997b-2fec-99403380f2b2.png", width="400">

MOS(My Oracle Support) ドキュメントは、このようなプロンプトを回避する方法を提供しています。
<strong>Authentication Required Prompt When Connecting To A Server Via VNC</strong> [(Doc ID 2358323.1)](https://support.oracle.com/epmos/faces/DocumentDisplay?_afrLoop=109717165313865&parent=EXTERNAL_SEARCH&sourceId=PROBLEM&id=2358323.1)

以上です。

----
__関連記事__
[オラクル・クラウド個人ブログ一覧](https://qiita.com/liu-wei/items/10152a4fec813c1b7d98)
[プライベート・サブネット内のOCI Computeインスタンスに接続する方法のまとめ](#https://qiita.com/liu-wei/items/e0376fd71433d243bce0)
[Oracle LinuxでSQL Developerを利用する方法](https://qiita.com/liu-wei/items/46eb16dbd4f2d665c67f)

__公式ドキュメント__
[Install the VNC Remote Access Server on Oracle Linux](https://docs.oracle.com/en/learn/install-vnc-oracle-linux/#introduction)