CUBE SUGAR CONTAINER

技術系のこと書きます。

Ubuntu 24.04 LTS に TightVNC を入れて macOS から GUI で操作する

GNU/Linux ディストリビューションのシステムは、大抵の操作を CUI で完結できる。 とはいえ、たまに特定の操作を GUI のフロントエンドでやりたくなることもある。 そんなとき、わざわざ筐体にディスプレイなどをつないで操作するのは手間がかかる。 そもそも、操作したいマシンと物理的に離れていることも多い。

そのような場面で、マシンを GUI で操作する方法はいくつか考えられる。 最もシンプルなのは SSH で X11 Forwarding することだろう。 その次に、もうちょっとリッチなデスクトップ環境が使いたいときに検討する選択肢のひとつが VNC だと思う。

今回は、Ubuntu 24.04 LTS に TightVNC を入れて macOS から操作する方法について書く。 このとき、接続には SSH Port Forwarding を使うことで外部には VNC 用のポートを公開しないようにする。

VNC サーバを入れた Ubuntu の環境は次のとおり。

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 24.04.2 LTS
Release:    24.04
Codename:   noble
$ uname -srm
Linux 6.8.0-57-generic x86_64
$ tightvncserver --help 2>&1 | head -n 1
TightVNC Server version 1.3.10

VNC クライアントに使った macOS の環境は次のとおり。

$ sw_vers            
ProductName:        macOS
ProductVersion:     15.4
BuildVersion:       24E248
$ ssh -V      
OpenSSH_9.9p1, LibreSSL 3.3.6

もくじ

下準備

あらかじめ TightVNC と、デスクトップ環境として xfce4 をインストールしておく。

$ sudo apt-get install tightvncserver xfce4

VNC 接続用のパスワードを設定する

まずは tightvncpasswd コマンドを実行して VNC 用のパスワードを設定する。 このパスワードは、VNC クライアントからサーバに接続する際の認証に使われる。 使用するパスワードの長さは 6 ~ 8 文字になっている必要があるらしい。 ただし、今回の構成では SSH PortForwarding することが前提なので、その部分でセキュリティを担保する。 ここで設定するパスワードに関してはおまけのような感じ。

$ tightvncpasswd 
Using password file /home/amedama/.vnc/passwd
VNC directory /home/amedama/.vnc does not exist, creating.
Password: 
Verify:   
Would you like to enter a view-only password (y/n)? n

TightVNC のサーバを起動する

次に、tightvncserver コマンドを使って TightVNC のサーバを起動する。 このとき、必ず -localhost のオプションを指定する。 これでホストの外部に VNC 用のポートが公開されない。

$ tightvncserver -localhost -nolisten tcp -nevershared :1

その他のオプションについては、-nolisten tcp では Xserver へのリモート接続を抑制している。 そして -nevershared では、複数のクライアントから接続があった際にそれぞれで状態を共有しないようにする。 末尾の :1 では、仮想ディスプレイ番号 1 番で待ち受けることを指定している。 VNC サーバが使用するポート番号は、5900 に仮想ディスプレイの番号を足したものになる。

サーバを起動すると、ループバックアドレスで TCP の 5901 番を待ち受けていることが確認できる。

$ ss -tlnp | grep tight
LISTEN 0      5          127.0.0.1:5901       0.0.0.0:*    users:(("Xtightvnc",pid=4107,fd=1))

macOS から TightVNC のサーバに接続する

次に macOS から TightVNC のサーバへ接続しにいく。 まずは macOS から TightVNC をインストールしたマシンへ SSH でログインする。 このとき、リモートの 5901 番ポートをローカルの 5901 番ポートに対応する形で Port Forwarding する。

$ ssh -L 5901:localhost:5901 <remote>

上記で <remote> の部分は TightVNC をインストールしたマシンに付与した IP アドレスやドメイン名に読みかえる。

SSH で Port Forwarding できたら、macOS の「Finder > 移動 > サーバへ接続」を開く。 「サーバへ接続」の画面が開いたらサーバとして「vnc://localhost:5901」を入力して「接続」ボタンを押下する。

Finder > 移動 > サーバへ接続

すると、パスワードの入力を求められるので最初の工程で設定した VNC 用のパスワードを入力する。

VNC 用のパスワードを入力する

すると、次のようにそっけない画面が表示される。

初期状態のデスクトップ

ひとまず、これで VNC で接続できることが確認できた。

接続時に xfce4 のデスクトップ環境を起動する

次に、VNC で接続した際に xfce4 のデスクトップ環境を起動するように設定する。 まずは、デフォルトの設定用スクリプトをバックアップしておく。

$ cp ~/.vnc/xstartup{,.bak}

もし、何かあったときはバックアップから元に戻せば良い。

その上で、xfce4 の環境を起動する内容を設定用スクリプトに書き込む。

$ cat << 'EOF' > ~/.vnc/xstartup
#!/bin/sh

xrdb "$HOME/.Xresources"
startxfce4 &
EOF

設定したら、今起動している TightVNC のサーバを停止する。 これには tightvncserver -kill :<仮想ディスプレイ番号> を実行する。

$ tightvncserver -kill :1

停止したら、改めて起動する。 これで先ほどの設定用スクリプトが読み込まれるようになる。

$ tightvncserver -localhost -nolisten tcp -nevershared :1

あとは、先ほどと同じ手順でもう一度 macOS から VNC サーバに接続する。 すると、今度は次のようにちゃんとしたデスクトップ環境が表示される。

xfce4 のデスクトップ環境が表示される

あとは、上記の画面を使って必要な操作を進める。

そして、使い終わったら VNC サーバを停止する。

$ tightvncserver -kill :1

いじょう。