x11vnc

Linuxサーバをリモートデスクトップみたいに操作するソフト(モジュール)。
他にはRealVNCやらVNCServer等がある。
x11vncの特徴としては、複数のユーザが同時ログインした際に、
“それぞれのVNCクライアントに同じ(Linux)画面”が出力出来る。

構築環境

今回検証した環境はこちら

  • CentOS 6.4 x86_64
  • ※同時に複数端末でログインしても、同じ画面が表示される事を確認

構築

1. インストール
ソースからmakeするのが筋なのだろうが、面倒だったのでyumでインストール。
apt-getでも同様に行ける。筈

# yum install x11vnc



2. パスワードファイルの作成
デフォルトのままだと、パスワード認証が掛かってないので、パスワードのマップ(ファイル)を作成する。
なお、パスワードファイル6文字以上・8文字以下にする事。
(今回の設定方法の)x11vncではパスワードにDESを利用しているので、最大8文字しか認識出来ない。
もし、9文字以上を入力しても、8文字目までしか認識を行わないので意味が無い。

# x11vnc -storepasswd
---
Enter VNC password:
Verify password:
Write password to /root/.vnc/passwd? [y]/n
Password written to: /root/.vnc/passwd

さすがに、rootのフォルダに置いておくのはどうかと思うので、お好みにより移動させる。

# mv /root/.vnc/passwd /etc/passwdvnc



3. xinetd - x11vncの自動起動
xinetdからx11vncを起動させる為に設定を追記していく。
自分の環境では、vncの応答ポート番号に5920を使用している。
デフォルトは5900番なのだが、良く攻撃対象ポートになるので変更する事を推奨。
各オプションの詳細については以下参照

  • VNC server for real X displays
  • Allow VNC connections to real X11 displays
    # vi /etc/xinetd.d/x11vnc
    ---
    service x11vnc
    {
        port        = 5920
        protocol    = tcp
        disable     = no
        socket_type = stream
        wait        = no
        user        = root
        server      = /usr/bin/x11vnc
        server_args = -display :0 -geometry 1024x768 -rfbauth /etc/passwdvnc b-allow 192.168.1.11 -o /var/log/x11vnc.log -auth guess -inetd -noncache -xkb -repeat -forever -bg -shared -enablehttpproxy -nolookup
    }
  • xinetd(x11vnc連携)補足
    port = xinetdがx11vncを待ち受けるポート番号。"-rfbport"と被ってはいけない。
    user = x11vncを実行するユーザ。"-auth"読み取り権限の関係でrootを推奨。
    server = x11vncのバイナリ。『# which x11vnc』で調べられる。
    server_args = x11vncの引数。詳細は下参照



4. server_argsの設定
server_argsの設定が結構厄介。x11vncを構築する各環境に合わせて調整していく事になる。

  • -display :0
    Linuxの端末番号。もし、ここを“:1”に変更したらクライアントからの接続ポート番号は“5921”番になる。
  • -geometry 1024x768
    クライアントで表示するVNC接続先の解像度。
  • -rfbauth /etc/passwdvnc
    パスワードファイルのPATH。
  • -allow 192.168.1.11
    接続を許可するクライアントのIPアドレス。“,”区切りで複数指定、“192.168.1.”で/24を想定した範囲も可。
  • -o /var/log/x11vnc.log
    x11vncの動作ログ保存先。各接続毎に新規作成される。
  • -auth guess
    XServerの管理番号ファイルの指定。gdm/kdm/xdmで色々変わる。公式だと、
    gdm: -auth /var/gdm/:0.Xauth
    gdm: -auth /var/lib/gdm/:0.Xauth
    kdm: -auth /var/lib/kdm/A:0-crWk72
    kdm: -auth /var/run/xauth/A:0-crWk72
    xdm: -auth /var/lib/xdm/authdir/authfiles/A:0-XQvaJk
    dtlogin: -auth /var/dt/A:0-UgaaXa
    が推奨らしいが、殆どの場合で違うので書き換え必須。
    CentOSで使用しているgdmだと、
    /var/run/gdm/auth-for-[UserName]-***
    なのだが、[UserName]はユーザ毎に変わり、***の中はランダムなので、
    xinetd経由でのx11vnc起動オプションから上のディレクトリを決め打ちをする事が出来ない。
    よって、『-auth guess』を指定して可変適応させる。
  • -inetd
    デーモンとして稼働。
  • -noncache
    クライアントに対して、Linuxの画面をキャッシュしない。
    noncacheにすると、VNCクライアントで解像度違いによるバグが起きなくなる。
  • -xkb
    LinuxのXKeyboardを拡張する。LinuxでもShiftとかが打てる様になる。
  • -repeat
    クライアントからの接続保持?
  • -forever
    指定しないと、セッションが終了する毎にx11vncが落ちる。
    指定をすると、セッションが終了しても、x11vncが待機状態になりクライアントから再度接続する事が可能になる。
  • -bg
    x11vncをバックグラウンドで動作。
  • -shared
    複数ユーザで同じ画面を共有する。
  • -enablehttpproxy
    http-proxyを使用可能にする。



5. ポートとサービスの対応付
ポート5920はx11vncという事を設定する。

# vi /etc/services
---
※最下行に追記
x11vnc          5920/tcp                # X11 VNC Server
x11vnc          5920/udp                # X11 VNC Server

必要に応じて、iptablesの設定も変更する事。
上記が全て完了したらLinux機の再起動をする

接続

適当なVNCクライアントを使用して、Linux機に接続をする。接続する際には

[Linux機のIPアドレス]::[ポート番号]

を指定する(クライアントによって変化)。

注意事項

  • -look
    server_argsには"-look"オプションがあるのだが、これと"-inetd , -forever , -repeat"を同時に使用すると、
    x11vncがgdm等のXauthを取得出来なくなり、接続毎にゾンビが発生してしまうので、
    "-look"オプションは使用しない事を推奨。
  • -rfbport
    server_argsには"-rfbport"という、“VNCの待ち受けポート番号を個別に指定出来る”オプションがあるのだが、
    こっちも指定すると、xinetdの方で指定したport番号と競合を起こす可能性があるので、非推奨。
    だが、常に指定したディスプレイ番号(20以上とか)でVNCを待ち受けしたい時には使える。
    その場合、クライアントは最初xinetdのポートへ接続を行い、
    わざとエラーでクライアントを落とした後、"-rfbport"で指定したポート番号に対して再度接続をする事になる。
    1度目→[Linux機のIPアドレス]::5920
    ※接続しに行くと必ず落ちる。
    2度目→[Linux機のIPアドレス]::[-rfbportで指定したポート番号]
    ※接続が出来る。