CentOS 6 にリモートデスクトップを導入

これまで研究室のサーバーはシェルログインしかしていなかったのだが,Mathematica ユーザーから GUI がほしいというリクエストがあったので,このたびリモートデスクトップでの操作ができるようセットアップした.

前提

下の図は,セットアップを行うサーバーの構成と,クライアントから ssh -p xxx hnagata@server を実行したときのリクエストの経路を表している.ルーターは server:xxx (ポートはいちおう伏せ) へのリクエストを受け取ると,master:22 へとポートフォワーディングする.ほかのポートは閉じているので,外部からは SSH を通してだけサーバー LAN にアクセスできるようになっている.

今回は,master のデスクトップ画面を client 上で表示できるようにするのが目的.

検討

まずは通信方法から.リモートデスクトップの通信プロトコルは,Windows なら RDP,それ意外なら VNC がデファクトスタンダードで,その他にも独自のプロトコルを使うソフトウェアがたくさんある.今回はサーバー側が CentOS であるのと,クライアント側の OS が不定なので,VNC を使うことにした.VNC は正しくはプロトコルではなく特定のソフトウェアでしかないが,オープンソースであるため互換性のあるソフトがいくつも開発されていて,web 上での情報も多いのが利点である.また,Linux の主要なディストリビューションや MacOSX では OS 標準でクライアントが付属している点も大きい.なお,VNC の欠点として単独では通信が暗号化されない,転送速度が遅いなどがあるが,用途の限定されたサーバーでの運用ならそれほど問題にならないだろう.

次に具体的な VNC のソフトウェアだが,サーバー側は CentOS 6.5 の標準リポジトリに TigerVNC Server が含まれているので,これを使う.TigerVNC Server はCentOS 6.0 で tigervnc-server としてリポジトリに登録され,(たぶん)6.2 からは vnc-server が tigervnc-server のエイリアスとなった.したがって単に vnc-server でインストールした場合は OS のバージョンによってソフトが異なるので,どの VNC がインストールされたのか確認したほうがよい.ここからは CentOS 6.5 でインストールできる TigerVNC Server (1.1.0) を前提とする.

クライアントソフトは OS ごとにいろいろな種類があるので,好きなものを選べばいいと思う.手元で確認したところでは,MacOSX では「画面共有」,Ubuntu 13.10 では Remmina を使って,OS 標準で VNC を使うことができる.Windows の場合は RealVNC が最もポピュラーであるようだ.

VNC サーバーのセットアップ

前述のとおり,TigerVNC Server は CentOS 6.5 の標準リポジトリに含まれているので,次のようにして簡単にインストールできる.

$ sudo yum install tigervnc-server

VNC サーバーに接続するには,ユーザーレベルでの VNC 専用パスワードを使用する.この設定は次のコマンドで行う.

$ vncpasswd

で,よそのサイトにはいろいろ書いてあったりするが,次のコマンドを実行すれば,もうリモートデスクトップが使えるようになる.

$ vncserver :1

Now 'master:1 (hnagata)' desktop is master:1

Starting applications specified in /home/hnagata/.vnc/xstartup
Log file is /home/hnagata/.vnc/master:1.log

「:1」はディスプレイ番号で,すでに使用中の番号は使えない.

サーバー側から切断するには,vncserver で -kill オプションを使う.

$ vncserver -kill :1

VNC クライアントの設定 (MacOSX)

クライアントの説明は MacOSX の場合が一番簡単なので,まずは MacOSX から説明する.

ここまでで,ネットワークの状態は次のようになっている.

vncserver は,ディスプレイ番号 n に対して,ポート 5900 + n でリモートのリクエストを受け付ける.したがって,クライアントのソフトウェアで接続先 master:5901 を指定すればリモートデスクトップが使えるようになるのだが,今回はもう一工夫必要である.というのも,ルーターが SSH しか通さないので,外部から master:5901 に接続することができないからだ.

これを回避するためには,ルーターが 5901 ポートを通すように設定するか,SSH ポートフォワーディングを利用して SSH を通して通信を行うかのどちらかが必要になる.ただし,先に述べたとおり VNC のポート番号はディスプレイ番号に依存するので,前者は現実的ではない.したがって,後者を利用する.

SSH ポートフォワーディングは,接続元の特定ポートにアクセスがあったとき,それをリモートのポートにリダイレクトし,途中の通信は SSH で暗号化するという,なんとも便利な機能である.MacOSX では,ssh の -L オプションを使って,SSH ポートフォワーディングを有効にする.

