はじめに

仮想ネットワークコンピューティング、 すなわちVNC(*Virtual Network Computing*)は、キーボードとマウスを使用して 、リモートサーバー上のグラフィカルデスクトップ環境と対話できるようにする接続システムです 。これにより、コマンドラインにまだ慣れていないユーザーにとって、リモートサーバー上のファイル、ソフトウェア、および設定の管理が簡単になります。

このガイドでは、Ubuntu 20.04サーバー上にTightVNCを使用してVNCサーバーを設定し、SSHトンネルを介して安全に接続します。次に、ローカルマシンでVNCクライアントプログラムを使用し、グラフィカルデスクトップ環境を介してサーバーと対話します。

前提条件

vnc illustration for: 前提条件

このチュートリアルを完了する には 、 次のものが必要です。

  • root以外の管理ユーザー権限とUFWで構成したファイアウォールを備えたUbuntu20.04サーバー1台。これを設定するには、Ubuntu 20.04 初期サーバー設定ガイドを参照してください。
  • VNC クライアントがインストールされ たローカルコンピュータ 。使用するVNCクライアントは 、SSHトンネルを介した接続をサポートしている必要があります 。
  • macOS では 、 組み込みの画面共有 プログラムを使用するか 、 RealVNC のようなクロスプラットフォームアプリを使用できます 。
  • Linuxでは 、 vinagrekrdcRealVNCTightVNC などの多くのオプションから選択でき ます 。

ステップ 1 — デスクトップ環境とVNC サーバーをインストールする

デフォルトでは 、Ubuntu 20 .04サーバーにはグラフィカルデスクトップ 環境やVNC サーバーがインストールされていないため、それらのインストールから始めます 。

選択するVNCサーバーとデスクトップ環境に関しては、多くのオプションがあります。このチュートリアルでは、最新のXfceデスクトップ環境用のパッケージと、公式のUbuntuリポジトリで利用可能なTightVNCパッケージをインストールします。XfceとTightVNCは、いずれも軽量で高速ですから、低速のインターネット接続でもスムーズで安定したVNC接続を保証します。

SSHでサーバーに接続した後 、パッケージのリストを更新 し ます 。

				
					
sudo apt update

				
			

次に、xfce4-goodiesパッケージと共にXfceをインストールします。これには、デスクトップ環境のいくつかの拡張機能が含まれています。

				
					
sudo apt install xfce4 xfce4-goodies

				
			

インストール中に、Xfceのデフォルトのディスプレイマネージャーを選択するように求められる場合があります。ディスプレイマネージャーは、グラフィカルインターフェイスを介してデスクトップ環境を選択してログインできるようにするプログラムです。Xfceは、VNCクライアントに接続するときにのみ使用します。これらのXfceセッションでは、root以外のUbuntuユーザーとして既にログインしています。したがって、このチュートリアルでは、ディスプレイマネージャーの選択は適切ではありません。いずれかを選択してENTERキーを押します。

インストールが完了したら、TightVNCサーバーをインストールします。

				
					
sudo apt install tightvncserver

				
			

次に、vncserverコマンドを実行してVNCアクセスパスワードを設定し、初期構成ファイルを作成し、VNCサーバーインスタンスを起動します。

				
					
vncserver

				
			

次に、マシンにリモートアクセスするためのパスワードを入力して確認するように求められます。

				
					
[secondary_label Output]

You will require a password to access your desktops.



Password:

Verify:

				
			

パスワードは6〜8文字の長さである必要があります。8文字を超えるパスワードは自動的に切り捨てられます。

パスワードを確認すると、表示専用のパスワードを作成するオプションが表示されます。表示専用パスワードでログインするユーザーは、マウスまたはキーボードでVNCインスタンスを制御できなくなります。これは、VNCサーバーを使用して他の人に何かをデモンストレーションしたい場合に便利なオプションですが、必須ではありません。

次に、このプロセスは、サーバーに必要なデフォルトの構成ファイルと接続情報を作成します。さらに、ポート5901でデフォルトのサーバーインスタンスを起動します。このポートは*ディスプレイポート*と呼ばれ、VNCでは:1として参照されます。VNCは、他のディスプレイポートで複数のインスタンスを起動できます。例えば、:2 はポート5902を参照し、:35903を参照する、など。

				
					
