「TigerVNC」の版間の差分
Kusanaginoturugi (トーク | 投稿記録) (→推奨セキュリティ設定: SSH トンネルを使った vncserver へのアクセスを追加) |
Kusanaginoturugi (トーク | 投稿記録) (→ヒントとテクニック: 翻訳) |
||
(同じ利用者による、間の21版が非表示) | |||
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: |
+ | [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] を参照してください。}} |
||
− | == |
+ | == ローカルディスプレイを直接公開する == |
+ | 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= |
+ | 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 に接続する == |
||
109行目: | 205行目: | ||
== SSH トンネル経由で vncserver にアクセス == |
== SSH トンネル経由で vncserver にアクセス == |
||
+ | SSH 接続を提供するサーバの利点は、VNC トラフィックが SSH ポートを介してトンネリングされるため、既に開いている SSH ポート以外のポートを外部に開く必要がないことです。 |
||
− | SSH トンネリングの利点は他のポートを開く必要がなく、文字通り通信がトンネル化されるということです。ユーザーは WAN に対して既に開いている SSH ポートを使用することができます。以下の方法で vncserver を実行する際は {{ic|-localhost}} スイッチを使用してローカルホストからの接続だけを許可するようにすることを強く推奨します。物理的にマシンに ssh することができるユーザーだけが vncserver を使えるようになります。 |
||
− | |||
− | {{Note|TigerVNC は SecurityTypes パラメータを変更したいかぎりデフォルトで TLSVnc 暗号を使用します。認証や通信は暗号化されますが、通信相手の確認はしません。サーバーの同一性を確認することができる X509Vnc などの暗号化も TigerVNC によってサポートされています。サーバー側の SecurityTypes でセキュアでないオプション (None, VncAuth, Plain, TLSNone, TLSPlain, X509None, X509Plain) が優先されるように設定されている場合、暗号化を使用することはできません。その場合、SSH で VNC をトンネル化できます。vncviewer を動作させるときは、SecurityTypes を明示的に設定して暗号化していない通信を許可しないようにすると良いでしょう。}} |
||
=== サーバー側 === |
=== サーバー側 === |
||
− | 以下は -localhost フラグを使って vncserver を起動するコマンド例です: |
||
− | $ vncserver -geometry 1440x900 -alwaysshared -dpi 96 -localhost :1 |
||
+ | サーバ側では、''vncserver'' または、 ''x0vncserver'' を実行する必要があります。 |
||
− | もしくは、{{ic|~/.vnc/config}} に "localhost" オプションを追加してください。以下は上記コマンドと同じ設定例です: |
||
+ | |||
− | {{hc|~/.vnc/config| |
||
+ | これらのどちらかを実行する場合、{{ic|~/.vnc/config}} の {{ic|localhost}} オプション、または {{ic|-localhost}} スイッチ(''x0vncserver'' の場合)を使用することをお勧めします。例えば |
||
− | <nowiki> |
||
+ | |||
− | ## Supported server options to pass to vncserver upon invocation can be listed |
||
+ | {{hc|~/.vnc/config|2= |
||
− | ## in this file. See the following manpages for more: vncserver(1) Xvnc(1). |
||
+ | session=lxqt |
||
− | ## Several common ones are shown below. Uncomment and modify to your liking. |
||
+ | geometry=1920x1080 |
||
− | ## |
||
− | geometry=1200x700 |
||
− | alwaysshared |
||
− | dpi=96 |
||
localhost |
localhost |
||
+ | alwaysshared |
||
− | </nowiki>}} |
||
+ | }} |
||
+ | |||
+ | 例えば、{{ic|vncserver@.service}} を[[開始]]または[[再起動]]してください([[#初回セットアップ]]も参照してください)。 |
||
=== クライアント側 === |
=== クライアント側 === |
||
185行目: | 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時点における最新版
TigerVNC は Virtual Network Computing (VNC) プロトコルの実装です。この記事ではサーバー機能に焦点をあてています。
目次
インストール
Vncserver には2つのリモート制御機能が存在します:
- 標準的な X サーバーと同じような仮想 (ヘッドレス) サーバー。物理的な画面ではなく仮想スクリーンを使用する。仮想サーバーは物理的な X サーバーと並行して動作します。
- 物理モニターを使用しているローカルの X セッションの直接制御。
vncserver をバーチャル(ヘッドレス)セッションで起動する
初回セットアップ
クイックスタートについては、以下のステップを参照してください。 設定オプションの完全なリストについては vncserver(8) を読むことをお勧めします。
vncpasswd
を使用してパスワードを作成して、ハッシュ化したパスワードを~/.vnc/passwd
に保存します。/etc/tigervnc/vncserver.users
を編集して、ユーザマッピングを定義します。このファイルで定義された各ユーザは、そのセッションが実行される対応するポートを持っています。ファイル内の数字は、TCP ポートに対応します。デフォルトでは、:1 が TCP ポート 5901 (5900+1) になっています。別の並列サーバが必要な場合、2 番目のインスタンスは次に高い空きポート、つまり 5902 (5900+2) で実行することができます。~/.vnc/config
を作成し、最低限session=foo
のような行で、実行するデスクトップ環境を foo に対応させたセッションの種類を定義してください。どのデスクトップ環境がシステムで利用できるかは、/usr/share/xsessions/
内の .desktop ファイルで確認できます。例えば:
~/.vnc/config
session=lxqt geometry=1920x1080 localhost alwaysshared
tigervnc の開始と終了
vncserver@.service
テンプレートのインスタンスを 起動 します。オプションで起動時やシャットダウン時に動くよう有効化します。この場合のインスタンス識別子はディスプレイ番号であることに注意してください(例:ディスプレイ番号 :1
のインスタンス vncserver@:1.service
など)。
ローカルディスプレイを直接公開する
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
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@.service
の Xvnc
に -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 に接続する
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/config
の localhost
オプション、または -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 でテスト済みです。
推奨セキュリティ設定
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 は、マウスの戻る/進むボタンをクリックしたときにキーボードのキー押下を送信してこの制限を回避するために使用できます。オプションで、xautomation と xbindkeys をサーバーで使用して、必要に応じてキーボードのキー押下をマウスボタンのクリックにマップバックできます。
キーボードキー XF86Back/XF86Forward でマウスの戻る/進むボタンを代用する
この方法はシンプルで、例えば Web ブラウザやファイルブラウザを使用している間に戻る/進むをナビゲートする方法が必要な場合に適しています。
クライアントで evrouterAUR と xautomation をインストールします。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'"
サーバーで xautomation と xbindkeys をインストールします。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 をインストールしてください。