Pocketstudio.jp Linux Wiki


VNC によるリモートからの X Windows 操作

 ここでは VNC(ブイ・エヌ・シー) を使ったリモートからの X Windows 操作を行うための設定方法を紹介しています。

VNC って何? とりあえず、こんな画面。

vnc_desktop,vnc

 見たところ普通の Windows XP の画面ですが、良く画面の中を見てください。X Window のスクリーンが見えますか? Fedora の部分です。Windows から VNC を経由して Fedora Core 4 サーバに接続しています。

 VNC を使えば、Windows のリモートデスクトップのように、簡単にネットワーク上にあるサーバにグラフィカルなアクセスが可能となります。しかも VNC サーバは無料、VNC クライアントも無料版があります。

 ホスティングやレンタルサーバ、あるいは自宅サーバだけどディスプレイつけるのが面倒だとか、そういった問題を一挙に解決してくれるのが VNC です。Fedora Core 4 では Vnc バージョン 4 が搭載されています。

 なお、標準のままだと tmm*1 が起動してしまいますので、上の画像のような gnome インターフェースを表示するのが本文章の目的です。

VNC サーバ設定

vnc-server のセットアップ

 VNC サーバの設定方法には2つあります。1つは直接ポートを開く方法。この方法では「各ユーザ毎」の VNC 設定が必要です。ですが逆に「VNCを利用させるユーザを限定」させる事もできます。ただ、セキュリティ的には甘いので別途 iptables でポートの制限を行うことを推奨します。

 もう1つの方法は xinetd を経由させる方法です。この方法の利点は「任意のユーザに X Window へのログインを許可する事」と「xined を経由するのでセキュリティ設定が容易に出来る*2」事が挙げられます。

VNC サーバのインストールと確認

 まずサーバ側では vnc-server パッケージのインストールが必要です。

# rpm -qa vnc-server
vnc-server-4.1.1-10

 このようにコマンドを実行して RPM パッケージがセットアップされていなければ、インストールが必要になります。yum を使ってインストール可能です。

# yum -y install vnc-server

 インストールが終わったら、以下のコマンドでパッケージ情報を念のため確認します。

# rpm -qi vnc-server
Name        : vnc-server                   Relocations: (not relocatable)
Version     : 4.1.1                             Vendor: Red Hat, Inc.
Release     : 10                            Build Date: 2005年04月27日 15時44分11秒
Install Date: 2005年06月14日 19時13分25秒      Build Host: decompose.build.redhat.com
Group       : ユーザーインターフェイス/X   Source RPM: vnc-4.1.1-10.src.rpm
Size        : 3054396                          License: GPL
Signature   : DSA/SHA1, 2005年05月21日 03時28分29秒, Key ID b44269d04f2a6fd2
Packager    : Red Hat, Inc. <http://bugzilla.redhat.com/bugzilla>
URL         : http://www.realvnc.com
Summary     : VNC サーバー
Description :
VNC システムを使用すれば各種のプラットフォーム群から一つのデスクトップ
にアクセスすることができます。このパッケージは VNC サーバーを含んでいて
これを使用すれば、自分のマシンのデスクトップに対するアクセスを他人に許
可することができます。

 次にサーバ起動時のランレベルを5にします。はじめからサーバ上で X Window を動作させるためです。

# vi /etc/inittab

 ファイルを開いて 18 行目を探します。

id:5:initdefault:

 このようになってれば、既に X Window が起動するモードなので設定は不要です。

id:3:initdefault:

 上記のようなランレベルが3になっている場合は5と書き換えます。

 ファイルの編集が終わった後はサーバの再起動を行います。再起動後 X Window 画面が開くかどうか確認してください。

VNC サーバ設定例1(直接ポート番号を指定する方法)

※xinetd を経由して複数ユーザに VNC 経由のログインを考えている場合は、この設定例1をとばして設定例2に進んでください。設定方法がかなり違うためです。逆に、設定例1を使う場合は設定例2を行う必要はありません。

 まず、設定したい一般ユーザでパスワードファイルの設定を行います。もし root であれば "su - ユーザ名" を実行して、一般ユーザになってください。

