「TigerVNC」の版間の差分
同期 |
|||
| 3行目: | 3行目: | ||
[[de:VNC]] |
[[de:VNC]] |
||
[[en:Vncserver]] |
[[en:Vncserver]] |
||
[[es: |
[[es:TigerVNC]] |
||
[[ru:Vncserver]] |
|||
[[zh-cn:Virtual Network Computing]] |
|||
{{Related articles start}} |
{{Related articles start}} |
||
{{Related|x11vnc}} |
{{Related|x11vnc}} |
||
{{Related articles end}} |
{{Related articles end}} |
||
[http://tigervnc.org/ TigerVNC] は [[Wikipedia:VNC|VNC]] プロトコルの実装です。この記事ではサーバー機能に焦点をあてています。 |
|||
Vncserver は以下のような複数のリモート機能をユーザーが使えるようにするリモートディスプレイデーモンです: |
|||
# ローカルの X セッション (物理モニターで動作している X) の直接制御。 |
|||
# マシンの (物理モニターではなく仮想的に) バッググラウンドで動作する''並列'' X セッション。ユーザーが切断しても、サーバーのアプリケーションは全て実行し続けることができます。 |
|||
== インストール == |
== インストール == |
||
{{Pkg|tigervnc}} パッケージを[[インストール]]してください。 |
|||
{{Note|パッケージには vncserver, x0vncserver, vncviewer が含まれています。}} |
|||
Vncserver には2つのリモート制御機能が存在します: |
|||
== Vncserver を実行する == |
|||
# 標準的な X サーバーと同じような仮想 (ヘッドレス) サーバー。物理的な画面ではなく仮想スクリーンを使用する。仮想サーバーは物理的な X サーバーと並行して動作します。 |
|||
# 物理モニターを使用しているローカルの X セッションの直接制御。 |
|||
== 仮想 (ヘッドレス) セッションで vncserver を実行 == |
|||
=== 初期設定 === |
|||
=== 環境, 設定, パスワードファイルの作成 === |
|||
Vncserver は最初の実行時に環境, 設定, ユーザーパスワードファイルを作成します。作成されたファイルは {{ic|~/.vnc}} に保存されます。 |
|||
Vncserver は最初に起動した時に初期の environment ファイルとユーザーの password ファイルを作成します: |
|||
{{hc|$ vncserver| |
{{hc|$ vncserver| |
||
You will require a password to access your desktops. |
You will require a password to access your desktops. |
||
| 34行目: | 38行目: | ||
}} |
}} |
||
vncserver が動作するデフォルトのポートは :1 で、サーバーが動作する TCP ポートと対応しています (5900+n = ポート番号)。この場合、5900+1=5901 で動作します。二度 vncserver を動作させると次の数字でフリーのポート (:2 または 5902) に |
vncserver が動作するデフォルトのポートは :1 で、サーバーが動作する TCP ポートと対応しています (5900+n = ポート番号)。この場合、5900+1=5901 で動作します。二度 vncserver を動作させると次の数字でフリーのポート (:2 または 5902) に2番目のインスタンスが作成されます。 |
||
{{Note|Linux システムでは物理メモリが許すかぎりいくらでも VNC サーバーを使うことができます |
{{Note|Linux システムでは物理メモリが許すかぎりいくらでも VNC サーバーを使うことができます。それぞれは互いに並行して動きます。}} |
||
vncserver を終了するには -kill スイッチを使います: |
vncserver を終了するには -kill スイッチを使います: |
||
$ vncserver -kill :1 |
$ vncserver -kill :1 |
||
==== |
==== 環境ファイルの編集 ==== |
||
Vncserver は {{ic|~/.vnc/xstartup}} を読み込んで [[.xinitrc]] ファイルのように使います。ユーザーはこのファイルから DE を起動してください。詳しくは[[一般的な推奨事項#デスクトップ環境]]を参照。 |
|||
Vncserver は [[xinitrc|.xinitrc]] ファイルのように機能する {{ic|~/.vnc/xstartup}} を読み込みます。グラフィカル環境を使いたい場合は、少なくとも起動する DE を定義する必要があります。例えば、xfce4 を起動するには: |
|||
例えば、[[LXQt]] を起動するには: |
|||
#!/bin/sh |
|||
export XKL_XMODMAP_DISABLE=1 |
|||
exec startxfce4 |
|||
{{hc|~/.vnc/xstartup| |
|||
{{Note|{{ic|XKL_XMODMAP_DISABLE}} 行は仮想化された DE のターミナルで入力するときにキーストロークが組み替えられる問題を解決します。}} |
|||
<nowiki>#!/bin/sh |
|||
exec startlxqt |
|||
</nowiki>}} |
|||
==== |
==== 設定ファイルの編集 (任意) ==== |
||
tigervnc 1.60-1 から {{ic|~/.vnc/config}} のオプションが読み込まれるようになり、毎回 {{ic|vncserver}} にコマンドラインスイッチを指定する必要がなくなりました。ファイルは1行1オプションで記述します。例: |
|||
これは必須ではありませんが、{{ic|~/.ssh}} と同じように {{ic|~/.vnc}} を保護すると良いでしょう。保護するには次を実行してください: |
|||
{{hc|~/.vnc/config| |
|||
<nowiki> |
|||
## 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 |
|||
</nowiki>}} |
|||
=== |
=== systemd で vncserver を起動・停止 === |
||
Systemd のユーザーサービスやシステムサービスを使うことで、サービスとして vncserver を管理することができます。どちらの方法も下で説明します。 |
|||
==== ユーザーモード ==== |
|||
Vncserver はスイッチを使って柔軟に使うことができます。下の例では、特定の解像度で、複数のユーザーが同時に表示・操作可能に、そして仮想サーバの dpi を 96 に設定して vncserver を起動します: |
|||
{{Note|ユーザーがログアウトしても vncserver が実行し続けるようにするために、loginctl を使って linger オプションを有効にしてください: {{ic|# loginctl enable-linger username}}。linger を有効にしないとログオフしたときに vncserver が終了してしまいます。}} |
|||
$ vncserver -geometry 1440x900 -alwaysshared -dpi 96 :1 |
|||
{{Note|vncserver で標準的なモニター解像度を使う必要はありません; 1440x900 は 1429x882 や 1900x200 など普段使われない数字に置き換えることができます。}} |
|||
ユーザーモードでサービスを起動: |
|||
オプションの完全な一覧を見るには、-help スイッチを vncserver に渡して下さい。 |
|||
$ systemctl --user start vncserver@:1 |
|||
ユーザーモードでサービスを有効化: |
|||
$ vncserver -help |
|||
$ systemctl --user enable vncserver@:1 |
|||
==== システムモード ==== |
|||
== 物理ディスプレイで vncserver を実行する (5900 ポート) == |
|||
{{Warning|ローカルネットワークが信頼できない場合は以下のサービスを使ってはいけません。}} |
|||
=== TigerVNC の x0vncserver を使う (推奨) === |
|||
TigerVNC には x11vnc と同じような機能をもった x0vncserver バイナリが入っている、例: |
|||
x0vncserver -display :0 -passwordfile ~/.vnc/passwd |
|||
{{ic|/etc/systemd/system/vncserver@'':1''.service}} を作成してください ({{ic|:1}} は {{ic|$DISPLAY}} [[環境変数]]の値に置き換えてください)。 |
|||
詳しくは: |
|||
man x0vncserver |
|||
サーバーを実行するユーザー ({{ic|1=User=}}) や vncserver のオプション ({{ic|1=usr/bin/vncserver %i -arg1 -arg2 -argn}}) などサービスは適宜修正してください。 |
|||
=== x11vnc を使う (推奨)=== |
|||
物理ディスプレイのリモートコントロールがしたい場合は {{pkg|x11vnc}} パッケージを使って下さい。詳しくは、[[X11vnc|X11vnc]] を見て下さい。 |
|||
{{hc|/etc/systemd/system/vncserver@'':1''.service|<nowiki> |
|||
=== ダーティハックを使う (非推奨) === |
|||
[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] |
|||
xorg-server と tigervnc をインストールして Xorg 設定で "vnc" をロードしてください。 |
|||
WantedBy=multi-user.target |
|||
</nowiki>}} |
|||
{{ic|vncserver@'':1''.service}} を[[起動]]してください。ブート時に実行されるようにするには[[有効化]]してください。 |
|||
例 |
|||
{{ic|/etc/X11/xorg.conf.d/10-vnc.conf}}: |
|||
==== マルチユーザーモード ==== |
|||
Section "Module" |
|||
systemd のソケットアクティベーションと [[Xdmcp|XDMCP]] を組み合わせることでユーザーがログインするたびに VNC サーバーを自動的に生成することができます。ユーザーごとにサーバーとポートを設定する必要がなくなります。以下の設定ではディスプレイマネージャを使用してユーザーの認証を行っているため、VNC のパスワードも不要です。欠点としてはユーザーがサーバー上のセッションを一度抜けると再接続できないという点が挙げられます。以下のユニットを使うには、まず [[Xdmcp|XDMCP]] をセットアップしてディスプレイマネージャが動作するようにしてください。 |
|||
Load "vnc" |
|||
EndSection |
|||
Section "Screen" |
|||
Identifier "Screen0" |
|||
Option "SecurityTypes" "None" |
|||
EndSection |
|||
{{hc|/etc/systemd/system/xvnc.socket|<nowiki> |
|||
パスワード認証をするには、vncpasswd コマンドを実行した後に、下のように "Screen" セクションを置き換えて下さい。 |
|||
[Unit] |
|||
Description=XVNC Server |
|||
[Socket] |
|||
Section "Screen" |
|||
ListenStream=5900 |
|||
Identifier "Screen0" |
|||
Accept=yes |
|||
Option "SecurityTypes" "VncAuth" |
|||
Option "UserPasswdVerifier" "VncAuth" |
|||
Option "PasswordFile" "/root/.vnc/passwd" |
|||
EndSection |
|||
[Install] |
|||
==== xorg-server にパッチをあてる ==== |
|||
WantedBy=sockets.target |
|||
</nowiki>}} |
|||
{{hc|/etc/systemd/system/xvnc@.service|<nowiki> |
|||
[Unit] |
|||
Description=XVNC Per-Connection Daemon |
|||
[Service] |
|||
残念ながら xorg-server パッケージにはバグが存在します (15/11/2013)。 |
|||
ExecStart=-/usr/bin/Xvnc -inetd -query localhost -geometry 1920x1080 -once -SecurityTypes=None |
|||
ありがたいことに fedora がこのパッチを作成しています。 |
|||
User=nobody |
|||
StandardInput=socket |
|||
StandardError=syslog |
|||
</nowiki>}} |
|||
systemctl を使って {{ic|xvnc.socket}} を[[起動]]・[[有効化]]してください。ポート 5900 に接続することで何人でもデスクトップを表示することができます。 |
|||
VNC サーバーにインターネットから接続する場合、{{ic|xvnc@.service}} の {{ic|Xvnc}} に {{ic|-localhost}} オプションを追加して、下の説明を読んで SSH 経由で接続するようにしてください ({{ic|-query localhost}} の 'localhost' は {{ic|-localhost}} とは違います)。接続後にユーザーを選択するため、VNC サーバーは 'nobody' ユーザーで動作し 'vncserver' スクリプトの代わりに xvnc を直接使用します。そのため {{ic|~/.vnc}} のオプションは無視されます。任意で {{ic|vncconfig}} を[[自動起動]]することでクリップボードを機能させることができます (VNC 以外のセッションでは {{ic|vncconfig}} はすぐに終了します)。以下のファイルを作成してください: |
|||
[http://pkgs.fedoraproject.org/cgit/xorg-x11-server.git/plain/0001-include-export-key_is_down-and-friends.patch?h=f19&id=06e94667faa0cd1f9f32cf54e9e447ef50fde635 |
|||
{{hc|/etc/X11/xinit/xinitrc.d/99-vncconfig.sh|<nowiki> |
|||
] |
|||
#!/bin/sh |
|||
vncconfig -nowin & |
|||
</nowiki>}} |
|||
== 物理ディスプレイで vncserver を実行 == |
|||
abs コマンドを実行して、パッチファイルを配置して PKGBUILD を編集してください。 |
|||
=== TigerVNC の x0vncserver を使う === |
|||
PKGBUILD サンプル: |
|||
{{Pkg|tigervnc}} には物理的な X セッションを直接操作できる x0vncserver バイナリが入っています。以下のようにして実行してください: |
|||
source = vnc.patch |
|||
$ x0vncserver -display :0 -passwordfile ~/.vnc/passwd |
|||
sha256sums = '1bbbe70236dc70b5e35572f2197d163637100f8c58d0038bdc240df075eb5726' |
|||
prepare() { |
|||
詳しくは x0vncserver の [[man ページ]]を参照。 |
|||
cd "${pkgbase}-${pkgver}" |
|||
# patch for vnc module |
|||
==== systemd で x0vncserver を起動・停止 ==== |
|||
patch -Np1 -i ../vnc.patch |
|||
{{Warning|ローカルネットワークが信頼できない場合は以下のサービスを使ってはいけません。}} |
|||
VNC サーバーで x0vncserver を実行するには、systemd ユニットを作成します。現在のデスクトップにリモートからアクセスする一番簡単な方法です。 |
|||
{{Note|以下のユニットはユーザーによって X セッションが実行されている場合にのみ使用することができます。}} |
|||
{{ic|/etc/systemd/system/x0vncserver.service}} を作成してサーバーを実行するユーザーやオプションを指定してください: |
|||
{{hc|/etc/systemd/system/x0vncserver.service| |
|||
<nowiki> |
|||
[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 |
|||
</nowiki>}} |
|||
=== x11vnc を使う === |
|||
'''パッチ (リンクが死んでいる場合)''' |
|||
{{pkg|x11vnc}} には利点と欠点が存在しアクセスするのに root を必要とします。詳しくは [[X11vnc]] を見てください。 |
|||
+++ b/include/input.h |
|||
@@ -244,12 +244,12 @@ typedef struct _InputAttributes { |
|||
#define KEY_POSTED 2 |
|||
#define BUTTON_POSTED 2 |
|||
-extern void set_key_down(DeviceIntPtr |
|||
diff --git a/include/input.h b/include/input.h |
|||
index 350daba..2d5e531 100644 |
|||
--- a/include/input.h |
|||
+++ b/include/input.h |
|||
@@ -244,12 +244,12 @@ typedef struct _InputAttributes { |
|||
#define KEY_POSTED 2 |
|||
#define BUTTON_POSTED 2 |
|||
-extern void set_key_down(DeviceIntPtr pDev, int key_code, int type); |
|||
-extern void set_key_up(DeviceIntPtr pDev, int key_code, int type); |
|||
-extern int key_is_down(DeviceIntPtr pDev, int key_code, int type); |
|||
-extern void set_button_down(DeviceIntPtr pDev, int button, int type); |
|||
-extern void set_button_up(DeviceIntPtr pDev, int button, int type); |
|||
-extern int button_is_down(DeviceIntPtr pDev, int button, int type); |
|||
+extern _X_EXPORT void set_key_down(DeviceIntPtr pDev, int key_code, int type); |
|||
+extern _X_EXPORT void set_key_up(DeviceIntPtr pDev, int key_code, int type); |
|||
+extern _X_EXPORT int key_is_down(DeviceIntPtr pDev, int key_code, int type); |
|||
+extern _X_EXPORT void set_button_down(DeviceIntPtr pDev, int button, int type); |
|||
+extern _X_EXPORT void set_button_up(DeviceIntPtr pDev, int button, int type); |
|||
+extern _X_EXPORT int button_is_down(DeviceIntPtr pDev, int button, int type); |
|||
extern void InitCoreDevices(void); |
|||
extern void InitXTestDevices(void); |
|||
== vncserver に接続する == |
== vncserver に接続する == |
||
{{Warning|LAN の外でセキュアな対策を取ることなく vncserver に接続することは推奨されません。LAN の外側で接続する必要がある場合は下の説明を読むことを推奨します。SecurityTypes をセキュアでないオプションに設定しないかぎり TigerVNC はデフォルトで暗号化されますが、通信相手の確認はしないため接続時の MITM 攻撃を防ぐことはできません。セキュアな接続をするときは X509Vnc を使うことを推奨します。}} |
|||
vncserver に接続できるクライアントは多数存在します。下は 10.1.10.2 のポート 5901 (:1) で動作している vncserver |
vncserver に接続できるクライアントは多数存在します。下は 10.1.10.2 のポート 5901 (:1) で動作している vncserver に接続するコマンド例です: |
||
$ vncviewer 10.1.10.2:1 |
$ vncviewer 10.1.10.2:1 |
||
| 169行目: | 196行目: | ||
* {{Pkg|gtk-vnc}} |
* {{Pkg|gtk-vnc}} |
||
* {{Pkg| |
* {{Pkg|krdc}} |
||
* {{Pkg|rdesktop}} |
* {{Pkg|rdesktop}} |
||
* {{Pkg|vinagre}} |
* {{Pkg|vinagre}} |
||
| 175行目: | 202行目: | ||
* {{Pkg|vncviewer-jar}} |
* {{Pkg|vncviewer-jar}} |
||
TigerVNC の vncviewer にはシンプルが GUI が存在し、何もパラメータを付けずに実行します: |
|||
== SSH トンネルで VNC サーバーをセキュアにする == |
|||
$ vncviewer |
|||
== SSH トンネル経由で vncserver にアクセス == |
|||
=== サーバー側 === |
|||
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 を明示的に設定して暗号化していない通信を許可しないようにすると良いでしょう。}} |
|||
LAN の保護の外から vncserver にアクセスしたいときは平文パスワードやビューア・サーバの暗号化されないトラフィックに配慮する必要があります。Vncserver は ssh トンネリングによって簡単にセキュアにすることができます。さらに、この方法を使えば外側に他のポートを開く必要はありません。トラフィックは文字通りユーザーが既に WAN のために開いている SSH ポートを通過するからです。この場合 vncserver を使用する際は -localhost スイッチを使うことが強く推奨されます。このスイッチは''ローカルホストからの''接続だけを許可します -- さらに類推によって物理的に ssh を使ってマシンの認証を受けたユーザーも許可されます。 |
|||
=== サーバー側 === |
|||
以下は -localhost フラグを使って vncserver を起動するコマンド例です: |
|||
$ vncserver -geometry 1440x900 -alwaysshared -dpi 96 -localhost :1 |
$ vncserver -geometry 1440x900 -alwaysshared -dpi 96 -localhost :1 |
||
もしくは、{{ic|~/.vnc/config}} に "localhost" オプションを追加してください。以下は上記コマンドと同じ設定例です: |
|||
{{hc|~/.vnc.config| |
|||
<nowiki> |
|||
## 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 |
|||
</nowiki>}} |
|||
=== クライアント側 === |
=== クライアント側 === |
||
| 187行目: | 231行目: | ||
サーバーはローカルホストからの接続だけを許可しているので、-L スイッチを使ってトンネルを有効にして ssh で接続します。例えば: |
サーバーはローカルホストからの接続だけを許可しているので、-L スイッチを使ってトンネルを有効にして ssh で接続します。例えば: |
||
$ ssh |
$ ssh 10.1.10.2 -L 5901:localhost:5901 |
||
上記はサーバーのポート 5901 をクライアントのポート 5901 に転送します。サーバーとクライアントでポート番号を必ずしも一致させる必要はありません。例: |
|||
$ ssh 10.1.10.2 -L 8900:localhost:5901 |
|||
上記のコマンドはサーバーのポート 5901 をクライアントマシンのポート 8900 に転送します。 |
|||
これはサーバーポート 5901 をクライアントのポート 8900 に転送します。SSH で接続されると、xterm やシェルウィンドウが開いたままになります; これはサーバーのセキュア化されたトンネルとして働きます。vnc で接続するには、新しく xterm を開いてリモートの IP アドレスではな、セキュア化されたトンネルを使ってクライアントのローカルホストに接続します: |
|||
$ vncviewer localhost::8900 |
|||
SSH で接続したら、サーバーと接続するための暗号化トンネルとして xterm やシェルのウィンドウは開いたままにしてください。暗号化トンネルを使って接続するには、vncviewer でローカルホストのクライアントポートを指定します。 |
|||
ssh の man ページより [http://www.unixuser.org/~euske/doc/openssh/jman/ssh.html]: |
|||
''-L [bind_address:] port:host:hostport'' |
|||
サーバーとクライアントで同じポートを使用する場合: |
|||
''ポート与えられたローカル (クライアント) ホスト上のポートが、与えられたリモートホスト上のポートに転送されるよう指定します(ローカル→リモートのポート転送)。これはローカル側でポート に listen (接続受け付け) 用のソケットを割り当てることによりおこなわれます。さらにbindするアドレス が与えられている場合は、ソケットはこのアドレスに bind されます。このポートに向けておこなわれた接続はつねに安全な通信路を経由してリモートマシン上に到達し、そこからホスト のポートホスト側ポート に接続されるようになります。ポート転送は設定ファイルによっても指定できます。IPv6 アドレスは他の形式でも指定することができます:'' |
|||
$ vncviewer localhost:1 |
|||
サーバーとクライアントで違うポートを使用する場合: |
|||
''[bind_address/] port/host/ hostport もしくはブラケット [ ] で囲むことで指定できます。'' |
|||
$ vncviewer localhost:8900 |
|||
''特権ポートを転送できるのはスーパーユーザだけです。デフォルトでは、ローカル側のポートはGatewayPortsの設定に従って bind されますが、bindするアドレス を明示的に指定することで、特定のアドレスに接続をふり向けることができます。bindするアドレス として"localhost"を指定すると、ポートを listen するのはローカルな使用のみに限ることになります。いっぽう、空のアドレスまたは `*' を指定すると、そのポートはすべてのインターフェイスに対して使用可能になります。'' |
|||
=== SSH で Android デバイスから VNC サーバーに接続する === |
=== SSH で Android デバイスから VNC サーバーに接続する === |
||
| 231行目: | 278行目: | ||
== Tips and Tricks == |
== Tips and Tricks == |
||
=== macOS に接続する === |
|||
=== 起動時・シャットダウン時に VNC サーバーを起動・停止する === |
|||
https://help.ubuntu.com/community/AppleRemoteDesktop を見てください。[[Remmina]] でテスト済みです。 |
|||
{{ic|/usr/lib/systemd/system/vncserver.service}} のファイルを探して下さい |
|||
{{hc|/etc/systemd/system/vncserver@:1.service| |
|||
<nowiki># The vncserver service unit file |
|||
# |
|||
# 1. Copy this file to /etc/systemd/system/vncserver@:x.service |
|||
# Note that x is the port number on which the vncserver will run. The default is 1 which |
|||
# corresponds to port 5901. For a 2nd instance, use x=2 which corresponds to port 5902. |
|||
# 2. Edit User= |
|||
# ("User=foo") |
|||
# 3. Edit and vncserver parameters appropriately |
|||
# ("/usr/bin/vncserver %i -arg1 -arg2 -argn") |
|||
# 4. Run `systemctl --system daemon-reload` |
|||
# 5. Run `systemctl enable vncserver@:<display>.service` |
|||
# |
|||
# DO NOT RUN THIS SERVICE if your local area network is untrusted! |
|||
# |
|||
# See the wiki page for more on security |
|||
# https://wiki.archlinux.org/index.php/Vncserver |
|||
[Unit] |
|||
Description=Remote desktop service (VNC) |
|||
After=syslog.target network.target |
|||
[Service] |
|||
Type=forking |
|||
User= |
|||
# Clean any existing files in /tmp/.X11-unix environment |
|||
ExecStartPre=-/usr/bin/vncserver -kill %i |
|||
ExecStart=/usr/bin/vncserver %i |
|||
ExecStop=/usr/bin/vncserver -kill %i |
|||
[Install] |
|||
WantedBy=multi-user.target |
|||
</nowiki>}} |
|||
=== リモートマシンからローカルにクリップボードの内容をコピーする === |
=== リモートマシンからローカルにクリップボードの内容をコピーする === |
||
リモートマシンからローカルマシンへのコピーが動作しない場合、サーバー上で以下のように autocutsel を起動して下さい |
リモートマシンからローカルマシンへのコピーが動作しない場合、サーバー上で以下のように autocutsel を起動して下さい [https://bbs.archlinux.org/viewtopic.php?id=101243]: |
||
$ autocutsel -fork |
$ autocutsel -fork |
||
| 287行目: | 299行目: | ||
もしくは tigervnc の設定ファイルに {{ic|DotWhenNoCursor<nowiki>=</nowiki>1}} を記述してください。デフォルトでは {{ic|~/.vnc/default.tigervnc}} に存在します。 |
もしくは tigervnc の設定ファイルに {{ic|DotWhenNoCursor<nowiki>=</nowiki>1}} を記述してください。デフォルトでは {{ic|~/.vnc/default.tigervnc}} に存在します。 |
||
=== 推奨セキュリティ設定 === |
|||
{{Note|[[#SSH トンネル経由で vncserver にアクセス|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]] を使って手動で証明書を発行してサーバーとクライアントで鍵を共有できます。 |
|||
=== フルスクリーンの切り替え === |
|||
vncclient のメニューから切り替えることができます。デフォルトでは vncclient のメニューは F8 で呼び出せます。 |
|||
=== 小なり記号が入力できない (<) === |
|||
リモートクライアントで {{ic|<}} と入力すると {{ic|>}} が出力される場合、キーのマッピングを変更してみてください [https://insaner.com/blog/2013/05.html#20130422063137]: |
|||
$ x0vncserver -RemapKeys="0x3c->0x2c" |
|||
2016年11月15日 (火) 23:24時点における版
関連記事
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 を管理することができます。どちらの方法も下で説明します。
ユーザーモード
# loginctl enable-linger username。linger を有効にしないとログオフしたときに 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"