Virtual Network Computing (VNC) 接続してみてみた

サーバー管理するにあたって、通常 CLI(Command Line Interface)ですが、時々 GUI(Graphical User Interface)も使いたくなります。
そのときは よく [X Window System](https://qiita.com/shirok/items/9f55879bb3facf89082f) を使うのですが、Virtual Network Computing (VNC)もやってみたくなります。

Virtual Network Computing (VNC) は、ネットワーク経由でキーボードおよびマウスのイベントを送信してリモート マシンを制御するグラフィカル デスクトップ共有システムです。VNC は、グラフィカル デスクトップ環境がインストールされている Oracle Linux サーバーをリモートで制御する場合に特に便利です。互換性のあるソフトウェア クライアントを使用して、VNC サーバーに接続できます。VNC は、複数のターミナルが Oracle Linux サーバーでホストされている同じハードウェア リソースを共有できるシン クライアント コンピューティングに適しています。

ということで、Oracle Cloud Infrastructure (OCI) の Oracle Linux Compute へ VNCサーバーをインストールし、VNCクライアントの Real VNCをインストールした MacBook から接続してみてみてみます。


# ■ 前提条件
　・ 最新の Oracle Linux 8 以降がインストールされているシステム
　・ [RealVNC](https://www.realvnc.com), [TigerVNC](https://tigervnc.org/) などのクライアントソフトウェア



# ■ GUI デスクトップ環境インストール

**1) GNOMEインストール**
GNOME デスクトップ環境とそのすべての依存関係をインストールします。

```
[root@tokyo-inst01 ~]# dnf groupinstall "Server with GUI"
Last metadata expiration check: 2:05:15 ago on Thu 16 Jan 2025 08:06:07 AM GMT.
	Dependencies resolved.
	================================================================================================================================================
	 Package                                       Arch     Version                                                       Repository           Size
	================================================================================================================================================
	Installing:
	 kernel-uek                                    x86_64   5.15.0-304.171.4.el8uek                                       ol8_UEKR7           2.9 M
	 kernel-uek-core                               x86_64   5.15.0-304.171.4.el8uek                                       ol8_UEKR7            62 M
	 kernel-uek-modules                            x86_64   5.15.0-304.171.4.el8uek                                       ol8_UEKR7            71 M
	Upgrading:
	 NetworkManager                                x86_64   1:1.40.16-18.0.1.el8_10                                       ol8_baseos_latest   2.3 M
	 NetworkManager-config-server                  noarch   1:1.40.16-18.0.1.el8_10                                       ol8_baseos_latest   143 k
	 NetworkManager-libnm                          x86_64   1:1.40.16-18.0.1.el8_10                                       ol8_baseos_latest   1.9 M
	・・・
	
	  yelp-tools-3.28.0-3.el8.noarch
	  yelp-xsl-3.28.0-2.el8.noarch
	  zenity-3.28.1-2.el8.x86_64
	
	Complete!
```

# ■ GUI デスクトップ環境設定
## ● グラフィカル モード自動起動設定
ユーザー アカウントのデフォルトのログイン タイプとしてグラフィカル モードを設定し、サーバーを再起動します。
**1) 事前確認**
```
[root@tokyo-inst01 ~]# ls -l /etc/systemd/system/default.target
  lrwxrwxrwx. 1 root root 41 Jan 17  2023 /etc/systemd/system/default.target -> /usr/lib/systemd/system/multi-user.target

[root@tokyo-inst01 ~]# systemctl list-units --type target  | grep multi
  multi-user.target      loaded active active Multi-User System
```


**2) グラフィカル モード自動起動設定**
```
[root@tokyo-inst01 ~]# systemctl set-default graphical
  Removed /etc/systemd/system/default.target.
  Created symlink /etc/systemd/system/default.target → /usr/lib/systemd/system/graphical.target.
```

# ● X.org使用設定
VNC が Wayland ではなく X.org を使用するようにします。


**1) /etc/gdm/custom.conf ファイル・バックアップ**
```
[root@tokyo-inst01 ~]# /etc/gdm/custom.conf /etc/gdm/custom.conf.org
```

**2) /etc/gdm/custom.conf ファイル変更前確認**
```
[root@tokyo-inst01 ~]# 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
```

**3) /etc/gdm/custom.conf 編集**
sedコマンドで /etc/gdm/custom.conf ファイル内の WaylandEnable=false行のコメントを解除
```
[root@tokyo-inst01 ~]# sed '/^#WaylandEnable/s/^#//g' /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
```