※root での設定も可能ではありますが、セキュリティ上あまりおすすめしません(パスワード情報は暗号化されていないためです。root で設定を行うことも可能ですが、Vnc-client が無償版の場合、暗号化はサポートされていないので、それなりのリスクを伴うことをご理解の上、root に対して作業ください。)

 作業としては、vnc パスワード格納用のディレクトリを作成し、パスワードを設定します。

$ cd
$ mkdir .vnc

 次にパスワードを設定します。

$ /usr/bin/vncpasswd ./.vnc/passwd
Password:
Verify:

 画面にパスワードは表示されませんが、確認も含めて2回入力します。

 その次に X Window 用の初期化ファイルをコピーします。

$ cp /etc/X11/xinit/xinitrc ./xstartup

 知識のある方はコピーせず、直接 xstartup ファイルを編集して任意のウインドウ・マネージャを実行させることも出来ます。

 複数のユーザに対して許可したい場合は、そのユーザ分だけ設定を行ってください。ユーザ毎に別々のパスワード(ここでのパスワードは VNC 接続を行うときのパスワードです。linux サーバへログイン時のものとは別でも構いません)を設定することが出来ます。

 次に root ユーザ権限に変わります。

 root 権限で /etc/sysconfig/vncservers*3を編集します。
 記述方法は以下のような書式です。

VNCSERVERS="ディスプレイ番号:ユーザ名"

 たとえば sakura というユーザにディスプレイ番号1(ディスプレイ番号は1以上を設定します。何故かというとディスプレイ番号0はサーバ本体に直結されているディスプレイ番号を指すからです)を記述します。

VNCSERVERS="1:sakura"

 最後にサーバ起動時に自動で起動する設定にしておきます。

# /sbin/chkconfig --level 5 vncserver on
# /sbin/chkconfig --list vncserver
vncserver       0:off   1:off   2:off   3:off   4:off   5:on    6:off

 このように chkconfig 側の設定は完了です。

 では、実際に起動して VNC 経由の接続ができるようにしてみます。

# /etc/init.d/vncserver start
VNC サーバー を起動中: 1:sakura
New 'akane:1 (sakura)' desktop is akane:1

Starting applications specified in /home/sakura/.vnc/xstartup
Log file is /home/sakura/.vnc/akane:1.log

 正常起動すると上記のような記録が残ります。これは akane サーバ上の sakura アカウントに対してディスプレイ番号 1 の許可(akane:1)を行ったという意味です。

 あとは VNC Client を起動して "IPアドレスかホスト名:1" として接続が可能です。

 特にパケットフィルタリングをしていなければ http://サーバ名:5801/ として Java アプレット経由でのログインが可能です。これはクライアントをインストールしていなくても稼働できるので、実は結構便利な接続方法だったりします。

 クライアントの接続画面が開いたら、パスワードはログイン時のものではなく、vncpasswd コマンドで設定した vnc 用のパスワードを入力します。正常に入力すると X のセッション画面が開きます。

 以上で設定は終わりです。

 あとは、セキュリティ上の対策として接続ポートを 5901 や 5801 に特定のホストやネットワークのみに許可するよう iptables の設定をしておくのが良いと思います。

VNC サーバ設定例2(xinetd 経由での接続)

 xined 経由の場合は xinetd 用のファイル設置と /etc/services に対してサービスを行うポートを指定します。

 まずサービスファイルの設定です vi /etc/services

# vi /etc/services

 ファイルを開いたら、末尾に以下のような行を追加します。

# Local services
vncserver       5901/tcp                        # Vnc Server 1024x768
vncserver2      5902/tcp                        # Vnc Server 800x600

 ここで1つ覚えておくのがディスプレイ番号1の時に開かれるポート番号は 5901 です。5900 + ディスプレイ番号が接続するポート番号となります。この 5901 というポートを VNC サーバが使うと明示するため /etc/services に設定の記述を行います。

 ここで2つ設定していますが、接続ポートによって VNC クライアントの解像度を分けるために記述しました。接続ポート(ディスプレイ番号)によって解像度は固定されてしまうからです。

 この例ではディスプレイ番号"1"の時に "1024×768" の解像度、ディスプレイ番号"2"の時に "800×600" の解像度で表示するように設定します。

 次は VNC サーバ接続用のパスワードを設定します。

