VNC によるリモートからの X Windows 操作 †ここでは VNC(ブイ・エヌ・シー) を使ったリモートからの X Windows 操作を行うための設定方法を紹介しています。 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 ここで殆どの設定は終わりました。ただ、この段階では接続時のウインドウ・マネージャの画面がデフォルトのショボイものになってしまいます。。。 ちょっとこれじゃ、、ですよね。普通の画面を表示させるにはもう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 クライアントからの接続を確認します。 # /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 クライアントは窓の杜などからダウンロード できます。無償版は暗号化がサポートされていませんが、有償版になるとセッションの暗号化までサポートされているようです。詳しくはオフィシャルサイト(英語)をご覧下さい。 ファイルをダウンロードしたら、画面の手順通りインストールを進めていきます。
VNC クライアントを使ってアクセス †
正常に接続できると、ログイン画面のセッションが表示されます。あとは普通にユーザアカウントとパスワードを入力して、次のように普通に画面が表示されれば成功です。 あとは、普通の X Window の操作が可能です。ネットワークを経由すると多少重たいと感じる場合もあるかもしれません。その場合は色の鮮度を落としたり、解像度を小さくしてみると良いですよ。 参考資料 †
|