「TigerVNC」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
 
(同じ利用者による、間の18版が非表示)
1行目: 1行目:
[[Category:セキュリティ]]
 
 
[[Category:リモートデスクトップ]]
 
[[Category:リモートデスクトップ]]
  +
[[Category:サーバー]]
 
[[de:VNC]]
 
[[de:VNC]]
 
[[en:TigerVNC]]
 
[[en:TigerVNC]]
10行目: 10行目:
 
{{Related|TurboVNC}}
 
{{Related|TurboVNC}}
 
{{Related articles end}}
 
{{Related articles end}}
[http://tigervnc.org/ TigerVNC] は [[Wikipedia:VNC|VNC]] プロトコルの実装です。この記事ではサーバー機能に焦点をあてています。
+
[http://tigervnc.org/ TigerVNC] は [[Wikipedia:Virtual Network Computing|Virtual Network Computing]] (VNC) プロトコルの実装です。この記事ではサーバー機能に焦点をあてています。
   
 
== インストール ==
 
== インストール ==
48行目: 48行目:
 
{{Note|{{ic|/usr/bin/vncserver}} への直接の呼び出しは、適切なセッションスコープを確立しないため、サポートされていません。''systemd'' サービスは TigerVNC を使うために唯一サポートされている方法です。[https://github.com/TigerVNC/tigervnc/issues/1096 Issue #1096] を参照してください。}}
 
{{Note|{{ic|/usr/bin/vncserver}} への直接の呼び出しは、適切なセッションスコープを確立しないため、サポートされていません。''systemd'' サービスは TigerVNC を使うために唯一サポートされている方法です。[https://github.com/TigerVNC/tigervnc/issues/1096 Issue #1096] を参照してください。}}
   
== 物理ディスプレイで vncserver 実行 ==
+
== ローカルディスプレイを直接公開する ==
   
  +
Tigervnc は {{ic|libvnc.so}} を同梱しており、これは X の初期化中に直接ロードすることができます。これにより、パフォーマンスが向上します。
=== TigerVNC の x0vncserver を使う ===
 
  +
以下のファイルを作成し、X を再起動してください:
{{Pkg|tigervnc}} には物理的な X セッションを直接操作できる x0vncserver バイナリが入っています。以下のようにして実行してください:
 
$ x0vncserver -display :0 -passwordfile ~/.vnc/passwd
 
   
  +
{{hc|/etc/X11/xorg.conf.d/10-vnc.conf|
詳しくは x0vncserver の [[man ページ]]を参照。
 
  +
Section "Module"
  +
Load "vnc"
  +
EndSection
   
  +
Section "Screen"
==== systemd で x0vncserver を起動・停止 ====
 
  +
Identifier "Screen0"
  +
Option "UserPasswdVerifier" "VncAuth"
  +
Option "PasswordFile" "/root/.vnc/passwd"
  +
EndSection
  +
}}
   
  +
== x0vncserver を直接実行してローカルディスプレイを制御する ==
{{Warning|ローカルネットワークが信頼できない場合は以下のサービスを使ってはいけません。}}
 
   
  +
{{Pkg|tigervnc}} はまた、{{man|1|x0vncserver}} も提供しており、これによって物理的な X セッションを直接制御することができます。''vncpasswd'' ツールを使ってセッションパスワードを定義した後、以下のようにサーバーを起動します:
VNC サーバーで x0vncserver を実行するには、systemd ユニットを作成します。現在のデスクトップにリモートからアクセスする一番簡単な方法です。
 
   
  +
$ x0vncserver -rfbauth ~/.vnc/passwd
{{Note|以下のユニットはユーザーによって X セッションが実行されている場合にのみ使用することができます。}}
 
   
  +
{{Note|
{{ic|/etc/systemd/system/x0vncserver.service}} を作成してサーバーを実行するユーザーやオプションを指定してください:
 
  +
* [[x11vnc]] は、現在の X セッションを直接制御できる代替の VNC サーバーでもあります。
  +
* {{ic|x0vncserver}} は現在、クライアントとサーバー間のクリップボード共有をサポートしていません({{ic|autocutsel}} の助けを借りても)。参照:[https://github.com/TigerVNC/tigervnc/issues/529 Issue #529]。
  +
}}
   
  +
=== xprofile とともに ===
{{hc|/etc/systemd/system/x0vncserver.service|
 
  +
<nowiki>
 
  +
''x0vncserver'' を簡単に起動する方法の一つは、[[xprofile]] ファイルの一つに以下のような行を追加することです:
  +
  +
{{hc|~/.xprofile|
  +
...
  +
x0vncserver -rfbauth ~/.vnc/passwd &
  +
}}
  +
  +
=== systemd とともに ===
  +
  +
==== システムサービスとして ====
  +
  +
このオプションは、ユーザーが現在のディスプレイ、およびディスプレイマネージャーが提供するログイン画面にアクセスできるようにします。
  +
  +
このサービスは、ユーザーがセッションからログオフするたびに自動的に再起動されます。
  +
  +
以下の例では [[LightDM]] が使用されていますが、{{ic|XAUTHORITY}} 変数を修正することで他のディスプレイマネージャーに適応させることが可能です。
  +
  +
{{hc|/etc/systemd/system/x0vncserver.service|2=
 
[Unit]
 
[Unit]
Description=Remote desktop service (VNC)
+
Description=Remote desktop service (VNC) for :0 display
  +
Requires=display-manager.service
After=syslog.target network.target
 
  +
After=network-online.target
  +
After=display-manager.service
   
 
[Service]
 
[Service]
Type=forking
+
Type=simple
  +
Environment=HOME=/root
User=foo
 
  +
Environment=XAUTHORITY=/var/run/lightdm/root/:0
ExecStart=/usr/bin/sh -c '/usr/bin/x0vncserver -display :0 -rfbport 5900 -passwordfile /home/foo/.vnc/passwd &'
 
  +
ExecStart=x0vncserver -display :0 -rfbauth ~/.vnc/passwd
  +
Restart=on-failure
  +
RestartSec=500ms
   
 
[Install]
 
[Install]
 
WantedBy=multi-user.target
 
WantedBy=multi-user.target
  +
}}
</nowiki>}}
 
   
  +
このサービスはシステムユニットなので、{{ic|-rfbauth ~/.vnc/passwd}} は {{ic|/root/.vnc/passwd}} を指します。
=== x11vnc を使う ===
 
  +
{{pkg|x11vnc}} には利点と欠点が存在しアクセスするのに root を必要とします。詳しくは [[X11vnc]] を見てください。
 
  +
{{ic|x0vncserver.service}} を[[開始/有効化]]してください。
  +
  +
==== ユーザーサービスとして ====
  +
  +
現在のデスクトップにリモートアクセスをすぐに設定できる最も簡単な方法として、''x0vncserver'' を実行する VNC サーバーを持つために、以下のように ''systemd'' ユニットを作成して、必要なユーザーとオプションで置き換えてください:
  +
  +
{{hc|~/.config/systemd/user/x0vncserver.service|2=
  +
[Unit]
  +
Description=Remote desktop service (VNC)
  +
  +
[Service]
  +
Type=simple
  +
ExecStartPre=/bin/sh -c 'while ! pgrep -U "$USER" Xorg; do sleep 2; done'
  +
ExecStart=/usr/bin/x0vncserver -rfbauth %h/.vnc/passwd
  +
  +
[Install]
  +
WantedBy=default.target
  +
}}
  +
  +
{{ic|ExecStartPre}} 行は、{{ic|${USER}<nowiki/>}} によって Xorg が開始されるのを待っています。
  +
  +
ユーザーネームとパスワードでログインする場合は、{{ic|ExecStart}} を {{ic|1=/usr/bin/x0vncserver -PAMService=login -PlainUsers=${USER} -SecurityTypes=TLSPlain}} に置き換えてください。
  +
  +
{{ic|x0vncserver.service}} ユーザーユニットを[[開始/有効化]]してください。
  +
  +
== XDMCP と組み合わせて Xvnc をオンデマンドセッションで実行する ==
  +
  +
''systemd'' のソケットアクティベーションと [[XDMCP]] を組み合わせることで、ログインしようとする各ユーザーごとに自動的に VNC サーバーを生成することができます。そのため、ユーザーごとにサーバー/ポートを設定する必要はありません。このセットアップでは、ディスプレイマネージャーを使用してユーザーを認証し、ログインするため、VNC パスワードは必要ありません。欠点としては、ユーザーがサーバー上でセッションを継続して後で再接続することはできません。
  +
  +
これを動作させるには、まず [[XDMCP]] を設定し、ディスプレイマネージャーが動作していることを確認してください。
  +
次に、以下を作成します:
  +
  +
{{hc|/etc/systemd/system/xvnc.socket|2=
  +
[Unit]
  +
Description=XVNC Server
  +
  +
[Socket]
  +
ListenStream=5900
  +
Accept=yes
  +
  +
[Install]
  +
WantedBy=sockets.target
  +
}}
  +
  +
{{hc|/etc/systemd/system/xvnc@.service|2=
  +
[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
  +
}}
  +
  +
{{ic|xvnc.socket}} を[[開始/有効化]]してください。これで、任意の数のユーザーがポート 5900 に接続することで独自のデスクトップを取得できます。
  +
  +
VNC サーバーがインターネットに公開されている場合は、{{ic|xvnc@.service}} の {{ic|Xvnc}} に {{ic|-localhost}} オプションを追加してください({{ic|-query localhost}} と {{ic|-localhost}} は異なるスイッチです)、[[#Accessing vncserver via SSH tunnels]] に従ってください。接続後にユーザーを選択するだけなので、VNC サーバーはユーザー ''nobody'' として実行され、{{ic|vncserver}} スクリプトの代わりに直接 {{ic|Xvnc}} を使用するため、{{ic|~/.vnc}} のオプションは無視されます。オプションで、クリップボードが動作するように ''vncconfig'' を [[自動起動]]させてください(''vncconfig'' は非 VNC セッションで即座に終了します)。作成する一つの方法は:
  +
  +
{{hc|/etc/X11/xinit/xinitrc.d/99-vncconfig.sh|
  +
#!/bin/sh
  +
vncconfig -nowin &
  +
}}
   
 
== vncserver に接続する ==
 
== vncserver に接続する ==
115行目: 211行目:
 
サーバ側では、''vncserver'' または、 ''x0vncserver'' を実行する必要があります。
 
サーバ側では、''vncserver'' または、 ''x0vncserver'' を実行する必要があります。
   
  +
これらのどちらかを実行する場合、{{ic|~/.vnc/config}} の {{ic|localhost}} オプション、または {{ic|-localhost}} スイッチ(''x0vncserver'' の場合)を使用することをお勧めします。例えば
When running either one of these, it is recommended to use the {{ic|localhost}} option in {{ic|~/.vnc/config}} or the {{ic|-localhost}} switch (for ''x0vncserver'') since it allows connections from the localhost only and by analogy, only from users ssh'ed and authenticated on the box. For example:
 
   
 
{{hc|~/.vnc/config|2=
 
{{hc|~/.vnc/config|2=
124行目: 220行目:
 
}}
 
}}
   
  +
例えば、{{ic|vncserver@.service}} を[[開始]]または[[再起動]]してください([[#初回セットアップ]]も参照してください)。
Make sure to [[Start]] or [[Restart]] the {{ic|vncserver@.service}}, for example (see also [[#Initial setup]]):
 
   
 
=== クライアント側 ===
 
=== クライアント側 ===
181行目: 277行目:
 
https://help.ubuntu.com/community/AppleRemoteDesktop を見てください。[[Remmina]] でテスト済みです。
 
https://help.ubuntu.com/community/AppleRemoteDesktop を見てください。[[Remmina]] でテスト済みです。
   
  +
=== 推奨セキュリティ設定 ===
=== リモートマシンからローカルにクリップボードの内容をコピーする ===
 
  +
{{Note|[[#SSH トンネル経由で vncserver にアクセス|SSH トンネル]]を使用する場合、sshd によって暗号化が行われるため X509Vnc は不要です。}}
   
  +
SecurityTypes は使用するセキュリティアルゴリズムを制御します。現在のバージョン 1.5.0 でのデフォルトは "X509Plain,TLSPlain,X509Vnc,TLSVnc,X509None,TLSNone,VncAuth,None" です。"X509Vnc,TLSVnc" とすることで暗号化しないデータのやりとりを無効化できます。
リモートマシンからローカルマシンへのコピーが動作しない場合、サーバー上で以下のように autocutsel を起動して下さい [https://bbs.archlinux.org/viewtopic.php?id=101243]:
 
   
  +
TLSVnc では同一性確認がないため、X509Vnc を使うことを推奨します:
$ autocutsel -fork
 
   
  +
$ vncserver -x509key /path/to/key.pem -x509cert /path/to/cerm.pem -SecurityTypes X509Vnc :1
F8 を押して VNC メニューのポップアップを表示し、{{ic|Clipboard: local -> remote}} オプションを選択してください。
 
   
  +
x509 証明書の作成方法はこの記事では説明しません。[[Let’s Encrypt]] を使用したり、[[OpenSSL]] を使って手動で証明書を発行してサーバーとクライアントで鍵を共有できます。
上記のコマンドを {{ic|~/.vnc/xstartup}} に記述することで vncserver の起動時に自動で動作するようにすることができます。
 
   
=== マウソルが表示されない問題 ===
+
=== フルクリンの切り替え ===
   
  +
これは VNC クライアントのメニューから行うことができます。デフォルトでは、VNC クライアントの mkey は {{ic|F8}} です。
{{ic|x0vncserver}} の使用時にマウスカーソルが表示されない場合、以下のように vncviewer を起動して下さい:
 
   
  +
=== マウスの戻る/進むボタンが動作しない場合の回避策 ===
$ vncviewer DotWhenNoCursor=1 <server>
 
   
  +
現在の VNC プロトコルは 7つのマウスボタン(左、中、右、スクロールアップ、スクロールダウン、スクロール左、スクロール右)しか使用していないため、マウスに戻るボタンと進むボタンがある場合、これらは使用できず、入力は無視されます。
もしくは tigervnc の設定ファイルに {{ic|DotWhenNoCursor<nowiki>=</nowiki>1}} を記述してください。デフォルトでは {{ic|~/.vnc/default.tigervnc}} に存在します。
 
   
  +
[https://www.bedroomlan.org/projects/evrouter/ evrouter] は、マウスの戻る/進むボタンをクリックしたときにキーボードのキー押下を送信してこの制限を回避するために使用できます。オプションで、{{Pkg|xautomation}} と {{Pkg|xbindkeys}} をサーバーで使用して、必要に応じてキーボードのキー押下をマウスボタンのクリックにマップバックできます。
=== 推奨セキュリティ設定 ===
 
{{Note|[[#SSH トンネル経由で vncserver にアクセス|SSH トンネル]]を使用する場合、sshd によって暗号化が行われるため X509Vnc は不要です。}}
 
   
  +
==== キーボードキー XF86Back/XF86Forward でマウスの戻る/進むボタンを代用する ====
SecurityTypes は使用するセキュリティアルゴリズムを制御します。現在のバージョン 1.5.0 でのデフォルトは "X509Plain,TLSPlain,X509Vnc,TLSVnc,X509None,TLSNone,VncAuth,None" です。"X509Vnc,TLSVnc" とすることで暗号化しないデータのやりとりを無効化できます。
 
   
  +
この方法はシンプルで、例えば Web ブラウザやファイルブラウザを使用している間に戻る/進むをナビゲートする方法が必要な場合に適しています。
TLSVnc では同一性確認がないため、X509Vnc を使うことを推奨します:
 
   
  +
クライアントで {{AUR|evrouter}} と {{Pkg|xautomation}} をインストールします。evrouter を設定します。正確なデバイス名、ウィンドウ名、ボタン名などを見つける方法とヒントについては、[[マウスボタン#evrouter]] と evrouter の man ページを参照してください。例の設定は以下の通りです:
$ vncserver -x509key /path/to/key.pem -x509cert /path/to/cerm.pem -SecurityTypes X509Vnc :1
 
   
  +
{{hc|~/.evrouterrc|
x509 証明書の作成方法はこの記事では説明しません。[[Let’s Encrypt]] を使用したり、[[OpenSSL]] を使って手動で証明書を発行してサーバーとクライアントで鍵を共有できます。
 
  +
Window "OtherComputer:0 - TigerVNC": # Window title used as filter
   
  +
# Using Shell to avoid repeating key presses (see evrouter manual)
== SSH トンネル経由での vncserver へのアクセス ==
 
  +
"USB mouse" "/dev/input/by-id/usb-Mouse-name-event-mouse" none key/275 "Shell/xte 'key XF86Back'"
  +
"USB mouse" "/dev/input/by-id/usb-Mouse-name-event-mouse" none key/276 "Shell/xte 'key XF86Forward'"
   
  +
# Use XKey below instead if repeating keys is desired (see evrouter manual)
For servers offering SSH connection, an advantage of this method is that it is not necessary to open any other port than the already opened SSH port to the outside, since the VNC traffic is tunneled through the SSH port.
 
  +
#"Logitech Gaming Mouse G400" "/dev/input/by-id/usb-Logitech_Gaming_Mouse_G400-event-mouse" none key/275 "XKey/XF86Back"
  +
#"Logitech Gaming Mouse G400" "/dev/input/by-id/usb-Logitech_Gaming_Mouse_G400-event-mouse" none key/276 "XKey/XF86Forward"
  +
}}
   
  +
クライアントで evrouter を起動します。上記の設定で、マウスの戻るボタンをクリックすると VNC サーバーに {{ic|XF86Back}} が送信され、進むボタンをクリックすると {{ic|XF86Forward}} が送信されます。
=== On the server ===
 
   
  +
==== サーバーでキーボードキー押下をマウスボタンクリックにマップバックする ====
On the server side, ''vncserver'' or ''x0vncserver'' must be run.
 
   
  +
必要に応じて、サーバーでキーボードキーをマウスボタンクリックにマップバックすることが可能です。この場合、クライアントやサーバーで絶対に使用されないキーボードキーを使用することが良いでしょう。以下の例では、キーボードキー {{ic|XF86Launch8}} / {{ic|XF86Launch9}} がマウスボタン 8/9 として使用されています。
When running either one of these, it is recommended to use the {{ic|localhost}} option in {{ic|~/.vnc/config}} or the {{ic|-localhost}} switch (for ''x0vncserver'') since it allows connections from the localhost only and by analogy, only from users ssh'ed and authenticated on the box. For example:
 
   
  +
クライアントでの evrouter 設定:
{{hc|~/.vnc/config|2=
 
  +
session=lxqt
 
  +
{{hc|~/.evrouterrc|
geometry=1920x1080
 
  +
Window "OtherComputer:0 - TigerVNC": # ウィンドウタイトル
localhost
 
  +
alwaysshared
 
  +
# キー押下を繰り返さないように Shell を使用(evrouter マニュアルを参照)
  +
"USB mouse" "/dev/input/by-id/usb-Mouse-name-event-mouse" none key/275 "Shell/xte 'key XF86Launch8'"
  +
"USB mouse" "/dev/input/by-id/usb-Mouse-name-event-mouse" none key/276 "Shell/xte 'key XF86Launch9'"
 
}}
 
}}
   
  +
サーバーで {{Pkg|xautomation}} と {{Pkg|xbindkeys}} をインストールします。xbindkeys を設定して、キーボードキー {{ic|XF86Launch8}} / {{ic|XF86Launch9}} を xte を使ってマウスボタン 8/9 にマップします。
Make sure to [[Start]] or [[Restart]] the {{ic|vncserver@.service}}, for example (see also [[#Initial setup]]):
 
   
  +
{{hc|~/.xbindkeysrc|
# systemctl start vncserver@:1
 
  +
"xte 'mouseclick 8'"
  +
XF86Launch8
   
  +
"xte 'mouseclick 9'"
or for ''x0vncserver'':
 
  +
XF86Launch9
  +
}}
   
  +
xbindkeys({{ic|xbindkeys -f ~/.xbindkeysrc}})を起動します。サーバーは、{{ic|XF86Launch8}} / {{ic|XF86Launch9}} をマウスボタン 8/9 にマップするようになります。
$ x0vncserver '''-localhost''' -SecurityTypes none
 
   
  +
== トラブルシューティング ==
=== On the client ===
 
   
  +
=== ウィンドウの代わりに黒い四角 ===
The VNC server has been setup on the remote machine to only accept local connections.
 
Now, the client must open a secure shell with the remote machine (10.1.10.2 in this example) and create a tunnel from the client port, for instance 9901, to the remote server 5901 port. For more details on this feature, see [[OpenSSH#Forwarding other ports]] and {{man|1|ssh}}.
 
   
  +
おそらく、これはアプリケーションが Composite Xorg 拡張を厳密に必要としているためです。例えば、webkit ベースのアプリ:midori、psi-plus など。
$ ssh 10.1.10.2 -L 9901:localhost:5901
 
   
  +
この場合、以下のようなコマンドで vncserver を再起動してください:
Once connected via SSH, leave this shell window open since it is acting as the secured tunnel with the server. Alternatively, directly run SSH in the background using the {{ic|-f}} option. On the client side, to connect via this encrypted tunnel, point the ''vncviewer'' to the forwarded client port on the localhost.
 
   
  +
$ vncserver -geometry ... -depth 24 :1 +extension Composite
$ vncviewer localhost:9901
 
   
  +
Composite 拡張は、VNC で 24 ビット深度でしか動作しないようです。
What happens in practice is that the vncviewer connects locally to port 9901 which is tunneled to the server's localhost port 5901. The connection is established to the right port within the secure shell.
 
   
  +
=== マウスカーソルのある空の黒いウィンドウ ===
{{Tip|It is possible, with a one-liner, to keep the port forwarding active during the connection and close it right after:
 
{{bc|$ ssh -fL 9901:localhost:5901 10.1.10.2 sleep 10; vncviewer localhost:9901}}
 
What it does is that the {{ic|-f}} switch will make ssh go in the background; it will still be alive executing {{ic|sleep 10}}. vncviewer is then executed and ssh remains open in the background as long as vncviewer makes use of the tunnel. ssh will close once the tunnel is dropped which is the wanted behavior.
 
   
  +
ユーザーが物理的な X セッションにログインしていないことを確認してください、{{ic|x0vncserver}} でこのオプションが設定されていない限り。単一のユーザーで複数の X セッションはサポートされていません。詳細は https://github.com/TigerVNC/tigervnc/issues/684#issuecomment-494385395 を参照してください。
Alternatively, vncviewer's {{ic|-via}} switch provides a shortcut for the above command:
 
{{bc|$ vncviewer -via 10.1.10.2 localhost::5901}}
 
(Notice the double colon – vncviewer's syntax is {{ic|[host]:[display#]}} or {{ic|[host]::[port]}}.)
 
}}
 
   
  +
逆に、VNC サーバーサービスがそのユーザーで動作している間にローカルの X セッションにログインしようとすると、うまくいかない可能性があり、デスクトップ環境を使用している場合、スプラッシュスクリーンで詰まることがあります。
=== Connecting to a vncserver from Android devices over SSH ===
 
   
  +
=== マウスカーソルが表示されない ===
To connect to a VNC server over SSH using an Android device as a client, consider having the following setup:
 
   
  +
''x0vncserver'' を使用していてマウスカーソルが表示されない場合、以下のように ''vncviewer'' を起動してください:
# SSH running on the server
 
# vncserver running on server (with {{ic|-localhost}} flag for security)
 
# SSH client on the Android device: ''ConnectBot'' is a popular choice and will be used in this guide as an example
 
# VNC client on the Android device: ''androidVNC'' used here
 
   
  +
$ vncviewer DotWhenNoCursor=1 ''サーバー''
In ''ConnectBot'', connect to the desired machine. Tap the options key, select ''Port Forwards'' and add a port:
 
   
  +
または、TigerVNC の設定ファイル(デフォルトで {{ic|~/.vnc/default.tigervnc}} にあります)に {{ic|1=DotWhenNoCursor=1}} を追加してください。
Type: Local
 
Source port: 5901
 
Destination: 127.0.0.1:5901
 
   
  +
=== リモートマシンからのクリップボードの内容をコピーする ===
In ''androidVNC'', connect to the VNC port; this is the local address following the SSH connection:
 
   
  +
リモートマシンからローカルマシンへのコピーが機能しない場合は、サーバー上で {{ic|autocutsel}} を実行してください。詳しくは [https://bbs.archlinux.org/viewtopic.php?id=101243] を参照:
Password: the vncserver password
 
Address: 127.0.0.1
 
Port: 5901
 
   
  +
$ autocutsel -fork
=== フルスクリーンの切り替え ===
 
  +
  +
次に、{{ic|F8}} キーを押して VNC メニューのポップアップを表示し、{{ic|Clipboard: local -> remote}} オプションを選択してください。
  +
  +
=== ウィンドウ装飾 / 境界線 / タイトルバーがない / ウィンドウを動かせない ===
  +
  +
空の [[xterm]] フレームを修正するためにウィンドウマネージャーを起動してください。例えば、[[Xfce]] 上では {{ic|xfwm4 &}} を実行してください。
  +
  +
=== デスクトップ環境でフォントがボックスで表示される ===
   
  +
一部の[[デスクトップ環境]]では、ASCII 文字を表示するための必要なフォントが欠けている可能性があります。{{pkg|ttf-dejavu}} を[[インストール]]してください。
vncclient のメニューから切り替えることができます。デフォルトでは vncclient のメニューは F8 で呼び出せます。
 
   
  +
== 参照 ==
=== 小なり記号が入力できない (<) ===
 
リモートクライアントで {{ic|<}} と入力すると {{ic|>}} が出力される場合、キーのマッピングを変更してみてください [https://insaner.com/blog/2013/05.html#20130422063137]:
 
   
  +
* https://github.com/TigerVNC/tigervnc
$ x0vncserver -RemapKeys="0x3c->0x2c"
 

2023年9月15日 (金) 20:58時点における最新版

関連記事

TigerVNCVirtual Network Computing (VNC) プロトコルの実装です。この記事ではサーバー機能に焦点をあてています。

目次

インストール

tigervnc パッケージをインストールしてください。

ノート: パッケージには vncserver, x0vncserver, vncviewer が含まれています。

Vncserver には2つのリモート制御機能が存在します:

  1. 標準的な X サーバーと同じような仮想 (ヘッドレス) サーバー。物理的な画面ではなく仮想スクリーンを使用する。仮想サーバーは物理的な X サーバーと並行して動作します。
  2. 物理モニターを使用しているローカルの X セッションの直接制御。

vncserver をバーチャル(ヘッドレス)セッションで起動する

初回セットアップ

ノート: Linux システムでは物理メモリが許すかぎりいくらでも VNC サーバーを使うことができます。それぞれは互いに並行して動きます。

クイックスタートについては、以下のステップを参照してください。 設定オプションの完全なリストについては vncserver(8) を読むことをお勧めします。

  1. vncpasswd を使用してパスワードを作成して、ハッシュ化したパスワードを ~/.vnc/passwd に保存します。
  2. /etc/tigervnc/vncserver.users を編集して、ユーザマッピングを定義します。このファイルで定義された各ユーザは、そのセッションが実行される対応するポートを持っています。ファイル内の数字は、TCP ポートに対応します。デフォルトでは、:1 が TCP ポート 5901 (5900+1) になっています。別の並列サーバが必要な場合、2 番目のインスタンスは次に高い空きポート、つまり 5902 (5900+2) で実行することができます。
  3. ~/.vnc/config を作成し、最低限 session=foo のような行で、実行するデスクトップ環境を foo に対応させたセッションの種類を定義してください。どのデスクトップ環境がシステムで利用できるかは、/usr/share/xsessions/ 内の .desktop ファイルで確認できます。例えば:
~/.vnc/config
session=lxqt
geometry=1920x1080
localhost
alwaysshared
ノート: 前のステップを完全に動作させるには、追加のセキュリティ設定が必要です。設定を完了するには、#SSHトンネル経由での vncserver へのアクセスを参照してください。テスト目的では、この手順を省略して localhost 以外からの安全でない接続を許可します。

tigervnc の開始と終了

vncserver@.service テンプレートのインスタンスを 起動 します。オプションで起動時やシャットダウン時に動くよう有効化します。この場合のインスタンス識別子はディスプレイ番号であることに注意してください(例:ディスプレイ番号 :1 のインスタンス vncserver@:1.service など)。

ノート: /usr/bin/vncserver への直接の呼び出しは、適切なセッションスコープを確立しないため、サポートされていません。systemd サービスは TigerVNC を使うために唯一サポートされている方法です。Issue #1096 を参照してください。

ローカルディスプレイを直接公開する

Tigervnc は libvnc.so を同梱しており、これは X の初期化中に直接ロードすることができます。これにより、パフォーマンスが向上します。 以下のファイルを作成し、X を再起動してください:

/etc/X11/xorg.conf.d/10-vnc.conf
Section "Module"
Load "vnc"
EndSection

Section "Screen"
Identifier "Screen0"
Option "UserPasswdVerifier" "VncAuth"
Option "PasswordFile" "/root/.vnc/passwd"
EndSection

x0vncserver を直接実行してローカルディスプレイを制御する

tigervnc はまた、x0vncserver(1) も提供しており、これによって物理的な X セッションを直接制御することができます。vncpasswd ツールを使ってセッションパスワードを定義した後、以下のようにサーバーを起動します:

$ x0vncserver -rfbauth ~/.vnc/passwd
ノート:
  • x11vnc は、現在の X セッションを直接制御できる代替の VNC サーバーでもあります。
  • x0vncserver は現在、クライアントとサーバー間のクリップボード共有をサポートしていません(autocutsel の助けを借りても)。参照:Issue #529

xprofile とともに

x0vncserver を簡単に起動する方法の一つは、xprofile ファイルの一つに以下のような行を追加することです:

~/.xprofile
...
x0vncserver -rfbauth ~/.vnc/passwd &

systemd とともに

システムサービスとして

このオプションは、ユーザーが現在のディスプレイ、およびディスプレイマネージャーが提供するログイン画面にアクセスできるようにします。

このサービスは、ユーザーがセッションからログオフするたびに自動的に再起動されます。

以下の例では LightDM が使用されていますが、XAUTHORITY 変数を修正することで他のディスプレイマネージャーに適応させることが可能です。

/etc/systemd/system/x0vncserver.service
[Unit]
Description=Remote desktop service (VNC) for :0 display
Requires=display-manager.service
After=network-online.target
After=display-manager.service

[Service]
Type=simple
Environment=HOME=/root
Environment=XAUTHORITY=/var/run/lightdm/root/:0
ExecStart=x0vncserver -display :0 -rfbauth ~/.vnc/passwd
Restart=on-failure
RestartSec=500ms

[Install]
WantedBy=multi-user.target

このサービスはシステムユニットなので、-rfbauth ~/.vnc/passwd/root/.vnc/passwd を指します。

x0vncserver.service開始/有効化してください。

ユーザーサービスとして

現在のデスクトップにリモートアクセスをすぐに設定できる最も簡単な方法として、x0vncserver を実行する VNC サーバーを持つために、以下のように systemd ユニットを作成して、必要なユーザーとオプションで置き換えてください:

~/.config/systemd/user/x0vncserver.service
[Unit]
Description=Remote desktop service (VNC)

[Service]
Type=simple
ExecStartPre=/bin/sh -c 'while ! pgrep -U "$USER" Xorg; do sleep 2; done'
ExecStart=/usr/bin/x0vncserver -rfbauth %h/.vnc/passwd

[Install]
WantedBy=default.target

ExecStartPre 行は、${USER} によって Xorg が開始されるのを待っています。

ユーザーネームとパスワードでログインする場合は、ExecStart/usr/bin/x0vncserver -PAMService=login -PlainUsers=${USER} -SecurityTypes=TLSPlain に置き換えてください。

x0vncserver.service ユーザーユニットを開始/有効化してください。

XDMCP と組み合わせて Xvnc をオンデマンドセッションで実行する

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

xvnc.socket開始/有効化してください。これで、任意の数のユーザーがポート 5900 に接続することで独自のデスクトップを取得できます。

VNC サーバーがインターネットに公開されている場合は、xvnc@.serviceXvnc-localhost オプションを追加してください(-query localhost-localhost は異なるスイッチです)、#Accessing vncserver via SSH tunnels に従ってください。接続後にユーザーを選択するだけなので、VNC サーバーはユーザー nobody として実行され、vncserver スクリプトの代わりに直接 Xvnc を使用するため、~/.vnc のオプションは無視されます。オプションで、クリップボードが動作するように vncconfig自動起動させてください(vncconfig は非 VNC セッションで即座に終了します)。作成する一つの方法は:

/etc/X11/xinit/xinitrc.d/99-vncconfig.sh
#!/bin/sh
vncconfig -nowin &

vncserver に接続する

警告: LAN の外でセキュアな対策を取ることなく vncserver に接続することは推奨されません。LAN の外側で接続する必要がある場合は下の説明を読むことを推奨します。SecurityTypes をセキュアでないオプションに設定しないかぎり TigerVNC はデフォルトで暗号化されますが、通信相手の確認はしないため接続時の MITM 攻撃を防ぐことはできません。セキュアな接続をするときは X509Vnc を使うことを推奨します。

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 接続を提供するサーバの利点は、VNC トラフィックが SSH ポートを介してトンネリングされるため、既に開いている SSH ポート以外のポートを外部に開く必要がないことです。

サーバー側

サーバ側では、vncserver または、 x0vncserver を実行する必要があります。

これらのどちらかを実行する場合、~/.vnc/configlocalhost オプション、または -localhost スイッチ(x0vncserver の場合)を使用することをお勧めします。例えば

~/.vnc/config
session=lxqt
geometry=1920x1080
localhost
alwaysshared

例えば、vncserver@.service開始または再起動してください(#初回セットアップも参照してください)。

クライアント側

サーバーはローカルホストからの接続だけを許可しているので、-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

接続してください。

ヒントとテクニック

macOS に接続する

https://help.ubuntu.com/community/AppleRemoteDesktop を見てください。Remmina でテスト済みです。

推奨セキュリティ設定

ノート: SSH トンネルを使用する場合、sshd によって暗号化が行われるため X509Vnc は不要です。

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 を使って手動で証明書を発行してサーバーとクライアントで鍵を共有できます。

フルスクリーンの切り替え

これは VNC クライアントのメニューから行うことができます。デフォルトでは、VNC クライアントの mkey は F8 です。

マウスの戻る/進むボタンが動作しない場合の回避策

現在の VNC プロトコルは 7つのマウスボタン(左、中、右、スクロールアップ、スクロールダウン、スクロール左、スクロール右)しか使用していないため、マウスに戻るボタンと進むボタンがある場合、これらは使用できず、入力は無視されます。

evrouter は、マウスの戻る/進むボタンをクリックしたときにキーボードのキー押下を送信してこの制限を回避するために使用できます。オプションで、xautomationxbindkeys をサーバーで使用して、必要に応じてキーボードのキー押下をマウスボタンのクリックにマップバックできます。

キーボードキー XF86Back/XF86Forward でマウスの戻る/進むボタンを代用する

この方法はシンプルで、例えば Web ブラウザやファイルブラウザを使用している間に戻る/進むをナビゲートする方法が必要な場合に適しています。

クライアントで evrouterAURxautomation をインストールします。evrouter を設定します。正確なデバイス名、ウィンドウ名、ボタン名などを見つける方法とヒントについては、マウスボタン#evrouter と evrouter の man ページを参照してください。例の設定は以下の通りです:

~/.evrouterrc
Window "OtherComputer:0 - TigerVNC": # Window title used as filter

# Using Shell to avoid repeating key presses (see evrouter manual)
"USB mouse" "/dev/input/by-id/usb-Mouse-name-event-mouse" none key/275 "Shell/xte 'key XF86Back'"
"USB mouse" "/dev/input/by-id/usb-Mouse-name-event-mouse" none key/276 "Shell/xte 'key XF86Forward'"

# Use XKey below instead if repeating keys is desired (see evrouter manual)
#"Logitech Gaming Mouse G400" "/dev/input/by-id/usb-Logitech_Gaming_Mouse_G400-event-mouse" none key/275 "XKey/XF86Back"
#"Logitech Gaming Mouse G400" "/dev/input/by-id/usb-Logitech_Gaming_Mouse_G400-event-mouse" none key/276 "XKey/XF86Forward"

クライアントで evrouter を起動します。上記の設定で、マウスの戻るボタンをクリックすると VNC サーバーに XF86Back が送信され、進むボタンをクリックすると XF86Forward が送信されます。

サーバーでキーボードキー押下をマウスボタンクリックにマップバックする

必要に応じて、サーバーでキーボードキーをマウスボタンクリックにマップバックすることが可能です。この場合、クライアントやサーバーで絶対に使用されないキーボードキーを使用することが良いでしょう。以下の例では、キーボードキー XF86Launch8 / XF86Launch9 がマウスボタン 8/9 として使用されています。

クライアントでの evrouter 設定:

~/.evrouterrc
Window "OtherComputer:0 - TigerVNC": # ウィンドウタイトル

# キー押下を繰り返さないように Shell を使用(evrouter マニュアルを参照)
"USB mouse" "/dev/input/by-id/usb-Mouse-name-event-mouse" none key/275 "Shell/xte 'key XF86Launch8'"
"USB mouse" "/dev/input/by-id/usb-Mouse-name-event-mouse" none key/276 "Shell/xte 'key XF86Launch9'"

サーバーで xautomationxbindkeys をインストールします。xbindkeys を設定して、キーボードキー XF86Launch8 / XF86Launch9 を xte を使ってマウスボタン 8/9 にマップします。

~/.xbindkeysrc
"xte 'mouseclick 8'"
     XF86Launch8

"xte 'mouseclick 9'"
     XF86Launch9

xbindkeys(xbindkeys -f ~/.xbindkeysrc)を起動します。サーバーは、XF86Launch8 / XF86Launch9 をマウスボタン 8/9 にマップするようになります。

トラブルシューティング

ウィンドウの代わりに黒い四角

おそらく、これはアプリケーションが Composite Xorg 拡張を厳密に必要としているためです。例えば、webkit ベースのアプリ:midori、psi-plus など。

この場合、以下のようなコマンドで vncserver を再起動してください:

$ vncserver -geometry ... -depth 24 :1 +extension Composite

Composite 拡張は、VNC で 24 ビット深度でしか動作しないようです。

マウスカーソルのある空の黒いウィンドウ

ユーザーが物理的な X セッションにログインしていないことを確認してください、x0vncserver でこのオプションが設定されていない限り。単一のユーザーで複数の X セッションはサポートされていません。詳細は https://github.com/TigerVNC/tigervnc/issues/684#issuecomment-494385395 を参照してください。

逆に、VNC サーバーサービスがそのユーザーで動作している間にローカルの X セッションにログインしようとすると、うまくいかない可能性があり、デスクトップ環境を使用している場合、スプラッシュスクリーンで詰まることがあります。

マウスカーソルが表示されない

x0vncserver を使用していてマウスカーソルが表示されない場合、以下のように vncviewer を起動してください:

$ vncviewer DotWhenNoCursor=1 サーバー

または、TigerVNC の設定ファイル(デフォルトで ~/.vnc/default.tigervnc にあります)に DotWhenNoCursor=1 を追加してください。

リモートマシンからのクリップボードの内容をコピーする

リモートマシンからローカルマシンへのコピーが機能しない場合は、サーバー上で autocutsel を実行してください。詳しくは [1] を参照:

$ autocutsel -fork

次に、F8 キーを押して VNC メニューのポップアップを表示し、Clipboard: local -> remote オプションを選択してください。

ウィンドウ装飾 / 境界線 / タイトルバーがない / ウィンドウを動かせない

空の xterm フレームを修正するためにウィンドウマネージャーを起動してください。例えば、Xfce 上では xfwm4 & を実行してください。

デスクトップ環境でフォントがボックスで表示される

一部のデスクトップ環境では、ASCII 文字を表示するための必要なフォントが欠けている可能性があります。ttf-dejavuインストールしてください。

参照