[secondary_label Output]

Would you like to enter a view-only password (y/n)? <^>n<^>

xauth: file /home/<^>sammy<^>/.Xauthority does not exist



New 'X' desktop is <^>your_hostname<^>:1



Creating default startup script /home/<^>sammy<^>/.vnc/xstartup

Starting applications specified in /home/<^>sammy<^>/.vnc/xstartup

Log file is /home/<^>sammy<^>/.vnc/<^>your_hostname<^>:1.log

				
			

ここで留意すべきは、パスワードを変更したり、表示専用のパスワードを追加したい場合は、vncpasswd コマンドを使用できることです。

				
					
vncpasswd

				
			

この時点では、VNCサーバーがインストールされて実行されています。それでは、Xfceを起動し、グラフィカルインターフェイスを介してサーバーにアクセスできるように構成しましょう。

ステップ2 — VNCサーバーの構成をする

VNCサーバーは、起動時にどのコマンドを実行するか知る必要があります。具体的には、VNCは、接続する必要のあるグラフィカルデスクトップ環境がどれかを知る必要があります。

VNCサーバーが起動時に実行するコマンドは、ホームディレクトリ配下にある.vncフォルダ内のxstartupと呼ばれる構成ファイルにあります。起動スクリプトは、前のステップでvncserverコマンドを実行したときに作成されていましたが、Xfceデスクトップを起動するためには、独自のスクリプトを作成します。

VNCサーバーの構成方法を変更するので、最初に、次のコマンドを使用して、ポート5901で実行されているVNCサーバーインスタンスを停止します。

				
					
vncserver -kill :1

				
			

別のPIDが表示されますが、出力は次のようになります。

				
					
[secondary_label Output]

Killing Xtightvnc process ID <^>17648<^>

				
			

xstarturpファイルを変更する前に、元ファイルをバックアップします。

				
					
mv ~/.vnc/xstartup ~/.vnc/xstartup.bak

				
			

ここで、新しいxstarturpファイルを作成し、nanoなどのテキストエディターで開きます。

				
					
nano ~/.vnc/xstartup

				
			

次に、ファイルに次の行を追加します。

				
					
[label ~/.vnc/xstartup]

#!/bin/bash

xrdb $HOME/.Xresources

startxfce4 &

				
			

最初の行は、*shebang*)です。* nixプラットフォーム上の実行可能なプレーンテキストファイルで、shebangは、システムに、そのファイルをどのインタプリタに渡して実行するかを指示します。この場合、ファイルをBashインタプリタに渡します。これにより、連続する各行を順番にコマンドとして実行できるようになります。

ファイルに記述される最初のコマンドxrdb $HOME/.Xresourcesは、VNCのGUIフレームワークに、サーバーユーザーの.Xresourceファイルを読み取るように指示します。.Xresourceは、ユーザーが、端末の色、カーソルテーマ、フォントレンダリングなど、グラフィカルデスクトップの特定の設定を変更できる場所です。2番目のコマンドは、サーバーにXfceを起動するように指示します。VNCサーバーを起動または再起動するたびに、これらのコマンドが自動的に実行されます。

これらの行を追加したら、ファイルを保存して閉じます。nanoを使用した場合は、CTRL + XYENTERキーを押します。

VNCサーバーがこの新しいスタートアップファイルを適切に使用できるようにするために、実行可能なファイルにする必要があります。

				
					
chmod +x ~/.vnc/xstartup

				
			

次に、VNCサーバーを再起動します。

				
					
vncserver -localhost

				
			

この時のコマンドには、VNCサーバーをサーバーのループバックインターフェイスにバインドする-localhostオプションが含まれていることに注意してください。これにより、VNCは、それがインストールされているサーバーから発信された接続のみを許可します。

次のステップでは、ローカルマシンとサーバーの間にSSHトンネルを確立し、VNCがローカルマシンからの接続がサーバーから発信されたものと思わせる仕掛けをします。この戦略により、VNCの周囲にセキュリティの層が追加されます。これは、VNCにアクセスできるのは、サーバーへのSSHアクセスを既に持っているユーザーのみであるためです。

