TigerVNC
関連記事
TigerVNC は VNC プロトコルの実装です。この記事ではサーバー機能に焦点をあてています。
目次
インストール
Vncserver には2つのリモート制御機能が存在します:
- 標準的な X サーバーと同じような仮想 (ヘッドレス) サーバー。物理的な画面ではなく仮想スクリーンを使用する。仮想サーバーは物理的な X サーバーと並行して動作します。
- 物理モニターを使用しているローカルの X セッションの直接制御。
仮想 (ヘッドレス) セッションで vncserver を実行
環境, 設定, パスワードファイルの作成
Vncserver は最初の実行時に環境, 設定, ユーザーパスワードファイルを作成します。作成されたファイルは ~/.vnc
に保存されます。
$ vncserver
You will require a password to access your desktops. Password: Verify: New 'mars:1 (facade)' desktop is mars:1 Creating default startup script /home/facade/.vnc/xstartup Starting applications specified in /home/facade/.vnc/xstartup Log file is /home/facade/.vnc/mars:1.log
vncserver が動作するデフォルトのポートは :1 で、サーバーが動作する TCP ポートと対応しています (5900+n = ポート番号)。この場合、5900+1=5901 で動作します。二度 vncserver を動作させると次の数字でフリーのポート (:2 または 5902) に2番目のインスタンスが作成されます。
vncserver を終了するには -kill スイッチを使います:
$ vncserver -kill :1
環境ファイルの編集
Vncserver は ~/.vnc/xstartup
を読み込んで .xinitrc ファイルのように使います。ユーザーはこのファイルから DE を起動してください。詳しくは一般的な推奨事項#デスクトップ環境を参照。
例えば、LXQt を起動するには:
~/.vnc/xstartup
#!/bin/sh exec startlxqt
設定ファイルの編集 (任意)
tigervnc 1.60-1 から ~/.vnc/config
のオプションが読み込まれるようになり、毎回 vncserver
にコマンドラインスイッチを指定する必要がなくなりました。ファイルは1行1オプションで記述します。例:
~/.vnc/config
## Supported server options to pass to vncserver upon invocation can be listed ## in this file. See the following manpages for more: vncserver(1) Xvnc(1). ## Several common ones are shown below. Uncomment and modify to your liking. ## securitytypes=tlsvnc desktop=sandbox geometry=1200x700 dpi=96 localhost alwaysshared
systemd で vncserver を起動・停止
Systemd のユーザーサービスやシステムサービスを使うことで、サービスとして vncserver を管理することができます。どちらの方法も下で説明します。
ユーザーモード
ユーザーモードでサービスを起動:
$ systemctl --user start vncserver@:1
ユーザーモードでサービスを有効化:
$ systemctl --user enable vncserver@:1
システムモード
/etc/systemd/system/vncserver@:1.service
を作成してください (:1
は $DISPLAY
環境変数の値に置き換えてください)。
サーバーを実行するユーザー (User=
) や vncserver のオプション (usr/bin/vncserver %i -arg1 -arg2 -argn
) などサービスは適宜修正してください。
/etc/systemd/system/vncserver@:1.service
[Unit] Description=Remote desktop service (VNC) After=syslog.target network.target [Service] Type=simple User=foo PAMName=login PIDFile=/home/foo/.vnc/%H:%i.pid ExecStartPre=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :' ExecStart=/usr/bin/vncserver -geometry 1440x900 -alwaysshared -fg %i ExecStop=/usr/bin/vncserver -kill %i [Install] WantedBy=multi-user.target
vncserver@:1.service
を起動してください。ブート時に実行されるようにするには有効化してください。
マルチユーザーモード
systemd のソケットアクティベーションと XDMCP を組み合わせることでユーザーがログインするたびに VNC サーバーを自動的に生成することができます。ユーザーごとにサーバーとポートを設定する必要がなくなります。以下の設定ではディスプレイマネージャを使用してユーザーの認証を行っているため、VNC のパスワードも不要です。欠点としてはユーザーがサーバー上のセッションを一度抜けると再接続できないという点が挙げられます。以下のユニットを使うには、まず XDMCP をセットアップしてディスプレイマネージャが動作するようにしてください。
/etc/systemd/system/xvnc.socket
[Unit] Description=XVNC Server [Socket] ListenStream=5900 Accept=yes [Install] WantedBy=sockets.target
/etc/systemd/system/xvnc@.service
[Unit] Description=XVNC Per-Connection Daemon [Service] ExecStart=-/usr/bin/Xvnc -inetd -query localhost -geometry 1920x1080 -once -SecurityTypes=None User=nobody StandardInput=socket StandardError=syslog
systemctl を使って xvnc.socket
を起動・有効化してください。ポート 5900 に接続することで何人でもデスクトップを表示することができます。
VNC サーバーにインターネットから接続する場合、xvnc@.service
の Xvnc
に -localhost
オプションを追加して、下の説明を読んで SSH 経由で接続するようにしてください (-query localhost
の 'localhost' は -localhost
とは違います)。接続後にユーザーを選択するため、VNC サーバーは 'nobody' ユーザーで動作し 'vncserver' スクリプトの代わりに xvnc を直接使用します。そのため ~/.vnc
のオプションは無視されます。任意で vncconfig
を自動起動することでクリップボードを機能させることができます (VNC 以外のセッションでは vncconfig
はすぐに終了します)。以下のファイルを作成してください:
/etc/X11/xinit/xinitrc.d/99-vncconfig.sh
#!/bin/sh vncconfig -nowin &
物理ディスプレイで vncserver を実行
TigerVNC の x0vncserver を使う
tigervnc には物理的な X セッションを直接操作できる x0vncserver バイナリが入っています。以下のようにして実行してください:
$ x0vncserver -display :0 -passwordfile ~/.vnc/passwd
詳しくは x0vncserver の man ページを参照。
systemd で x0vncserver を起動・停止
VNC サーバーで x0vncserver を実行するには、systemd ユニットを作成します。現在のデスクトップにリモートからアクセスする一番簡単な方法です。
/etc/systemd/system/x0vncserver.service
を作成してサーバーを実行するユーザーやオプションを指定してください:
/etc/systemd/system/x0vncserver.service
[Unit] Description=Remote desktop service (VNC) After=syslog.target network.target [Service] Type=forking User=foo ExecStart=/usr/bin/sh -c '/usr/bin/x0vncserver -display :0 -rfbport 5900 -passwordfile /home/foo/.vnc/passwd &' [Install] WantedBy=multi-user.target
x11vnc を使う
x11vnc には利点と欠点が存在しアクセスするのに root を必要とします。詳しくは X11vnc を見てください。
vncserver に接続する
vncserver に接続できるクライアントは多数存在します。下は 10.1.10.2 のポート 5901 (:1) で動作している vncserver に接続するコマンド例です:
$ vncviewer 10.1.10.2:1
パスワードなしで認証
-passwd
スイッチを使うことでサーバーの ~/.vnc/passwd
ファイルの場所を定義することができます。サーバー上のこのファイルには SSH か物理的なアクセスによってユーザーがアクセスすることが期待されています。どちらの場合でも、クライアントのファイルシステム上の安全な場所、つまり特定のユーザーだけが読み込みアクセスできる場所にファイルを置いて下さい。
$ vncviewer -passwd /path/to/server-passwd-file
GUI ベースのクライアント
TigerVNC の vncviewer にはシンプルが GUI が存在し、何もパラメータを付けずに実行します:
$ vncviewer
SSH トンネル経由で vncserver にアクセス
SSH トンネリングの利点は他のポートを開く必要がなく、文字通り通信がトンネル化されるということです。ユーザーは WAN に対して既に開いている SSH ポートを使用することができます。以下の方法で vncserver を実行する際は -localhost
スイッチを使用してローカルホストからの接続だけを許可するようにすることを強く推奨します。物理的にマシンに ssh することができるユーザーだけが vncserver を使えるようになります。
サーバー側
以下は -localhost フラグを使って vncserver を起動するコマンド例です:
$ vncserver -geometry 1440x900 -alwaysshared -dpi 96 -localhost :1
もしくは、~/.vnc/config
に "localhost" オプションを追加してください。以下は上記コマンドと同じ設定例です:
~/.vnc.config
## Supported server options to pass to vncserver upon invocation can be listed ## in this file. See the following manpages for more: vncserver(1) Xvnc(1). ## Several common ones are shown below. Uncomment and modify to your liking. ## geometry=1200x700 alwaysshared dpi=96 localhost
クライアント側
サーバーはローカルホストからの接続だけを許可しているので、-L スイッチを使ってトンネルを有効にして ssh で接続します。例えば:
$ ssh 10.1.10.2 -L 5901:localhost:5901
上記はサーバーのポート 5901 をクライアントのポート 5901 に転送します。サーバーとクライアントでポート番号を必ずしも一致させる必要はありません。例:
$ ssh 10.1.10.2 -L 8900:localhost:5901
上記のコマンドはサーバーのポート 5901 をクライアントマシンのポート 8900 に転送します。
SSH で接続したら、サーバーと接続するための暗号化トンネルとして xterm やシェルのウィンドウは開いたままにしてください。暗号化トンネルを使って接続するには、vncviewer でローカルホストのクライアントポートを指定します。
サーバーとクライアントで同じポートを使用する場合:
$ vncviewer localhost:1
サーバーとクライアントで違うポートを使用する場合:
$ vncviewer localhost:8900
SSH で Android デバイスから VNC サーバーに接続する
Android デバイスを使って SSH で VNC サーバーに接続するには:
1. 接続するマシン上で SSH サーバーを動作させる。 2. 接続するマシン上で VNC サーバーを動作させる (上述のように -localhost フラグでサーバーを起動する)。 3. Android デバイスで SSH クライアントを使う (ConnectBot が人気があります、この外では例としてこれを使います)。 4. Android デバイスで VNC クライアントを使う (androidVNC)。
固定 IP アドレスを持たないマシンではダイナミック DNS サービスを使うことを考慮してください。
ConnectBot で、IP を入力してマシンに接続してください。オプションキーをタップして、Port Forwards を選択し新しいポートを追加してください:
Nickname: vnc Type: Local Source port: 5901 Destination: 127.0.0.1:5901 (it did not work for me when I typed in 192.168.x.xxx here, I had to use 127.0.0.1)
保存してください。
androidVNC で:
Nickname: nickname Password: the password used to set up the VNC server Address: 127.0.0.1 (we are in local after connecting through SSH) Port: 5901
接続してください。
Tips and tricks
macOS に接続する
https://help.ubuntu.com/community/AppleRemoteDesktop を見てください。Remmina でテスト済みです。
リモートマシンからローカルにクリップボードの内容をコピーする
リモートマシンからローカルマシンへのコピーが動作しない場合、サーバー上で以下のように autocutsel を起動して下さい [1]:
$ autocutsel -fork
F8 を押して VNC メニューのポップアップを表示し、Clipboard: local -> remote
オプションを選択してください。
上記のコマンドを ~/.vnc/xstartup
に記述することで vncserver の起動時に自動で動作するようにすることができます。
マウスカーソルが表示されない問題
x0vncserver
の使用時にマウスカーソルが表示されない場合、以下のように vncviewer を起動して下さい:
$ vncviewer DotWhenNoCursor=1 <server>
もしくは tigervnc の設定ファイルに DotWhenNoCursor=1
を記述してください。デフォルトでは ~/.vnc/default.tigervnc
に存在します。
推奨セキュリティ設定
SecurityTypes は使用するセキュリティアルゴリズムを制御します。現在のバージョン 1.5.0 でのデフォルトは "X509Plain,TLSPlain,X509Vnc,TLSVnc,X509None,TLSNone,VncAuth,None" です。"X509Vnc,TLSVnc" とすることで暗号化しないデータのやりとりを無効化できます。
TLSVnc では同一性確認がないため、X509Vnc を使うことを推奨します:
$ vncserver -x509key /path/to/key.pem -x509cert /path/to/cerm.pem -SecurityTypes X509Vnc :1
x509 証明書の作成方法はこの記事では説明しません。Let’s Encrypt を使用したり、OpenSSL を使って手動で証明書を発行してサーバーとクライアントで鍵を共有できます。
フルスクリーンの切り替え
vncclient のメニューから切り替えることができます。デフォルトでは vncclient のメニューは F8 で呼び出せます。
小なり記号が入力できない (<)
リモートクライアントで <
と入力すると >
が出力される場合、キーのマッピングを変更してみてください [2]:
$ x0vncserver -RemapKeys="0x3c->0x2c"