# ■ VNCパッケージをインストール
VNC サーバー パッケージとそのすべての依存関係をインストールします。
```
[root@tokyo-inst01 ~]# dnf install -y tigervnc-server tigervnc-server-module
  Last metadata expiration check: 4:05:59 ago on Thu 16 Jan 2025 10:38:22 PM GMT.
	Dependencies resolved.
	================================================================================================================================================
	 Package                                   Architecture              Version                             Repository                        Size
	================================================================================================================================================
	Installing:
	 tigervnc-server                           x86_64                    1.13.1-14.el8_10                    ol8_appstream                    280 k
	 tigervnc-server-module                    x86_64                    1.13.1-14.el8_10                    ol8_appstream                    275 k
	Installing dependencies:
	 tigervnc-selinux                          noarch                    1.13.1-14.el8_10                    ol8_appstream                     51 k
	
	Transaction Summary
	================================================================================================================================================
	Install  3 Packages
	
	Total download size: 605 k
	Installed size: 1.3 M
	Downloading Packages:
	(1/3): tigervnc-server-1.13.1-14.el8_10.x86_64.rpm                                                              1.1 MB/s | 280 kB     00:00
	(2/3): tigervnc-server-module-1.13.1-14.el8_10.x86_64.rpm                                                       1.0 MB/s | 275 kB     00:00
	(3/3): tigervnc-selinux-1.13.1-14.el8_10.noarch.rpm                                                             166 kB/s |  51 kB     00:00
	------------------------------------------------------------------------------------------------------------------------------------------------
	Total                                                                                                           1.9 MB/s | 605 kB     00:00
	Running transaction check
	Transaction check succeeded.
	Running transaction test
	Transaction test succeeded.
	Running transaction
	  Preparing        :                                                                                                                        1/1
	  Running scriptlet: tigervnc-selinux-1.13.1-14.el8_10.noarch                                                                               1/3
	  Installing       : tigervnc-selinux-1.13.1-14.el8_10.noarch                                                                               1/3
	  Running scriptlet: tigervnc-selinux-1.13.1-14.el8_10.noarch                                                                               1/3
	  Installing       : tigervnc-server-1.13.1-14.el8_10.x86_64                                                                                2/3
	  Running scriptlet: tigervnc-server-1.13.1-14.el8_10.x86_64                                                                                2/3
	  Installing       : tigervnc-server-module-1.13.1-14.el8_10.x86_64                                                                         3/3
	  Running scriptlet: tigervnc-server-module-1.13.1-14.el8_10.x86_64                                                                         3/3
	  Verifying        : tigervnc-selinux-1.13.1-14.el8_10.noarch                                                                               1/3
	  Verifying        : tigervnc-server-1.13.1-14.el8_10.x86_64                                                                                2/3
	  Verifying        : tigervnc-server-module-1.13.1-14.el8_10.x86_64                                                                         3/3
	
	Installed:
	  tigervnc-selinux-1.13.1-14.el8_10.noarch      tigervnc-server-1.13.1-14.el8_10.x86_64      tigervnc-server-module-1.13.1-14.el8_10.x86_64
```


# ■ VNCパスワードを設定
リモート セッションに使用する予定のユーザー アカウントの VNC パスワードを作成します。
このコマンドはパスワードの入力を要求し、その後パスワードの検証を再度要求します。
２つ目のパスワードはオプションで、画面を共有できるがマウスやキーボードの制御は許可しない表示専用のパスワードを設定することもできます。

**1) $HOME/.vnc/ディレクトリ無いこと確認**
vncpasswdアクションは、 $HOME/.vnc/ へユーザー アカウントに固有の構成情報を生成します。
```
[root@tokyo-inst01 ~]# ls -l $HOME/.vnc2/
    ls: cannot access '/home/opc/.vnc/': No such file or directory
```

このディレクトリが以前のインストールからすでに存在する場合は、vncpasswd コマンドを実行する前にディレクトリを削除するか、ディレクトリの SELinux コンテキストを復元して、このサービスに対して SELinux の問題が発生しないようにすることができます。
```
restorecon -RFv $HOME/.vnc
```

**2) VNC パスワード作成**
```
[root@tokyo-inst01 ~]# vncpasswd
  Password:
  Verify:
  Would you like to enter a view-only password (y/n)? n
  Password:
  Verify:
```

**3) パスワードファイル確認**
ファイル ~/.vnc/passwd (600) が作成されます。
```
[root@tokyo-inst01 ~]# ls -l ~/.vnc/passwd
  -rw-------. 1 opc opc 16 Jan 17 02:48 /home/opc/.vnc/passwd
```


# ■ VNCサービスを構成
VNC サービスのユーザー アカウントと X サーバー ディスプレイを/etc/tigervnc/vncserver.usersファイルに追加します。

