Ubuntu 22.04にVNCをインストールおよび構成する方法

はじめに

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

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

前提条件

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

  • 管理者権限のないユーザーとUFWで構成されたファイアウォールを持つUbuntu 22.04サーバーが1つあります。これを設定するには、当社のUbuntu 22.04用の初期サーバーセットアップガイドに従ってください。
  • A local computer with a VNC client installed. The VNC client you use must support connections over SSH tunnels:
    • Windowsでは、TightVNCRealVNC、またはUltraVNCを使用できます。
    • macOSでは、組み込みのスクリーン共有プログラムを使用するか、RealVNCのようなクロスプラットフォームアプリを使用できます。
    • Linuxでは、vinagrekrdcRealVNC、またはTightVNCなど、多くのオプションから選択できます。

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

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

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

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

  1. sudo apt update

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

  1. sudo apt install xfce4 xfce4-goodies

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

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

  1. sudo apt install tightvncserver

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

  1. vncserver

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

Output
You will require a password to access your desktops. Password: Verify:

パスワードは6〜8文字でなければなりません。8文字を超えるパスワードは自動的に切り捨てられます。

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

そのプロセスは、サーバーの必要なデフォルト設定ファイルと接続情報を作成します。さらに、ポート5901でデフォルトのサーバーインスタンスを起動します。このポートは表示ポートと呼ばれ、VNCでは:1として参照されます。VNCは他の表示ポートで複数のインスタンスを起動できます。:2はポート5902:35903を指します。

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コマンドを使用できることに注意してください。

  1. vncpasswd

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

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

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

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

VNCサーバーの設定を変更する予定ですので、まずはポート5901で実行中のVNCサーバーインスタンスを停止してください。次のコマンドを使用してください:

  1. vncserver -kill :1

出力は次のようになりますが、異なるPIDが表示されます:

Output
Killing Xtightvnc process ID 17648

xstartupファイルを変更する前に、元のファイルをバックアップしてください:

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

そして、新しいxstartupファイルを作成し、テキストエディター(例:nano)で開いてください:

  1. nano ~/.vnc/xstartup

次に、ファイルに次の行を追加してください:

~/.vnc/xstartup
#!/bin/bash
xrdb $HOME/.Xresources
startxfce4 &

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

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

これらの行を追加した後、ファイルを保存して閉じてください。もしnanoを使用した場合は、CTRL + XYENTERを押して保存してください。

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

  1. chmod +x ~/.vnc/xstartup

次に、VNCサーバーを再起動してください:

  1. vncserver -localhost

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

次のステップでは、ローカルマシンとサーバー間にSSHトンネルを確立し、基本的にVNCがローカルマシンからの接続がサーバーから発信したものであると思わせます。この戦略により、SSHアクセス権を持つユーザーのみがアクセスできるため、VNCの周りに追加のセキュリティレイヤーが追加されます。

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

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接続を作成します。これは、次のsshコマンドを使用してLinuxまたはmacOSのターミナルから行うことができます:

  1. ssh -L 59000:localhost:5901 -C -N -l sammy your_server_ip

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

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

注意:このコマンドは、SSHトンネルを確立し、VNCサーバーのポート5901から情報をローカルマシンのポート59000に転送します。各マシンのデフォルトのSSHポートであるポート22を介して、宛先サーバーのポート22を介して行われます。前提条件として、Ubuntu 22.04の初期サーバーセットアップガイドに従ったと仮定すると、OpenSSH経由でサーバーへの接続を許可するUFWルールが追加されているはずです。

これは、単にサーバーのファイアウォールを開いてポート5901への接続を許可するよりもセキュリティが高いです。なぜなら、それによって誰でもVNC経由でサーバーにアクセスできるようになるからです。SSHトンネルを介して接続することで、VNCアクセスをすでにサーバーへのSSHアクセスがあるマシンに制限します。

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

PuTTY再設定ウィンドウの左側のツリーメニューで接続ブランチを見つけます。SSHブランチを展開し、トンネルをクリックします。SSHポートフォワーディングを制御するオプション画面で、ソースポート59000宛先localhost:5901を入力します。次のように:

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

トンネルが実行されているときは、VNCクライアントを使用してlocalhost:59000に接続します。Step 1で設定したパスワードを使用して認証が求められます。

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

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

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

これでVNCサーバーをsystemdサービスとして実行できるようになりました。

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

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

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

  1. sudo nano /etc/systemd/system/[email protected]

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

次の行をファイルに追加します。 UserGroupWorkingDirectoryの値、およびPIDFILEの値のユーザー名を、自分のユーザー名に変更してください:

/etc/systemd/system/[email protected]
[Unit]
Description=Start TightVNC server at startup
After=syslog.target network.target

[Service]
Type=forking
User=sammy
Group=sammy
WorkingDirectory=/home/sammy

PIDFile=/home/sammy/.vnc/%H:%i.pid
ExecStartPre=-/usr/bin/vncserver -kill :%i > /dev/null 2>&1
ExecStart=/usr/bin/vncserver -depth 24 -geometry 1280x800 -localhost :%i
ExecStop=/usr/bin/vncserver -kill :%i

[Install]
WantedBy=multi-user.target

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

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

次に、システムに新しいユニットファイルが存在することを通知します:

  1. sudo systemctl daemon-reload

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

  1. sudo systemctl enable [email protected]

@サインの後に続く1は、この場合、Step 2で議論されたデフォルトの:1に表示されるべきサービスの表示番号を示しています。

現在実行中のVNCサーバーのインスタンスを停止します:

  1. vncserver -kill :1

その後、他のsystemdサービスを起動するように起動します:

  1. sudo systemctl start vncserver@1

次のコマンドで正しく起動したかどうかを確認できます:

  1. sudo systemctl status vncserver@1

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

Output
[email protected] - Start TightVNC server at startup Loaded: loaded (/etc/systemd/system/[email protected]; enabled; vendor preset: enabled) Active: active (running) since Mon 2022-04-18 16:57:26 UTC; 20s ago Process: 97088 ExecStartPre=/usr/bin/vncserver -kill :1 > /dev/null 2>&1 (code=exited, status=2) Process: 97092 ExecStart=/usr/bin/vncserver -depth 24 -geometry 1280x800 -localhost :1 (code=exited, status=0/SUCCESS) Main PID: 97103 (Xtightvnc) Tasks: 77 (limit: 4665) Memory: 146.7M CPU: 4.459s CGroup: /system.slice/system-vncserver.slice/[email protected] . . .

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

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

  1. ssh -L 59000:localhost:5901 -C -N -l sammy your_server_ip

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

結論

これで、Ubuntu 22.04サーバーでセキュリティの確保されたVNCサーバーが稼働しています。これで、ファイル、ソフトウェア、設定をユーザーフレンドリーなグラフィカルインターフェイスで管理できるようになり、リモートでウェブブラウザなどのグラフィカルソフトウェアを実行できます。

Source:
https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-vnc-on-ubuntu-22-04