次のような出力が表示されます。

				
					
[secondary_label Output]

New 'X' desktop is <^>your_hostname<^>:1



Starting applications specified in /home/<^>sammy<^>/.vnc/xstartup

Log file is /home/<^>sammy<^>/.vnc/<^>your_hostname<^>:1.log

				
			

これで、ローカルマシンからVNCサーバーに接続する準備が整いました。

ステップ3 — VNCデスクトップに安全な接続をする

VNC自体は、接続時に安全なプロトコルを使用しません。サーバーに安全に接続するには、SSHトンネルを確立してから、VNCクライアントに、直接接続するのではなく、そのトンネルを使用して接続するように指示します。

VNC用のlocalhost接続に安全に転送するローカルコンピュータ上にSSH接続を作成します。この操作は、LinuxまたはmacOSのターミナルを介して、次のsshコマンドで実行できます。

				
					
[environment local]

ssh -L <^>59000<^>:localhost:<^>5901<^> -C -N -l <^>sammy<^> <^>your_server_ip<^>

				
			

この ssh コマンドのオプションの意味は次のとおりです。

  • -L <^>59000<^>:localhost:<^>5901<^>:-Lスイッチは、ローカルコンピューター(59000)の指定されたポートが宛先サーバー(localhost:5901は、宛先サーバーのポート5901を意味し、<^>your_server_ip<^>として定義される)の指定されたホストとポートに転送されるよう指定します指定するローカルポートは多少任意であることに注意してください。ポートがまだ別のサービスにバインドされていない限り、トンネルの転送ポートとして使用できます。
  • -C:このフラグは圧縮を有効にし、リソースの消費を最小限に抑え、処理を高速化します。
  • -N: このオプションは、リモートコマンドを実行したくないsshに指定します。この設定は、ポートを転送するだけの場合に役立ちます。
  • -l <^> sammy <^> <^> your_server_ip <^>:-lスイッチを使用すると、サーバーに接続したときにログインするユーザーを指定できます。<^> sammy <^><^> your_server_ip <^>は、root以外のユーザーの名前とサーバーのIPアドレスに必ず置き換えてください。

:このコマンドは、VNCサーバーのポート5901から各マシンのポート22(SSHのデフォルトポート)を介してローカルマシンのポート59000に情報を転送するSSHトンネルを確立します。前提条件となるUbuntu 20.04の初期サーバーセットアップガイドに従っていると仮定する場合、OpenSSHを介したサーバーへの接続を許可するUFWルールを追加します。

これは、サーバーのファイアウォールを単に開いてポート5901への接続を許可するよりも安全です。これにより、誰でもVNCを介してサーバーにアクセスできるようになります。SSHトンネルを介して接続することにより、サーバーへのSSHアクセスを既に持っているマシンへのVNCアクセスを制限します

PuTTYを使用してサーバーに接続している場合は、ターミナルウィンドウのトップバーを右クリックし、Change Settings…(設定の変更)オプションをクリックします。