**1) vncserver.users ファイル確認とバックアップ**
```
[root@tokyo-inst01 ~]# 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

[root@tokyo-inst01 ~]# cp /etc/tigervnc/vncserver.users /etc/tigervnc/vncserver.users.backup
[root@tokyo-inst01 ~]# ls -l /etc/tigervnc/ | grep vncserver.user
  -rw-r--r--. 1 root root 157 Feb 28  2023 vncserver.users
  -rw-r--r--. 1 root root 157 Jan 17 03:09 vncserver.users.backup
```

**2) vncserver.users ファイル設定**
```
[root@tokyo-inst01 ~]# echo ":1=$(whoami)"| tee -a /etc/tigervnc/vncserver.users > /dev/null
[root@tokyo-inst01 ~]# 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
```

# ■ VNCサービスの設定
サービスを再ロードし、X サーバー ディスプレイ 1 でVNC サーバーを起動します。
```
[root@tokyo-inst01 ~]# systemctl daemon-reload
[root@tokyo-inst01 ~]# systemctl enable --now vncserver@:1.service
  Created symlink /etc/systemd/system/multi-user.target.wants/vncserver@:1.service → /usr/lib/systemd/system/vncserver@.service.
```





# ■ (オプション) X509暗号化を構成
デフォルトでは、VNC は暗号化されたプロトコルではないため、保護されていないネットワーク経由でアクセスするには SSH トンネルを使用する必要があります。X509 TLS を設定して VNC セッションを暗号化できますが、クライアント ソフトウェアが X509Vnc 暗号化をサポートし、証明書の署名に使用される CA 証明書にアクセスできる必要があります。
CA 署名付き証明書がない場合は、自己署名証明書を使用できますが、接続するにはクライアント システムに公開証明書のコピーが必要です。

**1) 自己署名証明書を作成**
```
[root@tokyo-inst01 ~]# openssl req -new -x509 -days 30 -nodes -newkey rsa:2048 -keyout ~/.vnc/private.key -out ~/.vnc/public.cert -subj "/C=US/ST=Ca/L=Sunnydale/CN=$(hostname -f)"
  Generating a RSA private key
  ...................................................................+++++
  ...............................................+++++
  writing new private key to '/home/opc/.vnc/private.key'
  -----
```

**2) private.key, public.cert ファイル生成確認**
```
[root@tokyo-inst01 ~]# ls -l ~/.vnc
  total 16
  -rw-------. 1 opc opc   16 Jan 17 02:48 passwd
  -rw-------. 1 opc opc 1704 Jan 17 03:41 private.key
  -rw-rw-r--. 1 opc opc 1367 Jan 17 03:41 public.cert
  -rw-r--r--. 1 opc opc  712 Jan 17 03:36 vcn-exa-tokyo-inst:1.log
```

**3) ~/.vnc/config ファイル作成と設定**
 ユーザーのカスタム VNC 設定オプションを~/.vnc/configファイルへ設定します。
~/.vnc/config ファイルがまだ存在しない場合は、自分で作成する必要があります。
構成を更新して x509Vnc 暗号化を有効にし、X509 キー ファイルと x509 証明書ファイルへのフル パスを指定します。
```
cat << EOF | tee -a ~/.vnc/config > /dev/EfN5vwa4UftIiKalMr3BtB4B6rKrS3LaP
securitytypes=x509Vnc
X509Key=/home/$(whoami)/.vnc/private.key
X509Cert=/home/$(whoami)/.vnc/public.cert
EOF
```

:::note info
注:キー ファイルと証明書ファイルへのフル パスを指定する必要があります。この目的でシェル拡張に依存したり、変数を使用したりすることはできません。上記の bash スクリプトの拡張は、ファイル ~/.vnc/config に行を書き込むときにコマンドを拡張するため可能です
:::

**4) ~/.vnc/config ファイル作成と設定確認**
```
[root@tokyo-inst01 ~]# ls -l ~/.vnc
  total 20
  -rw-rw-r--. 1 opc opc   93 Jan 17 03:44 config
  -rw-------. 1 opc opc   16 Jan 17 02:48 passwd
  -rw-------. 1 opc opc 1704 Jan 17 03:41 private.key
  -rw-rw-r--. 1 opc opc 1367 Jan 17 03:41 public.cert
  -rw-r--r--. 1 opc opc  712 Jan 17 03:36 vcn-exa-tokyo-inst:1.log


[root@tokyo-inst01 ~]# cat ~/.vnc/config
  securitytypes=x509Vnc
  X509Key=/home/opc/.vnc/private.key
  X509Cert=/home/opc/.vnc/public.cert
```