# /usr/bin/vncpasswd /etc/passwd_vnc
Password:
Verify:

 画面にパスワードは表示されませんが、確認も含めて2回入力します。注意しなくてはいけないのは、このパスワードが VNC サーバに接続する全ユーザに共通のもの、という事です。VNC サーバ用に任意のパスワードを決めて、接続を許可するユーザだけパスワードを教えるという運用方法もありますね。

 所有者の情報を変更しておきます。

# chown nobody:nobody /etc/passwd_vnc

 次は xinetd 側の設定です。設定用のファイルを作成します。

# vi /etc/xinetd.d/vncserver

 ファイルを開いたら、以下の記述を行います。

service vncserver
{
        disable         = no
        socket_type     = stream
        wait            = no
        user            = nobody
        group           = tty
        server          = /usr/bin/Xvnc
        server_args     = -inetd -geometry 1024x768 -depth 16 -query localhost
                    -once PasswordFile=/etc/passwd_vnc
}

service vncserver2
{
        disable         = no
        socket_type     = stream
        wait            = no
        user            = nobody
        group           = tty
        server          = /usr/bin/Xvnc
        server_args     = -inetd -geometry 800x600 -depth 16 -query localhost
                                      -once PasswordFile=/etc/passwd_vnc
}

 画面の関係上 "server_args" の行が2行にわたっていますが、こちらは必ず1行で続くようにお願いします。そうしないと起動時にエラーとなります。

 設定を反映させるために xinetd の再起動を行います。

 もし xinetd のインストールがされていない場合はxinetdのインストールを行ってください。

# /sbin/service xinetd restart
xinetd を停止中:                                           [  OK  ]
xinetd を起動中:                                           [  OK  ]

 もし後で接続が出来ないようであれば、xinetd 関係のトラブルが多いと思います。エラーは /var/log/messages ファイルに記録されるので、xinetd 再起動時に何かエラーが出ていないかどうかチェックされることを推奨します。

 以下のようなエラーが出たときは xinetd がセットアップされていません。

# /sbin/service xinetd restart
xinetd: unrecognized service

 こちらのページを参考にしてxinetdのインストールを行ってください。

 次に各種設定を行います。xdm の設定ファイルを編集します。

# vi /etc/X11/xdm/xdm-config

 ファイルを開いたら、末尾の行を探して、

DisplayManager.requestPort:     0

 これを ! 記号を使ってコメントします。

! DisplayManager.requestPort:     0

 その次は Xaccess ファイルの編集です。

# vi /etc/X11/xdm/Xaccess

 ファイルを開くと以下のように 40 行目がコメントされています。

# *                                     #any host can get a login window

 このコメントを削除します。

*                                       #any host can get a login window

 ここで殆どの設定は終わりました。ただ、この段階では接続時のウインドウ・マネージャの画面がデフォルトのショボイものになってしまいます。。。

vnc_desktop,vnc

 ちょっとこれじゃ、、ですよね。普通の画面を表示させるにはもう1つ設定を行います。

# vi /etc/X11/gdm/gdm.conf

 これでファイルを開き、52 行目を編集します。

#RemoteGreeter=/usr/bin/gdmlogin

 このように設定ファイルはコメントされていますが、

RemoteGreeter=/usr/bin/gdmgreeter

 このようにコメントをはずして、記述も gdmgreeter にします(これを忘れると画面が寂しくなります……)。

 同じく gdm.conf 内で 265 行目を探します

[greeter]
# Greeter has a nice title bar that the user can move
TitleBar=false
# Configuration is available from the system menu of the greeter
ConfigAvailable=false

 この部分を false から true に書き換えます。

ConfigAvailable=true

 引き続き gdm.conf の 210 行目が Enable=false であれば true に書き換えます。

[xdmcp]
# Distributions: Ship with this off.  It is never a safe thing to leave
# out on the net.  Setting up /etc/hosts.allow and /etc/hosts.deny to only
# allow local access is another alternative but not the safest.
# Firewalling port 177 is the safest if you wish to have xdmcp on.
# Read the manual for more notes on the security of XDMCP.
Enable=true

 この記述を忘れると X のセッションが接続できても、画面が真っ暗になってしまいます*4

 あとは、良く見慣れたログイン画面で VNC からも接続が可能です。