PuTTY再構成ウィンドウの左側にあるツリーメニューで接続ブランチを見つけます。SSHブランチを展開し、トンネルをクリックします。[Options controlling SSH port forwarding(SSHポート転送画面を制御するオプション]画面において、5900をソースポートとして、localhost:5901を宛先として入力します。

次に、追加ボタンをクリックし、適用ボタンをクリックしてトンネルを実装します。

トンネルが起動したら、VNCクライアントを使用してlocalhost:59000に接続します。ステップ1に設定したパスワードを使用して認証するよう求められます。

接続すると、デフォルトのXfceデスクトップが表示されます。このように表示されるはずです。

次に示すように、ファイルマネージャーまたはコマンドラインから、ホームディレクトリ内のファイルにアクセスできます。

ローカルターミナルでCTRL + Cを押して、SSHトンネルを停止し、プロンプトに戻ります。これにより、VNCセッションも切断されます。

これで、systemdサービスとして実行するようにVNCサーバーを構成できます。

ステップ4 — システムサービスとしてVNCを実行する

systemdサービスとして実行するようにVNCサーバーを設定することにより、他のサービスと同様に、必要に応じてサーバーを開始、停止、再起動できます。systemdの管理コマンドを使用して、サーバーの起動時にVNCが確実に起動するようにすることもできます。

まず、/etc/systemd/system/[email protected]という新しいユニットファイルを作成します。

				
					
sudo nano /etc/systemd/system/vncserver@.service

				
			

名前の最後にある@記号を使用すると、サービス構成で使用できる引数を渡すことができます。これを使用して、サービスを管理するときに使用するVNC表示ポートを指定します。

ファイルに次の行を追加します。ユーザーグループWorkingDirectoryPIDFILEの値の中のユーザー名をユーザー名に変更してください。

				
					
[label /etc/systemd/system/vncserver@.service]

[Unit]

Description=Start TightVNC server at startup

After=syslog.target network.target



[Service]

Type=forking

User=&lt;^&gt;sammy&lt;^&gt;

Group=&lt;^&gt;sammy&lt;^&gt;

WorkingDirectory=/home/&lt;^&gt;sammy&lt;^&gt;



PIDFile=/home/&lt;^&gt;sammy&lt;^&gt;/.vnc/%H:%i.pid

ExecStartPre=-/usr/bin/vncserver -kill :%i &gt; /dev/null 2&gt;&amp;1

ExecStart=/usr/bin/vncserver &lt;^&gt;-depth 24 -geometry 1280x800&lt;^&gt; -localhost :%i

ExecStop=/usr/bin/vncserver -kill :%i



[Install]

WantedBy=multi-user.target

				
			

ExecStartPreコマンドは、すでに実行している場合は、VNCを停止します。ExecStartコマンドはVNCを起動し、色深度を1280×800の解像度で24ビットカラーに設定します。ニーズに合わせて、これらの起動オプションを変更することもできます。また、ExecStartコマンドには-localhostオプションが含まれていることに注意してください。

ファイルを保存して閉じます。

次に、システムに新しいユニットファイルを認識させます。

				
					
sudo systemctl daemon-reload

				
			

ユニットファイルを有効にします。

				
					
sudo systemctl enable vncserver@1.service

				
			

@記号に続く1は、サービスが表示される表示番号を示します。この場合、ステップ2で説明したデフォルトの:1です。

VNCサーバーがまだ実行中の場合は、現在のインスタンスを停止します。

				
					
vncserver -kill :1

				
			

次に、他のsystemdサービスを開始するのと同じように開始します。

				
					
sudo systemctl start vncserver@1

				
			

このコマンドで起動したことを確認できます。

				
					
sudo systemctl status vncserver@1

				
			

正しく起動した場合は、出力は次のようになります。

				
					
[secondary_label Output]

● vncserver@1.service - Start TightVNC server at startup

 Loaded: loaded (/etc/systemd/system/vncserver@.service; enabled; vendor preset: enabled)

 Active: active (running) since Thu 2020-05-07 17:23:50 UTC; 6s ago

 Process: 39768 ExecStartPre=/usr/bin/vncserver -kill :1 &gt; /dev/null 2&gt;&amp;1 (code=exited, status=2)

 Process: 39772 ExecStart=/usr/bin/vncserver -depth 24 -geometry 1280x800 :1 (code=exited, status=0/SUCCESS)

 Main PID: 39795 (Xtightvnc)

...

				
			

これで、サーバーが起動するたびにVNCサーバーを使用できるようになり、他のsystemdサービスと同様にsystemctlコマンドを使用してサーバーを管理できます。

ただし、クライアント側には違いはありません。再接続するには、SSHトンネルを再度起動します。

				
					
[environment local]

ssh -L &lt;^&gt;59000&lt;^&gt;:localhost:&lt;^&gt;5901&lt;^&gt; -C -N -l &lt;^&gt;sammy&lt;^&gt; &lt;^&gt;your_server_ip&lt;^&gt;

				
			

次に、VNCクライアントソフトウェアを使用してlocalhost:59000に新しい接続を確立し、サーバーに接続します。

まとめ

これで、Ubuntu 20.04サーバー上で安全なVNCサーバが起動し、実行されるようになりました。これで、ファイル、ソフトウェア、設定をユーザーフレンドリーなグラフィカルなインターフェースで管理できるようになり、Webブラウザのようなグラフィカルなソフトウェアをリモートで実行できるようになります。