Windowsクライアントを使って、クラウド上のLinuxサーバでGUIアプリを実行したい（1）

# 1. はじめに

WindowsクライアントからsshでLinuxに接続すると、GUIアプリケーションは使用できない。GUIアプリケーションを使うにはXmingやVNCなどのソフトウェアが必要だ。

また途中に踏み台サーバーがあると、ツールのインストールやポートフォワーディングなど考慮事項が増える。

個別にはいろいろなところで書かれているネタだが、今回は全体を整理すると共に、2020年現在の視点で書いてみる。

### 1-2. TL;DR

* WindowsクライアントでGUIアプリを実行する手段としてVNCやXサーバは有名だ
* しかし総合的にメリット／デメリットが語られていることは少ない
* クラウドではSSHの公開鍵認証を利用した踏み台経由の多段sshは重要なテクニックだ。パスワード認証やログインだけというネタはあっても「Xサーバ＋公開鍵認証」となるとネタは少ない
* Linuxサーバ側の設定も含めて現時点で理想的な方法を導き出したい

### 1-3. 前提条件

* WindowsクライアントとLinuxサーバを使用していること
* LinuxはRHEL系ディストリビューションを想定しているが、Ubuntuなどでも考え方は同じ
* タイトルには「クラウド」と入っているが、パブリック・クラウドに限らず、プライベート・クラウドや、昔ながらのオン・プレミスでもかまわない

# 2. はじめに考えること

実際に設定する前に、どのような方法があるのか、またどれが自分に最適なのか。全体像を説明する。

### 2-1. GUIアプリケーションを使う2つの選択肢

GUIを使う方法はいろいろあるのだが、大きく分けると以下の2つに分類できる。

1. **個別のGUIアプリケーション画面だけを利用する**
XmingやVcXsrvなどWindows用のXサーバを使用。個別のアプリケーション画面をX11フォワーディング機能でWindowsクライアントに転送。GUIインストーラを使うなど、一時的にGUIを使用するときに便利。

2. **フルデスクトップ環境を利用する**
VNC Serverやxrdp（RDP）などを使用。Linux OSのデスクトップに接続して、デスクトップの全画面を表示。ローカルにあるサーバと同じ感覚でリモートのLinuxを利用できる。

それぞれを比較したのが以下の表である。VNCとxrdpは機能的には似ているが、異なる部分もあるので分けて書いている。

| 使用ツール | 表示範囲 | 設定にかかる時間 | サーバ上で動作するコンポーネント | クライアントへの追加インストール | 踏み台対応|通信経路の暗号化|使用ポート|
|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|
|**XmingやVcXsrvなどのXサーバ**|<font color="red">特定のウィンドウ</font>|少ない|<font color="red">必要最小限のライブラリのみ</font>|必要|多段sshなどが必要|暗号化済み|デフォルト22|
|**VNC**|デスクトップ全部|多い|デスクトップに必要なライブラリに加え、VNCサーバなども必要|必要|簡単|暗号化未対応|5901, 5902など同時に使用するユーザー数分|
| **xrdp** | 同上 | 同上 | 同上 | <font color="red">不要</font> | 同上 | 暗号化済み | デフォルト3389 |

**<font color="blue">ヒント</font>**
フルデスクトップ環境を利用するには、サーバー側に標準のデスクトップ環境（graphical-server-environment）をインストールするのが一般的だ。

ただしサーバースペックが不足しているときは、軽量のデスクトップ環境「**Xfce**（エックス・エフ・シー・イー）」を使う方法もある。XfceはEPELで提供されており、EPELを有効にしたうえで、`yum groupinstall Xfce`でインストールできる。

### 2-2. 方式を選択するうえで考慮すること

今回紹介した方式は「どちらが優れている」というものではなく、「どちらが適しているか」という視点で判断すべきだ。それぞれ特徴があるので、状況によって最適な方法を選択したい。また注意点もあるので補足する。

#### 2-2-1. 踏み台サーバ対応

クラウドに限らず、エンタープライズ系でよくあるのが踏み台サーバの利用である。sshだけならばログインを2回繰り返すだけだが、GUIを飛ばすとなると、いくつかの選択肢がある。代表的な方法を紹介する。

![ssh-xserver01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/c04415ae-ea6a-25c2-ee89-9174fadb4923.png)

1. **踏み台がLinuxでデスクトップ環境なし（Xサーバ利用）**
2段階でsshログインすることで、アクセス元のWindowsまでGUI画面を転送できる。ただしクラウドの場合、ログイン用の秘密鍵を踏み台におくことは好ましくないので、多段sshなどを検討する。