**5) 設定反映**
設定の編集が完了したら、サービスを再起動して設定を反映
```
[root@tokyo-inst01 ~]# systemctl restart vncserver@:1.service
[root@tokyo-inst01 ~]# 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 Fri 2025-01-17 04:00:42 GMT; 1min 1s ago
	  Process: 622119 ExecStart=/usr/libexec/vncsession-start :1 (code=exited, status=0/SUCCESS)
	  Process: 622107 ExecStartPre=/usr/libexec/vncsession-restore :1 (code=exited, status=0/SUCCESS)
	 Main PID: 622126 (vncsession)
	    Tasks: 0 (limit: 86945)
	   Memory: 1.1M
	   CGroup: /system.slice/system-vncserver.slice/vncserver@:1.service
	           ‣ 622126 /usr/sbin/vncsession opc :1
	
	Jan 17 04:00:42 vcn-exa-tokyo-inst systemd[1]: Starting Remote desktop service (VNC)...
	Jan 17 04:00:42 vcn-exa-tokyo-inst systemd[1]: Started Remote desktop service (VNC).
```


# ■ OSのファイアウォールルール設定
X509 暗号化を使用しており、カスタム ファイアウォール プロファイルまたは Oracle Cloud Infrastructure インスタンスを実行している場合は、ファイアウォール上またはネットワークのセキュリティ リストで VNC サービス用のファイアウォール ポート (5901) を開きます。
X509 暗号化を使用しており、ホスト上で firewalld サービスが実行されている場合は、VNC サービスへのアクセスを追加します。その後、デフォルトのファイアウォール サービスを再ロードします。

**1) firewalld 設定**
```
[root@tokyo-inst01 ~]# firewall-cmd --zone=public --add-service=vnc-server --permanent
  success
```


**2) firewalld 設定反映**
```
[root@tokyo-inst01 ~]# firewall-cmd --reload
  success
```

:::note alert
注: VNC は暗号化されたプロトコルではないため、このポートに対してファイアウォールを開き、保護されていないネットワーク経由で VNC サーバーに直接接続しないでください。この手順はオプションとして記載されていますが、一般的には推奨されないため、接続を保護するために SSH トンネリングまたはその他のメカニズムの使用を検討する必要があります。
:::



# ■ MacBook VNCクライアント接続
クライアント マシンで、VNC ソフトウェアを使用してリモート Oracle Linux サーバー ドメインまたは IP アドレスに接続します。正しいポートを指定してください。デフォルトの VNC ポートは 5900 ですが、この番号は構成されたディスプレイ番号に応じて増加します。つまり、ディスプレイ 1 は 5901 に、ディスプレイ 2 は 5902 に、というように対応します。
X509 暗号化を有効にした場合は、キーの署名に使用した CA 証明書を提供する必要があることに注意してください。また、自己署名証明書を使用した場合は、パブリック証明書を CA 証明書として使用できます。一部のクライアントでは、自己署名証明書を自動的に受け入れることを許可している場合があります。

## ● RealVNC クライアント・ダウンロード
https://www.realvnc.com から ダウンロード

https://www.realvnc.com/en/connect/download/viewer/

# ![01_RealVNCダウンロード.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109087/11afb88f-8500-f28f-3708-2492e422a095.jpeg)


## ● RealVNC クライアント・インストール
ダウンロードしたファイルをクリックしてインストール
![02_RealVNCインストール.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109087/f82c6557-5ce2-d944-b025-319f86280e34.png)


## ● RealVNC 接続
**1) 起動**
インストールして作成された起動アイコンをクリック


**2) License Agreement画面**
内容を確認し、問題なければ[OK]をクリック
![03_RealVNC起動01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109087/a3f07366-67b4-3f46-4376-a2af2afba3b6.jpeg)

**3) RealVNC Veriwer画面**
ポート番号 5900 に設定したディスプレイ番号(ここでは1)をプラスした値を接続ポートとして記述し接続
```:接続記述子
サーバーアドレス:ポート番号
```
![03_RealVNC起動03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109087/ead59304-30cb-fa4c-b741-f95d66975273.jpeg)


**4) Unencrypted connection画面**
オプションのX509暗号化を設定していない場合、暗号化されていないことが問題なければ [Continue]をクリック
![03_RealVNC起動04.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109087/31922b8b-a2b7-2d38-adad-27b8e5036441.jpeg)

**5) Authenticate to VNC Server画面**
事前に設定したVNCサーバー接続のパスワードを入力し、[OK]をクリック
![03_RealVNC起動05.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109087/dadf624d-795a-2acc-e2f7-9f9df1a25f31.jpeg)

**6) Linuxディスクトップ初期設定**
初回、ディスクトップの表示設定を設定
![03_RealVNC起動06.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109087/1353cfaa-463a-b3af-0ab0-1bcd1c2ad106.jpeg)

**7) 接続完了**
![03_RealVNC起動07.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109087/1521bb7d-e5e2-3eb4-77ea-617747c7cec1.jpeg)


# ■ 参考
[Install the VNC Remote Access Server on Oracle Linux](https://docs.oracle.com/en/learn/ol-install-vnc/#introduction)
[RealVNC](https://www.realvnc.com)