「TigerVNC」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
141行目: 141行目:
 
{{ic|x0vncserver.service}} ユーザーユニットを[[開始/有効化]]してください。
 
{{ic|x0vncserver.service}} ユーザーユニットを[[開始/有効化]]してください。
   
  +
== XDMCP と組み合わせて Xvnc をオンデマンドセッションで実行する ==
== Running Xvnc with XDMCP for on demand sessions ==
 
   
  +
''systemd'' のソケットアクティベーションと [[XDMCP]] を組み合わせることで、ログインしようとする各ユーザーごとに自動的に VNC サーバーを生成することができます。そのため、ユーザーごとにサーバー/ポートを設定する必要はありません。このセットアップでは、ディスプレイマネージャーを使用してユーザーを認証し、ログインするため、VNC パスワードは必要ありません。欠点としては、ユーザーがサーバー上でセッションを継続して後で再接続することはできません。
One can use ''systemd'' socket activation in combination with [[XDMCP]] to automatically spawn VNC servers for each user who attempts to login, so there is no need to set up one server/port per user. This setup uses the display manager to authenticate users and login, so there is no need for VNC passwords. The downside is that users cannot leave a session running on the server and reconnect to it later.
 
  +
  +
これを動作させるには、まず [[XDMCP]] を設定し、ディスプレイマネージャーが動作していることを確認してください。
  +
次に、以下を作成します:
   
To get this running, first set up [[XDMCP]] and make sure the display manager is running.
 
Then create:
 
   
 
{{hc|/etc/systemd/system/xvnc.socket|2=
 
{{hc|/etc/systemd/system/xvnc.socket|2=
171行目: 172行目:
 
}}
 
}}
   
  +
{{ic|xvnc.socket}} を[[開始/有効化]]してください。これで、任意の数のユーザーがポート 5900 に接続することで独自のデスクトップを取得できます。
[[Start/enable]] {{ic|xvnc.socket}}. Now, any number of users can get unique desktops by connecting to port 5900.
 
   
If the VNC server is exposed to the internet, add the {{ic|-localhost}} option to {{ic|Xvnc}} in {{ic|xvnc@.service}} (note that {{ic|-query localhost}} and {{ic|-localhost}} are different switches) and follow [[#Accessing vncserver via SSH tunnels]]. Since we only select a user after connecting, the VNC server runs as user ''nobody'' and uses {{ic|Xvnc}} directly instead of the {{ic|vncserver}} script, so any options in {{ic|~/.vnc}} are ignored. Optionally, [[autostart]] ''vncconfig'' so that the clipboard works (''vncconfig'' exits immediately in non-VNC sessions). One way is to create:
+
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|
 
{{hc|/etc/X11/xinit/xinitrc.d/99-vncconfig.sh|

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

関連記事

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

Toggling fullscreen

This can be done through vnc client's menu. By default, vnc client's mkey is F8.

Workaround for mouse back and forward buttons not working

The VNC protocol currently only uses 7 mouse buttons (left, middle, right, scroll up, scroll down, scroll left, scroll right) which means if your mouse has a back and a forward button, these are not usable and input will be ignored.

evrouter can be used to work around this limitation by sending keyboard key presses when clicking the mouse back/forward buttons. Optionally, xte found in xautomation and xbindkeys can be used on the server to map the keyboard key presses back to mouse button clicks if needed.

Substituting mouse back/forward buttons with keyboard keys XF86Back/XF86Forward

This method is simple and suitable if you only need a way to navigate backward/forward while using web browsers or file browsers for example.

Install evrouterAUR and xautomation on the client. Configure evrouter, see Mouse buttons#evrouter and evrouter man pages for instructions and tips on how to find the correct device name, window name, button names etc. Example config:

~/.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"

Start evrouter on the client. With above configuration keyboard key XF86Back is sent to the VNC server when clicking the back button on the mouse, and XF86Forward is sent when clicking the forward button.

Mapping the keyboard key presses back to mouse button clicks on the server

If needed, it is possible to map the keyboard keys back to mouse button clicks on the server. In this case, it might be a good idea to use keyboard keys which are never on the client or server. In the example below, keyboard keys XF86Launch8/XF86Launch9 are used as mouse buttons 8/9.

Evrouter configuration on the client:

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

# 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 XF86Launch8'"
"USB mouse" "/dev/input/by-id/usb-Mouse-name-event-mouse" none key/276 "Shell/xte 'key XF86Launch9'"

Install xautomation and xbindkeys on the server. Configure xbindkeys to map keyboard keys XF86Launch8/XF86Launch9 to mouse buttons 8/9 with xte.

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

"xte 'mouseclick 9'"
     XF86Launch9

Start xbindkeys (xbindkeys -f ~/.xbindkeysrc). The server will now map XF86Launch8/XF86Launch9 to mouse buttons 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インストールしてください。

参照