1. **踏み台がLinuxでデスクトップ環境あり（VNC/xrdp利用）**
VNCを使うと踏み台のデスクトップ全画面が表示される。あとは目的のサーバにsshで接続し、X-Window標準のDISPLAY転送機能を利用する。同様にxrdpを使うと、WindowsのRDPクライアントから、Linuxのデスクトップ全画面を表示できる。

1. **踏み台がWindows**
Windowsまではリモートデスクトップで接続し、その後はXmingやVcXsrvなどのXサーバ利用する。

#### 2-2-2. クライアントツールをインストールできるか

企業のネットワークでは、クラウドに限らず別のネットワークに接続するときは、セキュリティ確保のため特定の踏み台サーバーを経由しなければならないことがある。そのような踏み台サーバーは厳重に管理されていることが多く、インストール権限の有無、ファイル配置権限の有無によって選択肢が異なる。

たとえばXmingやVcXsrvは、Windowsにデフォルトではインストールされていない。そのため踏み台サーバーに事前にインストールしてあるか、もしくはインストール権限が必要だ。VNCクライアントはインストールしなくても使えるが、実行ファイルを配置する権限が必要になる。

インストール権限も書き込み権限もないときには、Windows RDPクライアントを使用できるxrdpが唯一の選択肢になる。

#### 2-2-3. ポート制限との戦い

方式によって必要なポートは異なる。細かい通信制限が行われていないネットワークでは気にする必要はないが、企業ネットワークでは制限されていることが多い。

そもそもインターネットへのアクセスが禁止されているネットワークもあるだろうし、許可されていてもhttp/https(80/443)程度という会社も多いはずだ。

そのため制限状況によって使用できるツールが限られる。最終的にどの方法が許可されているか、自社のネットワーク管理部門に確認すること。またクラウドの場合はインターネットVPN（IPSec VPNなど）や専用線などのセキュアな閉域網も検討できる。

それぞれの方式で使用するポートは以下の通り。

- **XmingやVcXsrvなどのXサーバを使用**
sshと併用するため、sshで接続できれば利用できる。デフォルトは22。

- **VNCやxrdpなどを使用**
VNCの1つめのディスプレイは5901。同時に複数ユーザで使用するときは、5902、5903など人数分のポートが必要。xrdpは3389。

#### 2-2-4. 暗号化対応

VNCの通信は暗号化されていない。そのため閉域網以外で使用するときには、SSHポートフォワードなどと併用する。

# 3. 今回使用するツール

### 3-1. Xサーバを使用する

一通り説明してきたなかで、今回はもっとも手軽な以下の方法を説明する。サーバーにインストールするプログラムが最小限で、デーモンを起動する必要もないので、ライトウェイトな方法と言える。

<font color="blue">**踏み台がLinuxでデスクトップ環境なし（Xサーバ利用）**</font>

**VNCクライアント**や**RDP**を使用する方法は以下のエントリーで紹介している。操作例ではOCIを使用しているが、AWSやAzure、オンプレミスでもほとんどの内容は有効だ。

* **[クラウドでVNCサーバ＆クライアントを構成する Part 1](https://qiita.com/yamada-hakase/items/66c25e9439a0a4b6a909), [Part 2](https://qiita.com/yamada-hakase/items/3150d7bc6c024353c6bb)**
* **[WindowsのRDPを使ってクラウド上のLinuxインスタンスに接続する](https://qiita.com/yamada-hakase/items/a8efe626f598c5eb6f8c)**

### 3-2. 使用するXサーバ
Windowsで稼働するXサーバとしてはXmingが有名だ。そして近年はVcXsrvの人気も高い。

* **VcXsrv**
https://sourceforge.net/projects/vcxsrv/

* **Xming**
http://www.straightrunning.com/XmingNotes/ （7.0以降）
https://sourceforge.net/projects/xming/ （6.9まで）

VcXsrvがGPLなのに対し、Xming 7.xは商用ライセンスで、Xming 6.9はBSDスタイルのライセンスだ。英語版WIKIPEDIAで[Xming](https://en.wikipedia.org/wiki/Xming)を見ると、6.9でもブレまくっているようだ。
> 7.7.0.38, proprietary
> 6.9.0.31, MIT License / August 31, 2015; 3 years ago, proprietary
May 4, 2007; 12 years ago, MIT License

**<font color="blue">Xmingのライセンスが微妙なこともあり、今回はVcXsrvを使用する。</font>**実際に触ると分かるが、Xmingとほぼ同じ感覚で利用できる。

# 4. 次回は？

次回は設定編だ。今回選んだVcXsrvを使って、WindowsクライアントからGUIアプリを実行するまでの手順を説明する。

* [Windowsクライアントを使って、クラウド上のLinuxサーバでGUIアプリを実行したい（2）](https://qiita.com/yamada-hakase/items/80cef4ed58fefbba266b)