vnc_desktop,vnc

 最終的に設定を反映させるためにはサーバの再起動が必要です。再起動後に VNC クライアントからの接続を確認します。

# /sbin/reboot

アクセス制限

 Xinetd 経由の場合、ネットワークやホストの制限を /etc/hosts.allow /etc/hosts.deny によって比較的簡単に行うことができます。出来ればセキュリティの安全上、設定されておくことをおすすめします。

 まず、/etc/hosts.deny で全ての接続を拒否させるようにします。

# vi /etc/hosts.deny
Xvnc: ALL

 次に /etc/hosts.allow で許可するネットワークやホストを記述します。

Xvnc: .example.jp
Xvnc: 192.168.0.0/16

 接続の成功や拒否されたという記録は /var/log/secure に残ります。

VNC クライアント(Windows)からの接続

VNC クライアントの入手

 VNC クライアントは窓の杜などからダウンロード できます。無償版は暗号化がサポートされていませんが、有償版になるとセッションの暗号化までサポートされているようです。詳しくはオフィシャルサイト(英語)をご覧下さい。

 ファイルをダウンロードしたら、画面の手順通りインストールを進めていきます。

  1. 【 vnc-4_1_1-x86_win32.exe 】のクリック
  2. 「セキュリティの警告」が表示されますが【 実行(R) 】をクリック
  3. "Welcome to the VNC Setup Wizard"が表示されます。右下の【 Next > 】をクリック
  4. "License Agreement" はライセンスに同意しますので【 I accept the agreement 】をクリックして【 Next > 】をクリック
  5. インストール先は特に指定がなければ、そのまま【 Next > 】をクリック
  6. ここで VNC Server は不要なので、クリックしてチェックをはずしておきます。そのあと【 Next > 】をクリック
  7. プログラム・メニューに表示される名前です。そのまま【 Next > 】をクリック
  8. アイコンを作るか?と出ています。【 Next > 】をクリック
  9. 最終確認画面です。【 Install 】をクリックします。
  10. その後の画面で【 Next > 】、最後に【 Finish 】をクリックしてセットアップ完了です。

VNC クライアントを使ってアクセス

  1. VNC Viewer を起動します。デスクトップにアイコンがあれば【 VNC Viewer 4 】をクリックします。メニューの場合は【 スタート 】→【 プログラム(P) 】→【 RealVNC 】→【 VNC Viewer 4 】→【 Run VNC Viewer 】で起動します。
  2. "VNC Viewer"が起動します。"Server"の部分に接続したいサーバのホスト名とディスプレイ番号を記述します。たとえばサーバ名が "www.example.jp"、ディスプレイ番号が"1" の場合は【www.example.jp:1】と入力します。サーバ名が"db.example.jp"ディスプレイ番号が"3"であれば【db.example.jp:3】のように入力します。
  3. サーバ情報を入力したら【 OK 】をクリックします。
  4. (もしこの段階で正常に接続できない場合、iptables の制限がかかっていないかや xined 側で何かポートを開く時にエラーが出ていないか確認が必要となります)
  5. 接続に成功すると"Password:" 欄に VNC をセットアップした時の接続パスワードを入力して【 OK 】を押します。

 正常に接続できると、ログイン画面のセッションが表示されます。あとは普通にユーザアカウントとパスワードを入力して、次のように普通に画面が表示されれば成功です。

vnc_desktop,vnc

 あとは、普通の X Window の操作が可能です。ネットワークを経由すると多少重たいと感じる場合もあるかもしれません。その場合は色の鮮度を落としたり、解像度を小さくしてみると良いですよ。

参考資料

基本リソース
各種 man および README
VNC-ML "RedHat and VNC server xinetd and init.d"
http://www.realvnc.com/pipermail/vnc-list/2005-March/049889.html
-inetd
http://www.realvnc.com/products/free/4.1/man/Xvnc.html

*1 X Window でデフォルトとなっているウインドウ・マネージャの事です
*2 iptablesの設定をしなくてもよく、/etc/hosts.allow で制限ができる
*3 元は/etc/sysconfig/vncserverになっていました。typoと思われるので修正しました
*4 私はここでハマってました……

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: Sun, 12 Feb 2006 13:50:07 JST (4027d)