2009/05/29(Fri)VNC Serverをxinetd経由で立てる方法 [Fedora 10]
2009/05/29 12:40
インストール
まずは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がリモートログインを規制しているのが原因なので解除する。
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