ヘッドレス運用の開発マシンをセットアップするとき、VNCサーバの設定方法をよく忘れるのでメモ。

VNCサーバ設定

  • OS: Ubuntu Server 18.04
  1. 環境のインストール

    $ sudo apt update
    $ sudo apt install xfce4 xfce4-goodies tightvncserver firefox

  2. VNC接続パスワードの設定

    $ vncpasswd
    Using password file /home/<ユーザ名>/.vnc/passwd
    VNC directory /home/<ユーザ名>/.vnc does not exist, creating.
    Password:
    Verify:
    Would you like to enter a view-only password (y/n)? n
    パスワードは9文字以上だとWarning: password truncated to the length of 8.と表示されて8文字に短縮されるので注意。

  3. VNCサーバを起動

    $ vncserver
    xauth:  file /home/<ユーザ名>/.Xauthority does not exist
    
    New 'X' desktop is <ホスト名>:<ディスプレイ番号>
    
    Creating default startup script /home/<ユーザ名>/.vnc/xstartup
    Starting applications specified in /home/<ユーザ名>/.vnc/xstartup
    Log file is /home/<ユーザ名>/.vnc/<ホスト名>:<ディスプレイ番号>.log
    サーバは初回起動時にホームディレクトリ内で.vnc.Xauthorityなどのファイルを生成する。 他にVNCサーバを起動しているユーザがいなければ、ディスプレイ番号は1になる。 自分または他のユーザが特にディスプレイ番号を指定せずVNCサーバを起動していくと2, 3…と順番にディスプレイ番号が増える。

  4. 設定ファイルを編集する

    $ vncserver -kill :<ディスプレイ番号>
    で一度VNCサーバを閉じて ~/.vnc/xstartupを次のように編集する(そのままだとアイコンが表示されなかったりする)。
    #!/bin/bash
    xrdb $HOME/.Xresources
    startxfce4 &
    再度VNCサーバを起動する。
    $ vncserver

  • 運用方法
    OSを再起動したときユーザはvncserverコマンドを叩いて再度VNCサーバを起動する必要がある。
    画面の解像度と色深度を変更したい場合、以下のようにサーバ起動時に設定する。
    $ vncserver -depth 24 -geometry 1920x1080

クライアント接続手順

Ubuntu Desktop 18.04

Remminaというリモートデスクトップクライアントが標準でインストールされているのでこれを使う。

  1. Remminaを起動する。
  2. +ボタンを押す
  3. 次のように各項目を設定する。
  • Name : <適当な表示名>
  • Protocol : VNC - Virtual Network Computing
  • Server : <接続先アドレス>:<ポート番号> (<ポート番号>=5900+<ディスプレイ番号>)
    例 : 192.168.1.100:5901
  • User password : <vncpasswdで設定したパスワード>
  • Color depth : True color (24 bpp)
  • Quality : Medium
  1. Save and Connectを押す。
  2. 接続が確立するとリモート画面が表示される。
    次回以降は一覧に表示された項目をダブルクリックすると接続できるようになる。
macOS

OS標準のクライアントを使う。

  1. Finderを開いて、メニュー -> 移動 -> サーバへ接続...を押す。
  2. サーバアドレスにvnc://<接続先アドレス>:<ポート番号>/を入力して接続を押す(<ポート番号>=5900+<ディスプレイ番号>)。
    例 : vnc://192.168.1.100:5901/
  3. 画面共有が起動してパスワードを聞かれるので、vncpasswdで設定したパスワードを入力して接続を押す。
  4. 接続が確立するとリモート画面が表示される。
Windows

RealVNC VNC Viewerを使う。

  1. VNC Viewerをダウンロードしてインストールする。
  2. VNC Viewerを起動する。
  3. Enter a VNC Server address or search<接続先アドレス>:<ポート番号>を入力して接続を押す(<ポート番号>=5900+<ディスプレイ番号>)。
    例 : 192.168.1.100:5901
  4. Unencrypted connectionという警告ウィンドウが出るのでContinueを押して続行する。
  5. パスワードを聞かれるので、vncpasswdで設定したパスワードを入力してOKを押す。
  6. 接続が確立するとリモート画面が表示される。
    次回以降は一覧に表示された項目をダブルクリックすると接続できるようになる。
初回接続時

初回接続時にWelcome to the first start of the panelというウィンドウが表示されるのでUse default configを押して閉じる。
もしWebブラウザ、ターミナルのアイコンを押しても起動しなければ、 Applications -> Settings -> Preferred Applicationsを開いて Internetタブ -> Web BrowserMozilla Firefoxに、 Utilitiesタブ -> Terminal EmulatorXfce Terminalに設定されているか確認する。

セキュリティについて

VNCプロトコルでは映像の転送が暗号化されていないので、そのままだと通信内容から映像を傍受できてしまう。 通信を暗号化するにはSSHのポートフォワーディング機能を使う。

具体的には、クライアントからサーバに対してSSHでログインできる状態で、

$ ssh <ユーザ名>@<接続先アドレス> -L <ポート番号>:localhost:<ポート番号> -f -N
例 :
$ ssh user@192.168.1.100 -L 5901:localhost:5901 -f -N
をターミナルで実行したあとに、VNCクライアントでlocalhost:<ポート番号>に接続するとVNC over SSHが実現できる。

VNCクライアントによっては接続時にSSHポートフォワーディングを設定してくれる機能を持つものもある。
例えば、Remminaだと設定画面のSSH Tunnelタブで

  • Enable SSH tunnelにチェックを入れる。
  • SSH AuthenticationUser nameにログインユーザ名を入れる。
  • パスワード認証ならPasswordにチェック、公開鍵認証ならPublic key(automatic)にチェックをいれる。

と設定すると、接続するときに自動的にSSHポートフォワーディングを設定してくれる。