Mac OS XからUbuntu Linux 10.04 LTSにVNCでアクセス

前の記事で作業したとおり、さくらのVPSでUbuntu Linuxの環境を構築して、imotenを動かすことができました。

でもひとつの目的を達成して、なおリソースに余裕があることを知ると、もっと他のことができるんじゃないかと考えてしまいます。 ということで、デスクトップ環境をVPS上に構築し、MacOSXをクライアント、さくらのVPS上のUbuntu LinuxをサーバとするVNC環境を構築してみることにします。

サーバ側Ubuntu Linux 10.04の準備

参考URL kreis::Ubuntu 10.04LTD(VNC) http://kreis.usamimi.info/blog/index.php?e=90&PHPSESSID=1ea22ffa6bd3958244eaff0ce18a9ae9


あちこちで、UbuntuでVNCを試されている記事に出会ったのですが、上記の記事のやりかたでないとうまくいきませんでした。/etc/xinetd.d/xvnc の記述で「flags = REUSE NODELAY」が入ることがポイントのようです。

Desktop環境のインストール

インストールしたのがサーバ版ということで、ひとまずデフォルトのGnomeが起動できるようにインストールを行います。 Ubuntuの日本語環境 | Ubuntu Japanese Teamを参考に

  • 日本語環境のレポジトリ追加
  • デスクトップ環境のインストール

の順番で作業します。

  $ wget -q https://www.ubuntulinux.jp/ubuntu-ja-archive-keyring.gpg -O- | sudo apt-key add -
  $ wget -q https://www.ubuntulinux.jp/ubuntu-jp-ppa-keyring.gpg -O- | sudo apt-key add -
  $ sudo wget https://www.ubuntulinux.jp/sources.list.d/lucid.list -O /etc/apt/sources.list.d/ubuntu-ja.list
  $ sudo apt-get update
  $ sudo apt-get upgrade
  $ sudo apt-get install ubuntu-desktop-ja

VNCとxinetdのインストールとgdmの設定

  $ sudo apt-get install xinetd vnc4server
  $ sudo vncpasswd /etc/passwd_vnc
  Password:
  Verify:
  $ sudo chown nobody.tty /etc/passwd_vnc

ここで入力したパスワードがクライアントからのログイン時に必要になります。

viなどで以下のファイルを編集します。

/etc/xinetd.d/xvnc (新規作成)

    service xvnc
    {
    disable = no
    socket_type = stream
    wait = no
    user = nobody
    group = tty
    server = /usr/bin/Xvnc
    server_args = -inetd -query localhost -geometry 1440x900 -depth 24 -once -DisconnectClients=0
    -NeverShared -passwordFile=/etc/passwd_vnc -fp /usr/share/fonts/X11/misc,/usr/share/fonts/X11/100dpi
    /:unscaled,/usr/share/fonts/X11/75dpi/:unscaled,/usr/share/fonts/X11/Type1,/usr/share/fonts/X11/
    100dpi,/usr/share/fonts/X11/75dpi,/var/lib/defoma/x-ttcidfont-conf.d/dirs/TrueType
    flags = REUSE NODELAY
    port = 5901
    }

-geometryの後が解像度になります。 -passwordfileは先程vncpasswdで作成したのと同じファイル名 port番号は次に編集する /etc/services と番号を合わせましょう。 5900番が:0、5901番が:1…という具合になります。

/etc/services (編集)

ファイルの最後に

  xvnc            5901/tcp                        # VNC server

と追加しましょう。/etc/servicesのxvncがサービス名となります。

/etc/gdm/gdm.schemas (編集)

以下2箇所を変更してください。

  • security/DisallowTCP→trueからfalse
  • xdmcp/Enable→falseからtrue

/etc/gdm/custom.conf (新規作成)

[daemon]
RemoteGreeter=/usr/lib/gdm/gdm-simple-greeter

[security]
DisallowTCP=false
AllowRemoteRoot=false

[xdmcp]
Enable=true
DisplaysPerHost=2

[gui]

[greeter]

[chooser]

[debug]

[servers]

最後にxinetdとgdmの再起動をかけます。

  $ sudo /etc/init.d/xinetd restart
  $ sudo /etc/init.d/gdm restart

netstatコマンドでListenしているかどうかを確認します。

  $ netstat -a | grep vnc
  tcp        0      0 *:xvnc                  *:*                     LISTEN 

xvncでLISTENになっていることを確認しました。これでサーバ側の準備OK。

クライアント側 Mac OS X

まず、クライアントソフトをなににするかですが、フリーのVNCクライアントでヒットしたのがChicken of the VNCだったのでこちらを使います。

Chicken of the VNC | Download Chicken of the VNC software for free at SourceForge.net http://sourceforge.net/projects/cotvnc/

Chicken of the VNCでLOGiN

  • Host: → サーバのIPアドレスを入力
  • Display: → サーバのポート番号から5900を引いた値(今回は1)
  • Password: → vncpasswdで設定したパスワード

これでログイン画面が表示されれば成功です。

トンネリングでVNC

しかしこのままですと、画面の通信がネット上を流れることになります。 セキュリティ的にちょっと心配…というわけでSSHトンネリングで通信を暗号化したいと思います。

MacPortsでSSHのパッケージがインストールされている前提です。

  $ ssh -l USER -L 5901:localhost:5901 SERVER_IP

USERはUbuntu上の自分のユーザ名、SERVER_IPはサーバのIPアドレス(59.x.x.x)は適宜読みかえてください。

そしてChicken of the VNCの設定はこうなります。

Chicken of the VNC トンネリング

すると、

  • Chicken of the VNCはlocalhostの5901番にアクセス
  • その通信は暗号化されてサーバのSSH(通常22番ポート)に転送
  • さらにそこからサーバの5901番ポートにアクセス
  • そこではVNCのサービスが起動している

という流れで、めでたくデスクトップ画面が表示されます。