$ ssh -L 15900:localhost:5901 -p xxx hnagata@server

-L port:host:hostport は,接続元の port にアクセスがあったとき,それを host のポート hostport に転送するという意味.ここで host は SSH の接続先で名前解決されるので,ここに localhost と書くと SSH の接続先と同一のマシンを指すことになる(つまり,SSH 自体の接続先と SSH ポートフォワーディングによる転送先に異なるマシンを設定することもできる).理解のために,localhost の代わりに master や server を入れるとどうなるか考えてみるとよい.

SSH ポートフォワーディングを有効にしたときの状態は,次のようになる.

したがって,最後の目標は,クライアントが自分自身のポート 5901 に接続することである.MacOSX では,Finder の「移動」>「サーバへ接続」を開き,サーバアドレスに vnc://localhost:15900 と入力して接続する.「画面共有の暗号化に対応していません」という注意が表示されるが,今の場合は SSH を通して接続しているので,心配することなく接続してよい.接続元から接続先への転送はあくまで SSH の仕事であって,VNC クライアント自体は自分が送る通信が SSH を通ることは知らないので,このようなメッセージが表示される.なお,ここで入力した localhost は,先ほどとは異なり client のことである.

VNC クライアントの設定 (Windows)

Windows でも,基本的には MacOSX と同じように,SSH ポートフォワーディングを有効にしてから VNC クライアントソフトで接続となる.ただし Windows の標準では SSH クライアントも VNC クライアントもインストールされていないので,自身でこれらをインストールする必要がある.SSH クライアントは Cygwin などのものを使えば MacOSX の場合とまったく同様にポートフォワーディングを実現できる.VNC クライアントはユーザーの多い RealVNC か,最近活発な TigerVNC を使えばよいと思われる.

VNC クライアントの設定 (Linux)

Linux からの VNC 接続は正直追い切れていない.自分の普段使いの Ubuntu 13.10 では Remmina がインストールされていて,SSH ポートフォワーディングの設定も内包しているが,自分の環境では接続しに行ったまま帰ってこない.VMWare からではできないのか?

その他のサーバー設定

vncserver の init サービス化

上の手順では,各ユーザーがあらかじめ vncserver コマンドを実行してサーバーを起動させる必要があった.vncserver を init.d に登録しておくと,service からすべてのサーバーを一斉に起動することができる.各ユーザーの手間は減り,ディスプレイ番号の衝突も避けられるが,設定の変更には常にルート権限が必要なので多少面倒ではある.

yum で tigervnc-server をインストールすると,勝手に init.d に vncserver が作成される.したがって,service コマンドですぐにサービスを起動することができる.また,ブート時に自動起動させたいなら,chkconfig で設定すればよい.

$ sudo service vncserver start
$ sudo chkconfig vncserver on

vncserver サービスを起動したときに開かれるディスプレイと起動オプションは,/etc/sysconfig/vncservers に次のように記述する.

VNCSERVERS="1:hnagata"
VNCSERVERARGS[1]=""

VNCSERVERS にはディスプレイ番号とユーザー名をコロン “:” 区切りで記述する.ユーザーが複数いる場合は,ディスプレイ番号とユーザー名のペアをスペース ” ” で区切って記述する.ディスプレイ番号は特に制約が書かれておらず,番号が飛んでも問題ないようだが,man には “the first available display number (usually :1)” との記述があるので,1 から順に振っていくのが無難と思われる(1 は実機ディスプレイのために空けておく場合もある).VNCSERVERARGS は,各ディスプレイ番号ごとに vncserver の起動オプションを記述する.詳細は man vncserver および man Xvnc を参照.

-localhost オプション

上と関連して,vncserver の起動オプションには -localhost というのがある.定義からいえばこのマシンへの VNC 接続を自分自身からだけに制限するオプションだが,つまりは SSH ポートフォワーディング以外の接続を許可しないということだと思ってよい(本当に自分自身が自分自身に VNC 接続したら,ディスプレイには何が映るのか?).

twm と GNOME

多くの参考ページには,GNOME を使うためには xstartup を編集する必要があるとされていたが,実際やってみたら何もしなくても GNOME の画面になった.xstartup では twm が起動するように書いてあるが,謎.

CentOS 6 にリモートデスクトップを導入」への1件のフィードバック

  1. 返信

コメントを残す

メールアドレスが公開されることはありません。