2009/05/29(Fri)VNC Serverをxinetd経由で立てる方法 [Fedora 10]

2009/05/29 12:40 Software::Linux
私はLinux環境のメインディストリビューションとしてRedHatを7.1位から使っており、その後Fedoraに移ってきているが、ここではFedora 10でVNC Serverを立てる方法を紹介する。

インストール

まずはvncserverをインストール。
vncviewerの方はインストールした時に明示的にチェックを外していなければ、既にインストールされているかも知れない。
$ sudo yum install xinetd vnc vnc-server

xinetd

ここでvncserverコマンドを打ってやれば、現在ログインしているセッションに対してattachすることが出来るが、サーバーを再起動したりした際には立ち上げ直さねばならず、さらに1ユーザー毎にポートとプログラム、そしてVNC Passwordを用意しなければならない。
1ユーザーしか使わないにしても、平文で流れるVNC Passwordだけでユーザーコンソールにログイン出来てしまうのは非常に危険である。
そこで、xinetdというスーパーサーバーを通して、システム起動時から起動しておき、VNC認証ではなくローカルのユーザー名・パスワード認証を通させてから、ログインできるようにするのがこの方法。

まずは、設定ファイルを書く。
今後いくつかファイルを変更するので、rootになっておいた方が楽かな。
$ sudo su -
# vi /etc/xinetd.d/vnc
service vnc-server
{
    disable         = no
    nice            = 10
    flags           = REUSE
    socket_type     = stream
    wait            = no
    user            = nobody
    server          = /usr/bin/Xvnc
    server_args     = -inetd -query localhost -once -geometry 1024x768 -depth 16 --securitytypes=none
    log_on_success  += DURATION
    log_on_failure  += HOST
}
設定ファイルに関しての注意であるが、2行目まではこの通りに書くこと。
特にservice名をvnc-server以外にするとうまく動かない。この名前は/etc/servicesでポートとプロトコルを指定してる行の名前に対応させる必要がある。
あと、以前自分がハマったが、2行目の{をservice行の一番最後に書いた場合もうまく動かなかった。

設定値の説明

disable
このサーバーをxinetd経由で起動するかどうか。noにしておけば起動する。
nice
優先度を10下げる。(なんか、たまに切断後に暴走することがあるし…)
flags
接続ソケットを再使用させるためにREUSE。
socket_type
ネットワークのソケットタイプ。*1
wait
シングルスレッドかマルチスレッドかの設定。yesならシングルスレッドで、サーバーが起動したらそれが死ぬまで要求処理を停止する。noなら新たな要求を処理する。今回は複数人が同時ログイン可能にしておきたいので、noとする。
user
実行ユーザー。どーせ認証画面を出すので不用意にrootにしない方がいい。
server
xientd経由で起動するサーバーコマンド。
server_args
コマンド引数。詳細は以下。
log_on_success/log_on_failure
ログの設定。オプションとしては、ATTEMP(試行記録)、DURATION(サービス時間の長さ)、EXIT(終了ステータス)、HOST(ホストIP)、PID(プロセスID)、USERID(ユーザーID)などを記録できる。ただ、USERIDを書くとidentプロセスが確認にいって遅いことがあるので、あまりオススメしない。(Thanks to Sasaki

server_args

-inetd
inetd経由で起動させるモード。*2
-query localhost
ユーザー認証をさせるXDMCP(X Display Manager Control Protocol)のサーバー指定。自分自身でよい。
-once
ユーザーがVNCセッションを閉じたらXvncも終了して、xinetdの待ち受け状態だけにする。
-geometry 1024x768
解像度の設定。お好みで。
-depth 16
色数の設定。お好みで。
--securitytypes=none
XDMCP経由で認証させるため、VNC Passwordはかけない。

サーバー起動設定

# service xinetd start
xinetd を起動中:                                           [  OK  ]

# chkconfig --list xinetd
xinetd          0:off   1:off   2:off   3:on    4:on    5:on    6:off
ランレベル3-5くらいで起動させるようにしておけばOK。

iptables

ファイアウォールに5900番を開ける。
# vi /etc/sysconfig/iptables
-A INPUT -m state --state NEW -m tcp -p tcp --dport 5900 -j ACCEPT
↑この行をCOMMIT行より前に記述

# service iptables restart
iptables: ファイアウォールルールを消去中:                  [  OK  ]
iptables: チェインをポリシー ACCEPT へ設定中filter         [  OK  ]
iptables: モジュールを取り外し中:                          [  OK  ]
iptables: ファイアウォールルールを適用中:                  [  OK  ]
iptables: 追加のモジュールを読み込み中:nf_conntrack_netbios[  OK  ]

接続確認

この状態で、サーバー的には接続できるようになっているはずである。
$ telnet localhost 5900
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
RFB 003.008
^]
telnet>quit
Connection closed by foreign host.
しかし、$ vncviewer localhostとして繋ぐと灰色の画面のまま、何も表示されないと思う。
これは以下のXDCMPがリモートログインを規制しているのが原因なので解除する。

*1 : stream(ストリーム型サービス)の他、dgram(データグラム型サービス)、raw(IP直接制御)、seqpacket(信頼できる連続データグラム交換サービス)があるらしい。詳細

*2 : ちなみにxinetdはinetdの拡張なのでxが無いことを気にする必要ない

gdm

Fedora 7位?までは、vncserverをyumで突っ込んでxinetd.dにファイルを書くだけだった気がするが、ここのところのFedoraはログイン認証周りの設定が強化されており、デフォルトではXDCMP経由のリモートログインが無効化されている。
Fedoraのデフォルトではディスプレイマネージャとしてgdmが使われているので、その設定ファイルを変更する。
以前は、X Windowシステム上で、[システム]→[管理]→[ログイン画面]と開けばgdmsetupが起動していたが、Fedora 8位からこの設定ツールがなくなったようなので、手で書くしかない。
# vi /etc/gdm/custom.conf
# GDM configuration storage

[xdmcp]
Enable=true

[chooser]

[security]
DisallowTCP=false
AllowRemoteRoot=false

[greeter]
IncludeAll=false

[debug]
あんまり中身についてはよくわからないので解説省略^^;
多分重要なのはxdcmpセクションのEnable=true。

gdmの再起動

gdmのみを再起動したいところなのだが、どうも簡単にはできない模様。色々試してみたが…。
一部ではinitを一旦3に下げて5に戻すといいらしいという話もあったが、ここでは素直にサーバーを再起動する。
# shutdown -r now

接続確認

今度はvncviewerで接続したら、グラフィカルなログイン画面が出てくるはず。

fedoravnc.png