クラウドでVNCサーバ＆クライアントを構成する Part 1

# 1. はじめに

過去4回にわたってWindowsクライアントからLinux上のGUIアプリを実行する方法を説明した。これまではVcXsrvやXmingなどのXサーバに焦点を当てたが、今回はVNCを取り上げる。

* [Windowsクライアントを使って…（1）](https://qiita.com/yamada-hakase/items/952406904beffb9f5e85)→全体像を説明 
* [Windowsクライアントを使って…（2）](https://qiita.com/yamada-hakase/items/80cef4ed58fefbba266b)→設定＆踏み台なし接続
* [Windowsクライアントを使って…（3）](https://qiita.com/yamada-hakase/items/e1946b8a598f4cc0bcfa)→踏み台あり接続（連続ログイン）
* [Windowsクライアントを使って…（4）](https://qiita.com/yamada-hakase/items/45922e8859283c44d7dc)→踏み台あり接続（多段ssh）

### 1-2. TL;DR

* VNCは、リモートコンピューターのデスクトップを操作するツールとして昔から使われている
* オンプレミスでも有用だが、ローカルアクセスができないクラウドでは重要度が増している
* いろいろなところで取り上げられているネタだが、微妙に正しくないというか、最適ではない記述が多い

### 1-3. 利用環境

今回はOCI Computeを使用しているが、<font color="red">他のクラウドサービスやオンプレミスでも、ほとんど同じ設定のはずだ。</a>

* Oracle Linux 8 / CentOS 8などのRHEL8互換ディストリビューション
* Oracle Linux 7 / CentOS 7などのRHEL7互換ディストリビューション
* Oracle Linux 6 / CentOS 6などのRHEL6互換ディストリビューション
* Oracle Cloud Infrastructure Compute / Database

### 1-4. 前提条件

前提条件は以下のとおり。

* インターネット経由でアクセスするときは、VNCサーバをインストールするサーバにパブリックIPが割り当てられているか、踏み台サーバー経由でアクセスできること
* 専用線やインターネットVPNでアクセスするときはパブリックIPは不要
* Yumリポジトリにアクセスできること

![vncserver01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/d346d12b-6ddd-8504-bcf8-bdb567fdca73.png)

### 1-5. 参考資料

VNCサーバについては、Linuxディストリビューションベンダーのマニュアルが充実している。

**8系マニュアル：**

* [Oracle Linux: Install the VNC Remote Access Server](https://docs.oracle.com/en/operating-systems/oracle-linux/8/obe-vnc-install/#what-do-you-need)

**7系マニュアル：**

* [Oracle Linux 管理者ガイド, リリース7「VNCサービス構成」](https://docs.oracle.com/cd/E77565_01/E54669/html/ol7-vnc.html)
* [Oracle Linux Administrator's Guide for Release 7 "Configuring a VNC Server"](https://docs.oracle.com/cd/E52668_01/E54669/html/ol7-vnc-config.html)
* [Red Hat Enterprise Linux 7 システム管理者ガイド「TigerVNC」](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/system_administrators_guide/ch-tigervnc)

**6系マニュアル：**

* [Red Hat Enterprise Linux 6 導入ガイド「TigerVNC」](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/deployment_guide/chap-tigervnc)

**その他資料：**

* [Running Graphical Applications Securely on Oracle Cloud Infrastructure（PDF）](https://cloud.oracle.com/iaas/whitepapers/run_graphical_apps_securely_on_oci.pdf)
* [意外に複雑なパスワード生成事情とLinuxにおけるパスワード生成方法](https://qiita.com/yamada-hakase/items/7b4c8c662767f451edf7)

# 2. VNCの特徴

VNCの詳細はどこかで調べてもらうとして、リモートでフルデスクトップ環境を利用するデファクトと言える。またXcXsrv/XmingなどのXサーバと比べたときの特徴は次のとおり。

1. 単一のウインドウだけでなく、フルデスクトップ環境を利用できる
2. インストールしないで、ファイルを配置するだけで使えるWindowsクライアントがある
3. 通信は暗号化されないので、インターネットなどで利用するときはSSHトンネリングで暗号化する必要がある

ただし起動／設定方法の多様さは、利用者を惑わすのに十分な複雑さがある。サービスで起動することもできるし、一般ユーザーで起動することもできる。さらにはXDMCPやxrdpと組み合わせることもできる。

# 3. 設定の流れ

設定手順は以下のとおり。はじめにLinuxサーバでVNCサーバを設定し、次にWindowsクライアントで設定する。

![vnc-flowchart01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/e8ed60ea-34cd-8fa3-79a4-2bf6b33591fc.png)

# 4. VNCサーバをインストールする

Linuxサーバでは、VNCサーバのインストールと設定を行う。

### 4-1. Yumリポジトリにアクセスできるか確認する

Yumリポジトリにアクセスできるか確認する。以下のように表示されればアクセスできている。

```shell-session
# yum repolist enabled
Loaded plugins: langpacks, ulninfo
repo id                         repo name                                 status
ol7_UEKR5/x86_64                Latest Unbreakable Enterprise Kernel Rele    163
ol7_addons/x86_64               Oracle Linux 7Server Add ons (x86_64)        336
ol7_developer/x86_64            Oracle Linux 7Server Development Packages    831
ol7_developer_EPEL/x86_64       Oracle Linux 7Server Development Packages 26,805
ol7_ksplice                     Ksplice for Oracle Linux 7Server (x86_64)  2,378
ol7_latest/x86_64               Oracle Linux 7Server Latest (x86_64)      13,107
ol7_optional_latest/x86_64      Oracle Linux 7Server Optional Latest (x86  9,958
ol7_software_collections/x86_64 Software Collection Library release 3.0 p 13,856
repolist: 67,434
```

アクセスできないときは以下の設定を確認する。

* Internet GatewayやNAT Gateway、Service Gatewayなどの配置
* ルートテーブルの設定

### 4-2. デスクトップ環境をインストールする

デスクトップ環境をインストールする。6系と7/8系では選択するパッケージグループが違うので、利用環境に応じて実行する。

**7/8系Linux OS**

```shell-session
yum groupinstall graphical-server-environment -y
```

<details><summary><font color="blue">**ヒント**：グループインストールのテクニック（クリックすると開く）</font></summary><div>
以下のような表記をよく見かけるが、あまりかっこよくない（超個人的見解）。
`yum groupinstall "Server with GUI"`
インストールグループにはIDがつけられているので、それを使ったほうがオススメ。
`yum groupinstall graphical-server-environment`

インストールグループのIDは以下のコマンドで表示できる。`--disablerepo`や`--enablerepo`は省略可能だが、有効なYumリポジトリがたくさんあってわかりづらいので指定している。Oracle Linux 6のときは`ol7_latest`ではなく`ol6_latest`。またCentOSはバージョン共通で`base`。

**8系の出力結果**

```shell-session
LANG=C yum -v grouplist
---以下画面表示---
Available Environment Groups:
   Server with GUI (graphical-server-environment)
   Server (server-product-environment)
   Minimal Install (minimal-environment)
   Workstation (workstation-product-environment)
   KDE Plasma Workspaces (kde-desktop-environment)
   Custom Operating System (custom-environment)
   Virtualization Host (virtualization-host-environment)
Available Groups:
   Fedora Packager (fedora-packager)
   Legacy UNIX Compatibility (legacy-unix)
   Container Management (container-management)
   Development Tools (development)
   .NET Core Development (dotnet-core)
   Graphical Administration Tools (graphical-admin-tools)
   Headless Management (headless-management)
   Network Servers (network-server)
   RPM Development Tools (rpm-development-tools)
   Scientific Support (scientific)
   Security Tools (security-tools)
   Smart Card Support (smart-card)
   System Tools (system-tools)
```

**7系の出力結果**

```shell-session
LANG=C yum --disablerepo=* --enablerepo=ol7_latest -v grouplist
or
LANG=C yum -v grouplist
---以下画面表示---
Available Environment Groups:
   Minimal Install (minimal)
   Infrastructure Server (infrastructure-server-environment)
   File and Print Server (file-print-server-environment)
   Basic Web Server (web-server-environment)
   Virtualization Host (virtualization-host-environment)
   Server with GUI (graphical-server-environment)
Available Groups:
   Backup Client (backup-client)
   Base (base)
   Cinnamon (cinnamon-desktop)
   Compatibility Libraries (compat-libraries)
   Console internet tools (console-internet)
   Development tools (development)
   E-mail server (mail-server)
   Educational Software (education)
   Electronic Lab (electronic-lab)
   Fedora Packager (fedora-packager)
   Fonts (fonts)
   General Purpose Desktop (general-desktop)
   Graphical Administration Tools (graphical-admin-tools)
   Graphics Creation Tools (graphics)
   Hardware monitoring utilities (hardware-monitoring)
   Haskell (haskell)
   Input Methods (input-methods)
   Internet Applications (internet-applications)
   KDE Desktop (kde-desktop)
   Legacy UNIX Compatibility (legacy-unix)
   MATE (mate-desktop)
   Milkymist (milkymist)
   Network Infrastructure Server (network-server)
   Networking Tools (network-tools)
   Office Suite and Productivity (office-suite)
   Performance Tools (performance)
   Scientific support (scientific)
   Security Tools (security-tools)
   Smart card support (smart-card)
   System Management (system-management)
   System administration tools (system-admin-tools)
   Technical Writing (technical-writing)
   TurboGears application framework (turbogears)
   Web Server (web-server)
   Web Servlet Engine (web-servlet)
   Xfce (xfce-desktop)
Done

```

**6系の出力結果**

```shell-session
LANG=C yum --disablerepo=* --enablerepo=ol6_latest -v grouplist
or
LANG=C yum -v grouplist
---以下画面表示---
Installed Groups:
   Base (base)
   E-mail server (mail-server)
   Fonts (fonts)
   Graphical Administration Tools (graphical-admin-tools)
   Hardware monitoring utilities (hardware-monitoring)
   Legacy UNIX compatibility (legacy-unix)
   Legacy X Window System compatibility (legacy-x)
   Network file system client (network-file-system-client)
   Networking Tools (network-tools)
   Performance Tools (performance)
   Perl Support (perl-runtime)
   System administration tools (system-admin-tools)
   iSCSI Storage Client (storage-client-iscsi)
Installed Language Groups:
   Japanese Support (japanese-support) [ja]
Available Groups:
   Additional Development (additional-devel)
   Backup Client (backup-client)
   Backup Server (backup-server)
   CIFS file server (cifs-file-server)
   Client management tools (client-mgmt-tools)
   Compatibility libraries (compat-libraries)
   Console internet tools (console-internet)
   Debugging Tools (debugging)
   Desktop (basic-desktop)
   Desktop Debugging and Performance Tools (desktop-debugging)
   Desktop Platform (desktop-platform)
   Desktop Platform Development (desktop-platform-devel)
   Development tools (development)
   Dial-up Networking Support (dial-up)
   Directory Client (directory-client)
   Directory Server (directory-server)
   Eclipse (eclipse)
   Emacs (emacs)
   FCoE Storage Client (storage-client-fcoe)
   FTP server (ftp-server)
   General Purpose Desktop (general-desktop)
   Graphics Creation Tools (graphics)
   High Availability (ha)
   High Availability Management (ha-management)
   Identity Management Server (identity-management-server)
   Infiniband Support (infiniband)
   Input Methods (input-methods)
   Internet Browser (internet-browser)
   Java Platform (java-platform)
   KDE Desktop (kde-desktop)
   Large Systems Performance (large-systems)
   Load Balancer (load-balancer)
   Mainframe Access (mainframe-access)
   Messaging Client Support (system-management-messaging-client)
   MySQL Database client (mysql-client)
   MySQL Database server (mysql)
   NFS file server (nfs-file-server)
   Network Infrastructure Server (network-server)
   Network Storage Server (storage-server)
   PHP Support (php)
   PostgreSQL Database client (postgresql-client)
   PostgreSQL Database server (postgresql)
   Print Server (print-server)
   Printing client (print-client)
   Remote Desktop Clients (remote-desktop-clients)
   Resilient Storage (resilient-storage)
   Ruby Support (ruby-runtime)
   SNMP Support (system-management-snmp)
   Scalable Filesystems (scalable-file-systems)
   Scientific support (scientific)
   Security Tools (security-tools)
   Server Platform (server-platform)
   Server Platform Development (server-platform-devel)
   Smart card support (smart-card)
   Somali Support (somali-support)
   Storage Availability Tools (storage-client-multipath)
   System Management (system-management)
   Systems Management Messaging Server support (system-management-messaging-server)
   TeX support (tex)
   Technical Writing (technical-writing)
   TurboGears application framework (turbogears)
   Virtualization (virtualization)
   Virtualization Client (virtualization-client)
   Virtualization Platform (virtualization-platform)
   Virtualization Tools (virtualization-tools)
   Web Server (web-server)
   Web Servlet Engine (web-servlet)
   Web-Based Enterprise Management (system-management-wbem)
   X Window System (x11)
Available Language Groups:
   Afrikaans Support (afrikaans-support) [af]
   Albanian Support (albanian-support) [sq]
   Amazigh Support (amazigh-support) [ber]
   Arabic Support (arabic-support) [ar]
   Armenian Support (armenian-support) [hy]
   Assamese Support (assamese-support) [as]
   Azerbaijani Support (azerbaijani-support) [az]
   Basque Support (basque-support) [eu]
   Belarusian Support (belarusian-support) [be]
   Bengali Support (bengali-support) [bn]
   Bhutanese Support (bhutanese-support) [dz]
   Brazilian Portuguese Support (brazilian-support) [pt_BR]
   Breton Support (breton-support) [br]
   Bulgarian Support (bulgarian-support) [bg]
   Catalan Support (catalan-support) [ca]
   Chhattisgarhi Support (chhattisgarhi-support) [hne]
   Chichewa Support (chichewa-support) [ny]
   Chinese Support (chinese-support) [zh]
   Coptic Support (coptic-support) [cop]
   Croatian Support (croatian-support) [hr]
   Czech Support (czech-support) [cs]
   Danish Support (danish-support) [da]
   Dutch Support (dutch-support) [nl]
   English (UK) Support (british-support) [en_GB]
   Esperanto Support (esperanto-support) [eo]
   Estonian Support (estonian-support) [et]
   Ethiopic Support (ethiopic-support) [am]
   Faroese Support (faroese-support) [fo]
   Fijian Support (fijian-support) [fj]
   Filipino Support (filipino-support) [fil]
   Finnish Support (finnish-support) [fi]
   French Support (french-support) [fr]
   Frisian Support (frisian-support) [fy]
   Friulian Support (friulian-support) [fur]
   Gaelic Support (gaelic-support) [gd]
   Galician Support (galician-support) [gl]
   Georgian Support (georgian-support) [ka]
   German Support (german-support) [de]
   Greek Support (greek-support) [el]
   Gujarati Support (gujarati-support) [gu]
   Hebrew Support (hebrew-support) [he]
   Hiligaynon Support (hiligaynon-support) [hil]
   Hindi Support (hindi-support) [hi]
   Hungarian Support (hungarian-support) [hu]
   Icelandic Support (icelandic-support) [is]
   Indonesian Support (indonesian-support) [id]
   Interlingua Support (interlingua-support) [ia]
   Inuktitut Support (inuktitut-support) [iu]
   Irish Support (irish-support) [ga]
   Italian Support (italian-support) [it]
   Kannada Support (kannada-support) [kn]
   Kashmiri Support (kashmiri-support) [ks]
   Kashubian Support (kashubian-support) [csb]
   Kazakh Support (kazakh-support) [kk]
   Khmer Support (khmer-support) [km]
   Kinyarwanda Support (kinyarwanda-support) [rw]
   Konkani Support (konkani-support) [kok]
   Korean Support (korean-support) [ko]
   Kurdish Support (kurdish-support) [ku]
   Lao Support (lao-support) [lo]
   Latin Support (latin-support) [la]
   Latvian Support (latvian-support) [lv]
   Lithuanian Support (lithuanian-support) [lt]
   Low Saxon Support (low-saxon-support) [nds]
   Luxembourgish Support (luxembourgish-support) [lb]
   Macedonian Support (macedonian-support) [mk]
   Maithili Support (maithili-support) [mai]
   Malagasy Support (malagasy-support) [mg]
   Malay Support (malay-support) [ms]
   Malayalam Support (malayalam-support) [ml]
   Maltese Support (maltese-support) [mt]
   Manx Support (manx-support) [gv]
   Maori Support (maori-support) [mi]
   Marathi Support (marathi-support) [mr]
   Mongolian Support (mongolian-support) [mn]
   Myanmar (Burmese) Support (burmese-support) [my]
   Nepali Support (nepali-support) [ne]
   Northern Sotho Support (northern-sotho-support) [nso]
   Norwegian Support (norwegian-support) [nb]
   Occitan Support (occitan-support) [oc]
   Oriya Support (oriya-support) [or]
   Persian Support (persian-support) [fa]
   Polish Support (polish-support) [pl]
   Portuguese Support (portuguese-support) [pt]
   Punjabi Support (punjabi-support) [pa]
   Romanian Support (romanian-support) [ro]
   Russian Support (russian-support) [ru]
   Sanskrit Support (sanskrit-support) [sa]
   Sardinian Support (sardinian-support) [sc]
   Serbian Support (serbian-support) [sr]
   Sindhi Support (sindhi-support) [sd]
   Sinhala Support (sinhala-support) [si]
   Slovak Support (slovak-support) [sk]
   Slovenian Support (slovenian-support) [sl]
   Southern Ndebele Support (southern-ndebele-support) [nr]
   Southern Sotho Support (southern-sotho-support) [st]
   Spanish Support (spanish-support) [es]
   Swahili Support (swahili-support) [sw]
   Swati Support (swati-support) [ss]
   Swedish Support (swedish-support) [sv]
   Tagalog Support (tagalog-support) [tl]
   Tajik Support (tajik-support) [tg]
   Tamil Support (tamil-support) [ta]
   Telugu Support (telugu-support) [te]
   Tetum Support (tetum-support) [tet]
   Thai Support (thai-support) [th]
   Tibetan Support (tibetan-support) [bo]
   Tsonga Support (tsonga-support) [ts]
   Tswana Support (tswana-support) [tn]
   Turkish Support (turkish-support) [tr]
   Turkmen Support (turkmen-support) [tk]
   Ukrainian Support (ukrainian-support) [uk]
   Upper Sorbian Support (upper-sorbian-support) [hsb]
   Urdu Support (urdu-support) [ur]
   Uzbek Support (uzbek-support) [uz]
   Venda Support (venda-support) [ve]
   Vietnamese Support (vietnamese-support) [vi]
   Walloon Support (walloon-support) [wa]
   Welsh Support (welsh-support) [cy]
   Xhosa Support (xhosa-support) [xh]
   Zulu Support (zulu-support) [zu]
Done
```
</div></details>

**6系Linux OS**

```shell-session
yum groupinstall basic-desktop general-desktop japanese-support -y
```

### 4-3. VNCサーバをインストールする

次にVNCサーバをインストールする。

**8系Linux OS**

```shell-session
yum install tigervnc-server tigervnc-server-module -y
```

**6/7系Linux OS**

3D CGライブラリの`mesa-libEGL`は必須ではないが、[firefoxが起動できないという報告](https://community.oracle.com/thread/4128384)があるのでインストールする。

```shell-session
yum install tigervnc-server mesa-libEGL -y
```

使用環境によってインストールされるパッケージに違いはある。

<details><summary>**インストールされるパッケージ一覧（クリックすると開く）**</summary><div>

```shell-session
===================================================================================================
 Package                      Arch        Version                            Repository       Size
===================================================================================================
Installing:
 mesa-libEGL                  x86_64      18.0.5-4.el7_6                     ol7_latest      101 k
 tigervnc-server              x86_64      1.8.0-13.el7                       ol7_latest      214 k
Installing for dependencies:
 gnutls                       x86_64      3.3.29-9.el7_6                     ol7_latest      680 k
 libXdamage                   x86_64      1.1.4-4.1.el7                      ol7_latest       20 k
 libXdmcp                     x86_64      1.1.2-6.el7                        ol7_latest       34 k
 libXfont2                    x86_64      2.0.3-1.el7                        ol7_latest      143 k
 libXinerama                  x86_64      1.1.3-2.1.el7                      ol7_latest       13 k
 libXrandr                    x86_64      1.5.1-2.el7                        ol7_latest       27 k
 libXxf86misc                 x86_64      1.0.3-7.1.el7                      ol7_latest       19 k
 libdrm                       x86_64      2.4.91-3.el7                       ol7_latest      153 k
 libglvnd                     x86_64      1:1.0.1-0.8.git5baa1e5.el7         ol7_latest       89 k
 libglvnd-egl                 x86_64      1:1.0.1-0.8.git5baa1e5.el7         ol7_latest       43 k
 libglvnd-glx                 x86_64      1:1.0.1-0.8.git5baa1e5.el7         ol7_latest      124 k
 libjpeg-turbo                x86_64      1.2.90-6.el7                       ol7_latest      134 k
 libpciaccess                 x86_64      0.14-1.el7                         ol7_latest       26 k
 libwayland-client            x86_64      1.15.0-1.el7                       ol7_latest       32 k
 libwayland-server            x86_64      1.15.0-1.el7                       ol7_latest       38 k
 libxshmfence                 x86_64      1.2-1.el7                          ol7_latest      6.5 k
 llvm-private                 x86_64      6.0.1-2.el7                        ol7_latest       21 M
 mesa-dri-drivers             x86_64      18.0.5-4.el7_6                     ol7_latest      6.6 M
 mesa-filesystem              x86_64      18.0.5-4.el7_6                     ol7_latest       17 k
 mesa-libGL                   x86_64      18.0.5-4.el7_6                     ol7_latest      161 k
 mesa-libgbm                  x86_64      18.0.5-4.el7_6                     ol7_latest       37 k
 mesa-libglapi                x86_64      18.0.5-4.el7_6                     ol7_latest       44 k
 nettle                       x86_64      2.7.1-8.el7                        ol7_latest      327 k
 tigervnc-license             noarch      1.8.0-13.el7                       ol7_latest       28 k
 tigervnc-server-minimal      x86_64      1.8.0-13.el7                       ol7_latest      1.0 M
 trousers                     x86_64      0.3.14-2.el7                       ol7_latest      289 k
 xkeyboard-config             noarch      2.24-1.el7                         ol7_latest      833 k
 xorg-x11-server-utils        x86_64      7.7-20.el7                         ol7_latest      178 k
 xorg-x11-xinit               x86_64      1.3.4-2.el7                        ol7_latest       58 k
 xorg-x11-xkb-utils           x86_64      7.7-14.el7                         ol7_latest      102 k

Transaction Summary
===================================================================================================
Install  2 Packages (+30 Dependent packages)

Total download size: 33 M
Installed size: 112 M
```

</div></details>

# 5. VNCサーバを設定する

設定方法は6系と7/8系で大きく異なり、また7系と8系で少し異なる部分がある。そのため利用しているバージョンに応じて読むこと。

### 5-1. VNCサーバのユーザーを理解する
VNCサーバを複数のユーザーで利用するときは、それぞれ別のポートを割り当てる必要がある。またサービスを利用して起動するときは、OSユーザーを意識して設定ファイルを構成する必要がある。

デフォルトのOSユーザー名はクラウドによって異なるので適宜読み替えること。またCentOSやUbuntuではデフォルトと異なることがある。

| クラウド | OSユーザー名 |
|:-:|:-:|
| **AWS EC2**  |  ec2-user  |
| **OCI**  | opc |
| **Azure VM**  |  azureuser |

次の例はシングルユーザーの場合と複数ユーザーの場合の例だ。この仕組みを頭に入れておく必要がある。

**1つのOSユーザーを同時に1人だけで利用**

| ポート番号 | ディスプレイ番号 | OSユーザー名 | 利用者 |
|:-:|:-:|:-:|:-:|
| 5901 | :1  | opc | 不特定多数。ただし同時には使用しない  |

**複数のOSユーザーを同時に複数利用者で利用**

| ポート番号 | ディスプレイ番号 | OSユーザー名 | 利用者 |
|:-:|:-:|:-:|:-:|
| 5901 | :1  | opc | Aさん  |
| 5902 | :2 | oracle  | Bさん  |
| 5903 | :3 | opc | Cさん  |

### 5-2. VNCサーバを設定する（7/8系Linux OS）

7系では、シングルユーザーと複数ユーザーで設定ファイルの書き方が異なっていた。しかし、8系では同じになっている。そのため自分が使用しているバージョンの内容を読むこと。

#### 5-2-1. VNCパスワードを設定する（7/8系共通）
VNCパスワードを設定する。必ず指定のOSユーザーに`su`してから実行する。パスワードは6文字以上必要。設定したパスワードは、VNCクライアントからの接続時の認証に使われる。

```shell-session
# su - opc
$ vncpasswd
Password:　★パスワード入力
Verify:　★同じパスワード入力
Would you like to enter a view-only password (y/n)? n  ★nを入力
A view-only password is not used
```

#### 5-2-2. 設定ファイルを変更する（7系Linux OS）
7系ではシングルユーザーと複数ユーザーで設定ファイルの書き方が異なる。

1. VNCサーバ用ユニット・ファイルのテンプレート`/usr/lib/systemd/system/vncserver@.service `を`/etc/systemd/system/`にコピーする。

VNCサーバを利用するOSユーザーが1つだけのときはファイル名を変えなくてよい。しかし複数のOSユーザーで使用するときは`vncserver-<OSユーザー名>@.service`のように変更する。

**シングルユーザー用**

```shell-session
cp /usr/lib/systemd/system/vncserver@.service /etc/systemd/system/vncserver@.service
```

**複数ユーザー用（OSユーザーはopc）**
以下の例はopcユーザーの場合。複数のOSユーザーでVNCを使用するときは、必要なOSユーザー数分のファイルを作成する。実際に利用する人数ではないことに注意。

```shell-session
cp /usr/lib/systemd/system/vncserver@.service /etc/systemd/system/vncserver-opc@.service
```

<font color="red">**注意**
Oracleのマニュアルを含め、世間の情報の中には

`vncserver-<OSユーザー名>@:1.service`

<font color="red">のように、ファイル名の@の次にディスプレイ番号を入れているものがある。しかしファイル名にディスプレイ番号は不要だ。systemdで起動するときにディスプレイ番号を指定すればよい。</font>

2.コピーしたユニットファイルの`<USER>`を`OSユーザー名`に変更する。今回は以下のように`opc`に変更する。ユニットファイルの内容やス置換する個数は使用しているバージョンやディストリビューションによって異なる。実際に目視して'<USER>'が無くなるまで置換していることを確認する。

**変更前**

```shell-session:/etc/systemd/system/vncserver*.service
Type=forking
WorkingDirectory=/home/★<USER>★
User=★<USER>★
Group=★<USER>★

ExecStartPre=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'
ExecStart=/usr/sbin/runuser -l ★<USER>★ -c "/usr/bin/vncserver %i"
PIDFile=/home/★<USER>★/.vnc/%H%i.pid
ExecStop=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'
```

**変更後**

```shell-session:/etc/systemd/system/vncserver*.service
Type=forking
WorkingDirectory=/home/opc
User=opc
Group=opc

ExecStartPre=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'
ExecStart=/usr/sbin/runuser -l opc -c "/usr/bin/vncserver %i"
PIDFile=/home/opc/.vnc/%H%i.pid
ExecStop=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'
```

**コマンドバージョン**

```shell-session:シングルユーザー用
sed -i -e '32,50 s/<USER>/opc/' /etc/systemd/system/vncserver@.service
```

```shell-session:複数ユーザー用（opc）
sed -i -e '32,50 s/<USER>/opc/' /etc/systemd/system/vncserver-opc@.service
```

#### 5-2-3. 設定ファイルを変更する（8系Linux OS）

1. `WaylandEnable=false`のコメントを外して以下のように変更する。

```shell-session:/etc/gdm/custom.conf
[daemon]
# Uncoment the line below to force the login screen to use Xorg
WaylandEnable=false
```

2. VNCサーバ用ユニット・ファイルのテンプレート`/usr/lib/systemd/system/vncserver@.service `を`/etc/systemd/system/`にコピーする。

```shell-session
cp /usr/lib/systemd/system/vncserver@.service /etc/systemd/system/
```

3.`/etc/tigervnc/vncserver.users`に、ログインするOSユーザーとディスプレイ番号を追記する。

```shell-session:/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  ★例：ディスプレイ番号1はopcユーザー
```

3.`/etc/tigervnc/vncserver-config-defaults`に以下の2行を追加する。

```shell-session:/etc/tigervnc/vncserver-config-defaults
session=gnome
geometry=1280x1024
```

#### 5-2-3. VNCサーバを起動する（7/8系共通）

1.systemdをリロードして設定ファイルを読み込む。

```shell-session
systemctl daemon-reload
```

2.VNCサーバ起動の文法は以下のとおり。@の次に「コロン＋ディスプレイ番号」を指定する。複数起動するときはディスプレイ番号が重複しないようにすること。

`systemctl start vncserver@:<display-number>.service`

ディスプレイ番号が1のときは次のように指定する。これ以降はシングルユーザー用と複数ユーザー用を分けて書かないので適宜読み替えること。8系では、シングルユーザーと同じ文法で利用できる。そのかわりポートを変えてユーザー数ぶん実行する必要がある。

```shell-session:7系シングルユーザーおよび8系
systemctl start vncserver@:1.service
```

```shell-session:7系複数ユーザー（opc）
systemctl start vncserver-opc@:1.service
```

6.起動していることを`systemctl `コマンドで確認する。確認方法は他にもある。うまくいかないときは`$HOME/.vnc/`配下にログファイルも確認する。

```shell-session
systemctl status vncserver@:1.service
---以下画面表示---
● vncserver@:1.service - Remote desktop service (VNC)
   Loaded: loaded (/etc/systemd/system/vncserver@.service; disabled; vendor preset: disabled)
   Active: active (running★) since Tue 2019-06-18 22:03:27 JST; 1h 17min ago
  Process: 9264 ExecStart=/usr/sbin/runuser -l opc -c /usr/bin/vncserver %i (code=exited, status=0/SUCCESS)
  Process: 9261 ExecStartPre=/bin/sh -c /usr/bin/vncserver -kill %i > /dev/null 2>&1 || : (code=exited, status=0/SUCCESS)
 Main PID: 9289 (Xvnc)
   CGroup: /system.slice/system-vncserver\x2dopc.slice/vncserver@:1.service
           ‣ 9289 /usr/bin/Xvnc :1 -auth /home/opc/.Xauthority -desktop vncsrv:1 (opc) -fp c...
Jun 18 22:03:24 vncsrv systemd[1]: Starting Remote desktop service (VNC)...
Jun 18 22:03:27 vncsrv systemd[1]: Started Remote desktop service (VNC).
```

7.使用ポートで起動状態を確認する。`netstat`や`nmap`でも5901ポートが使われていることがわかる。

```shell-session
# netstat -ltp4 | grep 590
tcp        0      0 0.0.0.0:5901            0.0.0.0:*               LISTEN      16052/Xvnc
```

```shell-session
# nmap -Pn localhost
PORT     STATE SERVICE
22/tcp   open  ssh
111/tcp  open  rpcbind
443/tcp  open  https
5901/tcp open  vnc-1 ★これ
6001/tcp open  X11:1
```

8.VNCサーバをつねに使いたいときは、自動起動を有効にする。

```shell-session:7系シングルユーザーおよび8系
systemctl enable vncserver@:1.service
```

```shell-session:7系複数ユーザー（opc）
systemctl enable vncserver-opc@:1.service
```

```shell-session
systemctl list-unit-files | grep vnc
---以下画面出力---
vncserver@.service                            enabled★自動起動が有効
xvnc@.service                                 static
xvnc.socket                                   disabled
```

9.もし、うまくいかないときは、ランラベルを変更して再起動すること。

```shell-session
sudo systemctl set-default graphical
sudo reboot
```

<font color="blue">**ヒント：VNCサーバの終了方法**
VNCサーバを停止するときはsystemctlを使うこと。`vncserver -kill`コマンドは使用できない。複数起動しているときにはポート数分繰り返す。
`systemctl stop vncserver@:1.service`
</font>

### 5-3. VNCサーバを設定する（6系Linux OS）

1. 使用するOSユーザーに応じて、設定ファイル`/etc/sysconfig/vncservers`を変更する。文法は以下のとおり。複数ユーザーのときはワンスペース開けて追記する。

`VNCSERVERS="display_number:user"`
`VNCSERVERS="display_number:user display_number:user"`

```shell-session
vi /etc/sysconfig/vncservers
```

```shell-session:シングルユーザー用
VNCSERVERS="1:opc"
```

```shell-session:複数ユーザー用
VNCSERVERS="1:opc 2:opc"
```

2.VNCパスワードを設定する。このときは必ず指定のOSユーザーに`su`してから実行する。パスワードは6文字以上必要。

```shell-session
# su - opc
$ vncpasswd
Password:　★パスワード入力
Verify:　★同じパスワード入力
```

3.サービスを起動する。

```shell-session
service vncserver start
---以下画面出力---
Starting VNC server: 1:opc
New 'vncsrv6:1 (opc)' desktop is vncsrv6:1

Starting applications specified in /home/opc/.vnc/xstartup
Log file is /home/opc/.vnc/vncsrv6:1.log

                                                           [  OK  ]
```

4.serviceコマンドで起動していることを確認する。

```shell-session
service vncserver status
---以下画面出力---
Xvnc (pid 24161) is running...
```

5.使用ポートで起動状態を確認する。`netstat`や`nmap`でも5901ポートが使われていることがわかる。

```shell-session
# netstat -ltp | grep 590
tcp        0      0 *:5901                      *:*                         LISTEN      3438/Xvnc 
```

```shell-session
# nmap -Pn localhost
PORT     STATE SERVICE
22/tcp   open  ssh
25/tcp   open  smtp
111/tcp  open  rpcbind
443/tcp  open  https
5901/tcp open  vnc-1 ★これ
6001/tcp open  X11:1
```

6.VNCサーバをつねに使いたいときは自動起動を有効にする。

```shell-session
chkconfig vncserver on
chkconfig --list vncserver
---以下画面出力---
vncserver       0:off   1:off   2:on    3:on    4:on    5:on    6:off
```

<font color="blue">**ヒント：VNCサーバの終了方法**
serviceでVNCサーバを起動したときは、停止するときもserviceコマンドを使うこと。`vncserver -kill`コマンドは使用できない。
</font>

# 6. ファイアウオールを設定する

Windowsクライアントから、どのようにVNCサーバに接続するかで、必要なファイアウオール設定は異なる。

![vncserver02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/bcf63938-5f49-a98f-fc2a-b9fc5b606a7b.png)

次の表は接続方法によるファイアウオール設定の違いである。専用線／インターネットVPNでも踏み台があるときには「インターネット経由（踏み台あり）」と同じになる。

|  | クラウドのファイアウオール | サーバのファイアウオール（iptables/firewalld） |
|:-:|:-:|:-:|
| 1.インターネット経由（踏み台なし） | 22/ssh | 22/ssh |
| 2.インターネット経由（踏み台あり）  | 踏み台サーバ：22/ssh VNCサーバ：5901, 5902, … | 22/ssh VNCサーバ：5901, 5902, … |
| 3.専用線／インターネットVPN  | 5901, 5902, …  | 5901, 5902, …  |

### 6-1. クラウドのセキュリティルール/グループを設定する

「2.インターネット経由（踏み台あり）」と「3.専用線／インターネットVPN」のときは、VNCサーバに疎通できるようにセキュリティルール/グループを設定する。

**「2.インターネット経由（踏み台あり）」のときのIngressルール**

| Source | Protocol | Port  |
|:-:|:-:|:-:|
| 踏み台サーバのプライベートIP | tcp  | 5901  |

**「3.専用線／インターネットVPN」のときのIngressルール**

| Source | Protocol | Port  |
|:-:|:-:|:-:|
| オンプレミスのCIDR | tcp  | 5901  |

### 6-2. サーバのファイアウオールを設定する

「2.インターネット経由（踏み台あり）」と「3.専用線／インターネットVPN」のときは、サーバのファイアウオール（iptables/firewalld）でポートを開ける必要がある。6系と7系でそれぞれ説明する。

ただしクラウドサービスではiptables/firewalldなどのOSファイアウォールが無効になっていることもある。そのときにはスキップしてよい。

### 6-2-1. firewalldでポートを開ける（7系Linux OS）

1. VNCサーバで使用するポートを開ける。5901以外も開けるときは複数行記述する。

```shell-session
firewall-cmd --add-port=5901/tcp --permanent --zone=public
```

上記のようにポートごとに設定する方法もあるが、firewalldでは事前定義済みの設定`vnc-server`も利用できる。定義を見ると5900から5903までが開いている。

```shell-session:/usr/lib/firewalld/services/vnc-server.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>Virtual Network Computing Server (VNC)</short>
  <description>A VNC server provides an external accessible X session. Enable this option if you plan to provide a VNC server with direct access. The access will be possible for displays :0 to :3. If you plan to provide access with SSH, do not open this option and use the via option of the VNC viewer.</description>
  <port protocol="tcp" port="5900-5903"/>
</service>
```

定義済みファイルを使用するときには、次のように実行する。

```shell-session
firewall-cmd --add-service=vnc-server --permanent --zone=public
```

2.設定をリロードして有効化する。

```shell-session
firewall-cmd --reload
```

3.firewalldの設定を確認する。

```shell-session
# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens3
  sources:
  services: ssh dhcpv6-client vnc-server
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
```

### 6-2-2. iptablesでポートを開ける（6系Linux OS）

* [Linux女子部 iptables復習編](https://www.slideshare.net/enakai/iptables-study-v10)

1. 現在のiptablesの設定を確認する。5行目にREJECTがあるので、その前に新しい設定を追加する。

```shell-session
# iptables -nvL INPUT --line-numbers
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination        
1     6663 2155K ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
2        0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0          
3        0     0 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0          
4        5   264 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22
5       75  3032 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited
```

2.VNCサーバで使用するポートを開ける。複数ポートを開ける必要があるときは、単一ポートの文法で複数回実行するか、複数ポートの文法を使用する。

```shell-session:単一ポートの記述例
iptables -I INPUT 5 -p tcp --dport 5901 -j ACCEPT
```

```shell-session:複数ポートの記述例
#カンマ区切りで指定
iptables -I INPUT 5 -p tcp -m multiport --dports 5901,5902,5903 -j ACCEPT

#コロンで範囲指定
iptables -I INPUT 5 -p tcp -m multiport --dports 5901:5903 -j ACCEPT
```

3.設定を保存する。

```shell-session
service iptables save
---以下画面出力---
iptables: Saving firewall rules to /etc/sysconfig/iptables:[  OK  ]
```

4.設定を確認する。5行目に設定が追加されていることがわかる。先頭から評価されるので、6行目のREJECT以降に追加してもポートは開かないので注意。

```shell-session
# iptables -nvL INPUT --line-numbers
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1    10954 4529K ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
2        0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0
3        0     0 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0
4       38  2160 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22
5        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:5901
6      154  9213 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited
```

# 次回は

長くなったので、このあたりで終了。次回はクライアント編として、ポートフォワーディングやVNCクライアントについて説明する。

* [クラウドでVNCサーバ＆クライアントを構成する Part 2](https://qiita.com/yamada-hakase/items/3150d7bc6c024353c6bb)