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


# 前回の続き

前回から続いた内容なので、7から始まる連続した段落番号をつけている。

# 7. ポートフォワーディングを設定する

前回「[クラウドでVNCサーバ＆クライアントを構成する Part 1](https://qiita.com/yamada-hakase/items/66c25e9439a0a4b6a909)」は、Linuxサーバ側の設定を行った。ここからはWindowsクライアント側の設定を行う。

以下の接続形態の中で、1と2ではポートフォワーディングが必要になる。また3のときでも、通信を暗号化したいときや、途中に踏み台があるときはポートフォワーディングが必要だ。

1. インターネット経由（踏み台なし）
2. インターネット経由（踏み台あり）
3. 専用線／インターネットVPN

### 7-1. ポートフォワーディングとは

SSHポートフォワーディングは、SSHトンネリングとも呼ばれ、特定のポートに届いたパケットを別ホストの別ポートに転送する機能である。

たとえばHTTP（80）やSQL*Net（1521）は、それぞれ決められたポートを使用する。SSHポートフォワーディングを使用すると、通常使用するポートではなく、SSH（22）の経路を利用して疎通できる。

そのためSSHしか疎通できないネットワークでも、追加でポートを開けることなしに、さまざまなアプリケーションを利用できる。

おもなメリットは以下のとおり。

* 必要最低限のポートを開ければよい
* 暗号化通信に対応していないソフトウェアのパケットも、SSHの機能で暗号化できる
* パスワードログインを前提としているソフトウェアも、SSH公開鍵認証方式を利用できる
* SSHログインしているホストよりも、さらに先のホストにも転送できる。そのため踏み台サーバが前提の環境にも対応できる

### 7-2. ポートフォワーディングの仕組みを理解する

ポートフォワーディングには、さまざまな方式がある。今回はローカルポートフォワーディングについて、2つの例を説明する。

**ポートフォワーディング例1（ログインホストと転送先ホストが同じ場合）**
一番基本的なポートフォワーディングの利用例である。
![portfowarding01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/888d5b5f-fba1-16a8-14b8-703fb591428e.png)
リモートホスト上で稼働するWebサーバに接続するときは、上図のようにポートフォワーディングを設定する。

ローカルホスト上のWebブラウザのURIに`http://localhost:80`と入力する。httpリクエストはsshの22番ポートを経由してリモートホストの80番ポートに転送され、Webページを表示できる。

OpenSSHのシンタックスは以下のとおり。PuTTYやTera Termでは少し指定方法は違うが、重要なので理解しておくこと。

`ssh -L [ローカルホストの待ち受けIP:]転送元ポート:転送先ホスト:転送先ポート　ログインホスト`

```shell-session
# 基本。ローカルホストの待ち受けIPは省略可能。
ssh -L 80:hostb:80　hostb

# 「転送先ホスト」は、ログインホストからの相対的な位置になる。
# この例のようにlocalhostと書いても、hostbと同じ意味になる。
ssh -L 80:localhost:80　hostb

# 転送先ポートは、転送先ホストで稼働するソフトウェアに一致させる
# 必要がある。しかしローカルホストの転送元ポートは、利用していない
# ポートならば何でもよい。
ssh -L 8080:hostb:80　hostb
```

**ポートフォワーディング例2（ログインホストと転送先ホストが異なる場合）**
応用編としては以下の構成も可能である。ログインホストと転送先ホストが異なる例だ。
![portfowarding02-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/3017c80e-4c68-bb8a-e5af-9eb961f79508.png)
この方式で直接ログインするのは、中間にあるログインホスト（Host B）なので、踏み台サーバのある環境に似ている。

たとえば転送先ホスト（Host C）でOracle Databaseが稼働しているとする。このとき、ローカルホスト上で稼働するOracle SQL Developerから、ログインホスト（Host B）を経由して、Oracle Databaseに接続できる。

```shell-session
ssh -L 1521:hostc:1521　hostb
```

この接続形態で重要なことが2つある。

* <font color="blue">暗号化されるのは、ローカルホストとログインホストの間だけ</font>
* <font color="blue">ログインホストと転送先ホストの間は、転送先ポート（通常22番以外）で通信し、暗号化されない</font>

このような特性があるため、転送先ホスト（Host C）では、22番だけでなく<font color="red">「転送先ポート」</font>も開ける必要がある。暗号化されないことについては、クラウドの中でクローズドネットワークだから問題ないだろう。

どうしても暗号化するならば、多段SSHしたうえでポートフォワーディングとなるが、本題ではないので触れない。

ここまで理解できれば、あとは設定するだけだ。次に利用環境に応じたポートフォワーディングの設定方法を説明する。

### 7-3. ポートフォワーディングを設定する

ポートフォワーディングの設定は、PuTTYとTera Termのそれぞれについて説明する。ただし踏み台サーバまでSSH鍵認証で接続できていることを前提にする。

#### 7-3-1. PuTTYでポートフォワーディングを設定する

1. PuTTYを起動し、ログイン先ホストに接続する設定をロードする。
![putty-vnc01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/dfd0798c-d6cf-5a48-343f-20445f09035e.png)

1. 左のツリーから[Connection]-[Data]を選択し、[When username is not specified]が[Prompt]になっていることを確認する。そして[Auto-login username]に前回設定したVNCのユーザーを設定する。
![putty-vnc02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/b51c7d63-1e05-9a60-18a8-8a7704374c34.png)

1. 左のツリーから[SSH]-[Tunnels]を選択する。[Source port]と[Destination]に、次の書式で入力する。
Source port：「転送元ポート」
Destination：「転送先ホストのIPアドレス:転送先ポート」
入力が終わったら**[Add]**をクリックして、テキストボックスに
`L転送元ポート   転送先ホストのIPアドレス:転送先ポート`
が追加されていることを確認する。
![putty-vnc03-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/0468bc5f-3b0d-9027-f1a7-8b4b7c152d63.png)
<font color="blue">**ヒント：**ログインホストと転送先ホストが同じときは、転送先ホストはIPアドレスでなく、localhostでもよい。また以下のように複数設定できる</font>
![putty-vnc03-3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/9d888b44-d06e-e8f7-d7b5-dbcc3ab301ff.png)

1. 左のツリーで[SSH]を選択する。この作業は必須ではないが [Don’t start a shell or command at all]にチェックを付ける。チェックすると、ログインしたセッションではコマンドが実行できなくなり、ポートフォワーディング用に実行していることを明確に区別できる。
![putty-vnc04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/09c8c487-47eb-8b02-0ca6-106c50810497.png)

1. 左のツリーで一番上の[Session]を選択する。この接続を区別する名前をつけて**[Save]**をクリックして保存する。
![putty-vnc05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/b6aa81a5-9b44-65dc-898a-261cd438879b.png)

1. ウインドウ下の**[Open]**をクリックして接続を開始する。
![putty-vnc06.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/680a081d-08bb-d9a7-d6df-ca715254038a.png)

1. 接続に成功すると以下のように表示される。[Don’t start a shell or command at all]にチェックを付けているときは、プロンプトは表示されず、コマンドも実行できない。
![SnapCrab_129146215211 - PuTTY_2019-6-27_19-50-34_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/dce8bf9d-dd28-3894-5117-d37167ac39a1.png)

1. ポートフォワーディングが動作していることは、Windowsの`netstat`コマンドで確認できる。コマンド・プロンプトから以下のように実行する。この例では、ローカルホストの5901ポートでTCP（IPv4とIPv6）を待ち受けしていることがわかる。

```shell-session
C:\Users\foo> netstat -ant| findstr  5901
  TCP    127.0.0.1:5901        0.0.0.0:0              LISTENING       ホスト内
  TCP    [::1]:5901            [::]:0                 LISTENING       ホスト内
```

<font color="red">**注意：**これでわかるのは転送元ポートがリスニングされていることだけだ。希望する先頭先ホストに転送されることまではわからない。またIPv4の同じポートをリスニングしているしている行が複数あるときは、誤動作の原因になるのでPuTTYを停止する。</a>



9.次は「7. VNCサーバに接続する」に進む。ウィンドウをクローズすると、ポートフォワーディングも終了してしまう。このまま続けるときはクローズしないこと。

#### 7-3-2. Tera Termでポートフォワーディングを設定する

1. Tera Termを起動する。[新しい接続]が表示されるので**[キャンセル]**をクリックしてダイアログを閉じる。
![teraterm-vnc01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/3cac8c15-5193-5f8e-f8c9-22e71f138906.png)

1. [設定]メニューから[SSH転送]を選択する。
1. [SSHポート転送]ウィンドウが表示されたら**[追加]**をクリックする。
![teraterm-vnc03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/569572d9-3b3b-b855-9a6d-482cc8974dfd.png)

1. 次の3箇所に入力して、**[OK]**をクリックする。
ローカルポート ：「転送元ポート」
リモート側ホスト：「転送先ホストのIPアドレス」
ポート　　　　 ：「転送先ポート」
![teraterm-vnc04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/04bbe638-0ac1-10b9-0a6c-a3ea0fa6b1fb.png)

1. 登録が終わると、リストに表示される。PuTTYと同様に複数設定できる。
![teraterm-vnc05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/be08a6ce-25af-7ee0-7d81-94f63c4b7bea.png)

1. 次回起動したときも登録した設定が使えるように、[設定]メニューから[設定の保存]を選択する。

1. 標準の設定ファイルに保存して問題ないときは**[保存]**をクリックする。
![teraterm-vnc07-1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/c12e4958-ca3b-51d0-69b3-bb45cf506437.png)

1. ポートフォワーディングの設定が終わったので、[設定]メニューから[SSH認証]を選択する。必要な項目を設定してログインする。
![teraterm-vnc08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/b044d5a7-0cc5-5054-0288-db5fadf45fd3.png)

1. ポートフォワーディングの確認方法はPuTTYを参考にすること。

# 8.  VNCクライアントでVNCサーバに接続する

これでの設定がすべて終わった。VNCクライアントを起動して、VNCサーバに接続する。

### 8-1. VNCクライアントをダウンロードする

VNCクライアントが無いときは、先にダウンロードする。VNCクライアントにはインストーラーが必要なものもあるが、配置するだけで利用できる[TigerVNC](https://tigervnc.org/)を使用する。

1. githubの[TigerVNCのページ](https://github.com/TigerVNC/tigervnc/releases)を表示する。
https://github.com/TigerVNC/tigervnc/releases

1. ページ下の`https://binary.com/tigervnc/stable/...`をクリックする。
![tigervnc01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/d7d4d906-120d-f91b-b918-77f820549b1d.png)

1. 自分の環境に応じたバージョンをダウンロードする。ダウンロードしたファイルは適切なフォルダに配置すること。
![tigervnc02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/9c4c9b3c-69cb-b7f0-1062-02edb1257aac.png)

### 8-2.VNCクライアントで接続する

1. VNCクライアントを起動する。
![tigervncclinet01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/8c4ec2fa-ef7e-e7fc-b3ec-575fbf819807.png)

1. 初期画面が表示されるので、接続方法に応じて以下のように入力する。たとえばポートフォワードでディスプレイ番号1に接続するときは`localhost:5901`と入力して、**[Connect]**をクリックする。
**ポートフォワード使用：**`localhost:<ポートフォワードのポート番号>`
**直接接続**：`VNCサーバのIPアドレス:<VNCサーバのポート番号>`
![vnc01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/661a8569-c4a8-c3b8-30c6-fa75d12e4d97.png)

1. 接続に成功するとVNCパスワードの入力画面が表示される。`vncpasswd`で設定したパスワードを入力する。
![vnc02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/a3dcc620-0ff6-881f-0afc-e3e04c5a2c61.png)

1. このあとのステップは6系と7系では異なるので、別々に説明する。

### 8-3. デスクトップ環境を設定する（7系Linux OS）

はじめてログインしたユーザーは初期設定が表示される。以下の手順に従って設定すること。1度設定すれば、2回目以降は表示されない。

1. 日本語をチェックして、右上の**[次へ]**をクリックする。
![vnc03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/dca28f58-a3bb-dd4f-c98f-14f88c45b9d1.png)

1. 日本語（かな漢字）をチェックして、右上の**[次へ]**をクリックする。
![vnc04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/d8b658b5-5fe3-8ddf-d1a2-b5aac5a687c7.png)

1. プライバシーのオン／オフを選択して、右上の**[次へ]**をクリックする。
![vnc05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/013ff077-ebce-271e-3011-220846487b96.png)

1. オンラインアカウントとの連携が必要なときは設定する。サーバ利用では通常不要なので、そのまま右上の**[次へ]**をクリックする。
![vnc06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/e05b8c0c-997d-728e-64f5-686f667eca6c.png)

1. 初期設定が終わったので**[Oracle Linux Serverを使い始める]**をクリックする。OSユーザーが同じであれば、次回以降は表示されない。
![vnc07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/a720169f-3f79-0930-5e4f-c4e7f2b90ac6.png)

1. Getting Stared画面が表示される。右上の**[X]**をクリックして閉じる。
![vnc09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/33bfe24c-6786-a9ac-2ab8-9e6bf1722ca4.png)

#### 8-3-1. スクリーンロックを無効化する（7系Linux OS）

VNCサーバを起動したままにしておくとスクリーンロックがかかり、OSユーザーのパスワードが要求される。OSユーザーにはパスワード設定されていないので、この状況を回避するには以下の2つの対策がある。

* スクリーンロックを無効化する
* OSユーザーにパスワードを設定する

`sshd_config`を確認すると、SSHのパスワード認証は無効化されている。そのためOSユーザーにパスワードを設定しても、外部からパスワード認証でSSH接続される危険性はない。

```shell-session
grep ^PasswordAuthentication /etc/ssh/sshd_config
---以下画面出力---
PasswordAuthentication no
```

今回は「スクリーンロックを無効化する」方法を説明する。パスワードを設定する方法は「[意外に複雑なパスワード生成事情とLinuxにおけるパスワード生成方法](https://qiita.com/yamada-hakase/items/7b4c8c662767f451edf7)」参考にしてほしい。

1. メニューバーから[Applications]-[System Tools]-[Settings]を選択する。
![vnc11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/2baf5295-398e-bbbc-b70c-5c27034ffe67.png)

2. 左のリストから[Privacy]を選択し、[Screen Lock]をクリックする。 
![vnc12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/7ccf7a53-41a3-7a6d-0ac8-a9336cccfe5a.png)

1. ダイアログが表示されるので、Automatic Screen LockをOFFに設定する。
![vnc13.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/e7370d7f-74b5-0f48-d99a-ff76101990ba.png)

1. ウインドウを閉じると[Screen Lock]がoffになっている。
![vnc14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/b0dc4ae6-70a5-f98d-5cac-641fb0485312.png)

もし設定に時間がかかり、スクリーンロックされたときはVNCサーバを再起動すること。

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

### 8-4. デスクトップ環境を設定する（6系Linux OS）

6系Linux OSでは、7系のような初期設定画面はない。ただし、スクリーンロックの問題はあるので無効化する。またデスクトップ環境固有のパッケージアップデートチェックが有効になっているので無効化する。

#### 8-4-1. スクリーンロックを無効化する（6系Linux OS）
1. ロックされていないデスクトップ画面。
![vnc60.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/95c75854-9723-9fa2-e015-57417498cd49.png)

1. 以下の画面が表示されているときはスクリーンロックされている。そのときは`service vncserver restart`でVNCサーバを再起動する。
![vnc61.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/bbe9aa1f-597c-55ad-c3f6-76a53f209516.png)

1. `yum install gconf-editor -y`でGNOME設定エディタをインストールする。
1. メニューバーから[Applications]-[System Tools]-[Configuration Editor]を選択する。
![vnc62.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/9a70d7ac-747c-8f29-caf9-f09af80db1f1.png)

1. 左のツリーから[apps]-[panel]-[global]を選択する。`disable_log_out`と`disable_lock_screen`の2つにチェックを入れる。
![vnc63.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/38150099-15aa-2bfa-903d-31fe97376a3e.png)

<font color="blue">**ヒント：設定ファイルでスクリーンロックを無効化する**</font>
GUIツールで設定する方法を紹介したが、設定ファイルを使用する方法もある。エディタで以下のファイルを開き、`disable_log_out`と`disable_lock_screen`を探して以下のように変更する。変更が終わったらVNCサーバを再起動する。

```
vi /etc/gconf/schemas/panel-global.schemas
```

```shell-session:237行目付近をfalseからtrueに変更する
        <key>/schemas/apps/panel/global/disable_lock_screen</key>
        <applyto>/apps/panel/global/disable_lock_screen</applyto>
        <owner>panel</owner>
        <type>bool</type>
        <default>true</default>★この行
```

```shell-session:250行目付近をfalseからtrueに変更する
        <key>/schemas/apps/panel/global/disable_log_out</key>
        <applyto>/apps/panel/global/disable_log_out</applyto>
        <owner>panel</owner>
        <type>bool</type>
        <default>true</default>★この行
```

#### 8-4-2. パッケージアップデートチェックを無効化する（6系Linux OS）

1. yumの自動アップデートチェックが有効になっていると、手動のyumの妨げになるので無効化する。[System]-[Preferences]-[Software Updates]をクリックする。
![vnc64.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/cf1b40ac-f649-0480-9a23-51baea3edbcf.png)

1. [Never]を選択して[Close]をクリックする。
![vnc65.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/69ba6ea6-4eb7-f20d-b70c-f4a0d4cdbcf7.png)

### 8-5. VNCデスクトップ環境で英語キーボード配列になっているとき

ssh接続のときはデフォルトで日本語キーボードを利用できる。しかしVNCやVcXsrvなどのGUIクライアントでは英語配列になっていることがある。そのときの変更を紹介する。

#### 8-5-1. RHEL7系の場合

1. 現在の設定は以下のコマンドで確認できる。

```shell-session
# localectl
   System Locale: LANG=en_US.utf8
       VC Keymap: us
      X11 Layout: us
```

2.日本語キーボードに変更するときは次のように入力する。

```shell-session
localectl set-keymap jp106
```

3.変更後の状態を確認すると次のとおり。

```shell-session
# localectl
   System Locale: LANG=en_US.UTF-8
       VC Keymap: jp106
      X11 Layout: jp
       X11 Model: jp106
     X11 Options: terminate:ctrl_alt_bksp
```

なお、すでにVNCサーバーを起動しているときには`systemctl restart`で再起動が必要だ。

* [RHEL7マニュアル:2.2. キーボードレイアウトの変更](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/system_administrators_guide/s1-changing_the_keyboard_layout)

#### 8-5-2. RHEL6系の場合

6系の場合は以下のようにファイルを変更する。

```:/etc/sysconfig/keyboard（修正前）
KEYTABLE="us"
MODEL="pc105+inet"
LAYOUT="us"
KEYBOARDTYPE="pc"
```

```:/etc/sysconfig/keyboard（修正後）
KEYTABLE="jp106"
MODEL="jp106"
LAYOUT="jp"
KEYBOARDTYPE="pc"
```

# 9. まとめ

* VNCを使うと、WindowsクライアントでLinuxのフルデスクトップ環境を利用できる
* VNCクライアント（TigerVNC）はファイルを配置するだけで使えるので、管理者権限を持っていないWindowsクライアントでも利用できる
* ポートフォワーディングを併用すると、VNCの通信を暗号化できるだけでなく、クラウドのようなネットワークにも対応できる

# 9. コピペ用コマンドまとめ（7系Linux OS）

7系Linux OSでのVNCサーバの設定をまとめる。OCI以外では、opcをec2-userやazureuserなどに変更すること。

```shell-session
# デスクトップ環境をインストール
yum groupinstall graphical-server-environment -y

# VNCサーバをインストール
yum install tigervnc-server mesa-libEGL -y

# ユニットファイルをコピー。ファイル名やOSユーザー名は適宜変更すること
cp /usr/lib/systemd/system/vncserver@.service /etc/systemd/system/vncserver-opc@.service

# ユニットファイルを修正
sed -i -e '32,50 s/<USER>/opc/' /etc/systemd/system/vncserver-opc@.service

su - opc
vncpasswd

★ここまでが1回目のコピペ用★

# VNCサービス起動
systemctl start vncserver-opc@:1.service

# 環境に応じてファイアウォール設定
# ログインホストと転送先ホストが異なるときや、直接接続のときはポートを開ける
firewall-cmd --add-service=vnc-server --permanent --zone=public
firewall-cmd --reload

# ファイアウォールの設定確認
firewall-cmd --list-all
```