> ホーム > ネットワーク > ちょっと風変わりな SSH 経由 VNC

ちょっと風変わりな SSH 経由 VNC

Contents

VNC そのもの、SSH そのものの説明をする気はありません。詳しいサイトを探してください。その割にはなんか長いんですけどね。

2002-04

VNC を知る

VNC はすでに十分に有名な GUI のリモートコントロールシステムです。私自身も最初にこれに触れてみてから早や数年が経ちましたが、これまでこの VNC をリモートメンテナンスツールとして本格的に使おうとはあまり思いませんでした。理由はまず第一に遅いこと。次にセキュリティ的にあまりよろしくないことです。セキュリティは特にアレで、VNC viewer で適当に叩けば接続のダイアログがクライアント側に出てきてしまうので特別なツールなんか持ってなくたって手当たり次第にやってればなんとかなりそうだし、重たい通信が生のまま流れている(らしい)し、デフォルトだとなぜかコネクションがあとからの人が優先されてしまうのでぶん取られたらおわり、という非常に困った感じでした。

まぁなんか目の届く範囲のマシンを手元で操作して喜んでおしまい、みたいなそんな感じです。

SSH port forward を知る

SSH というのをまともに使い始めたのは VNC に初めて触ったあとでありまして、SSH の便利な port forwarding によってセキュアな VNC が実現できたり、SSH の圧縮で多少速くなるんじゃねーか、みたいなことを知ってちょっと嬉しくなったりしました。

しかしその辺をもう少し高度に使いこなすためには Windows の場合はレジストリにタッチせねばならず、まぁ別に今さらレジストリをいじるのが怖いとは言いませんが、イマイチなんかこう、釈然としないものは感じます。いきなりレジストリっすか、と。レジストリエディタの操作性だってよくないしね。

(Windows の話になるのは、UNIX の場合、別に VNC でなくたって外からいじる方法があるからです。)

そして TightVNC

で、やっぱ遠隔で本格的にメンテするにはどう考えてもより高速な VNC 環境が必要だなということでもうちょっと調べました。するとやっぱあるんですね、そういう要求は。すでに本家でもいろいろ「拡張」として zlib 圧縮もあるのですが、さらに速い tight エンコードを引っさげた TightVNC というものがありました。

なんとこれはレジストリエディタを使わなくても LocalLoopback とかこちらの要求する設定ができるじゃないですか。これはいい。

インストールも本家版 VNC のように vncviewer を使うだけならインストーラは必要ないとか、そういう違いはなく、ハナからインストーラを使います。インストール先は本家版とは違う場所がデフォルトで指定されるので、これと言って考えることは何もないです。ただし、レジストリを共用するので本家版と TightVNC で違う設定を使い分けたいという要求は無理です。逆に今まで本家版を使っていて TightVNC に移行しようという場合は何もせずに設定を引き継いでくれるのでカンタンです。

インストールされた TightVNC のメニューも

TightVNC のスタートメニュー

VNC Viewer の設定が3つあるのでその分メニューが増えているだけで、何の違和感もありません。

具体的な転送速度ですが、めっちゃはぇぇ!ってことはないですが、「これはどうかなー」と思われる重さが、「あ、これなら我慢できる。」程度にはなります。どっちにしろ遠隔の GUI が重いことには違いありません。

[ ↑ content ↑ ]

vncviewer

設定はスピードに直接関わるエンコード方式の選択が増えています。

TightVNC の VNC viewer の設定。エンコード方式と圧縮レベルの設定、JPEG 圧縮の設定などが増えている。

JPEG 圧縮もできますが、操作するリモートの画面がノイズだらけになるのはなんか気持ち悪いので個人的にはオススメしません。それよか強制的に8ビットカラーの色情報しか転送しない方が効果があるんじゃないかと思います。

vncserver

Advanced が加わっているのが大きな特徴です。

Advanced ボタンのついた設定画面

で、これを押すと

Loopback の設定などができる Advanced ダイアログ

こういうのが出てくるので、ポートフォワードで使おうと思う場合(SSHもそのマシンの上で動かす場合)は AllowLoopback のチェックを入れてください。うーん、レジストリエディタを使うより数段楽だ。

ポートフォワード以外での接続を許可しない(その方が LAN 内からのいたずらを制限できる)場合は loopback ONLY の方にもチェックです。

[ ↑ content ↑ ]

逆方向 SSH port forwarding VNC

今回ちまたにたくさんあるのにわざわざ VNC を書いているのはこの逆方向 SSH port forward があるからなのです。こんなんでもなきゃわざわざ新しく VNC を取り上げたりしませんて。

SSH port forward というのはあちこちに書いてあるので今さらくり返しませんが、要するに SSH で掘ったトンネルの中に vnc のセッションを張ることで、暗合化した安全な通信の VNC を使う、っちゅーことです。こうすると何が嬉しいって、ネットワーク上で覗き見している人たちに VNC での操作の様子が分からない、何よりパスワードがばれるようなやばい事態にならない、っちゅーことです。

もっともパスワードはあまりに簡単ならアタック掛けられておしまいっちゅー話ですが。パスワードそのものが分かりにくいものになっていないと通信技術の段階で安全にしても基本的に意味はありません。

で、やることは

SSH のコネクションと逆方向に forward を掛け、そのトンネルを通して VNC を使う、の図

こういう感じ。

よくあるリモートコントロールの話
コントロールする側 コントロールされる側
VNC VNC client VNC server
SSH SSH client SSH server
今回紹介するリモートコントロールのシステム
コントロールする側 コントロールされる側
VNC VNC client VNC server
SSH SSH server SSH client

要するに通常紹介される SSH + VNC のリモートコントロールとは SSH の方向が反対なのです。

ttssh の forward 設定だと見慣れない

ttssh でのリモートからローカルへの forward 設定

こういう設定を使う。

OpenSSH の場合は

-R port:host:hostport

ということです。

リモートコントロールされる側(つまり VNC server を動かすマシンのある側)で SSH クライアントに対して、リモート→ローカルの方向にフォワードするように設定します。

SSH クライアントを動かすマシンと VNC server を動かすマシンは同じである必要はありません。多くの場合は同じになるかなーと思いますが。

[ ↑ content ↑ ]

メリット

なんでこんなことやるかっていうと、SSHd を立てられるのは、SSH のインストールができることはもちろん、ファイヤーウォールが立ってないか、あるいはその設定を自分やネットワーク管理者が変更できることが前提。また IP アドレスが固定になっているか Dynamic DNS になっているか、いずれにしてもサーバとして動作させるに必要な諸々の条件が絡む。要するに初心者には荷が重い。

でも安全な遠隔操作をしてもらうメリットは初心者に対しても十分に大きい、むしろ熟練者よりも大きいです。

逆に VNC server への接続は SSH が勝手に確立してくれるので、server がダイアルアップ接続だろうがファイヤーウォールの中にいようが関係ない。

その辺がこの逆方向 port forward のメリットです。

簡単に言えば、SSH server の立っているところがリモートサポートセンターのような感じになるわけです。で、ユーザーにはセンターへ SSH で接続してもらうことで、センター側から安全な通信でリモートコントロールしてもらえる、と。センター側では Windows の使い方がよく分からないから目の前で見せてくれ、とか、やり方が分からないから代わりにやってくれ、といった要求に応えることができるようになります。

(このリモートメンテのアイディアは以前バイトしていたところのものなので、私のオリジナルではありません。残念ながらその会社は今は存続していないので、アイディアの権利は誰のものでもないような…。)

コントロールされるマシン上で SSH で繋ぐ設定を最初にすれば、あとはその人に SSH への接続さえやってもらえば(で、VNC server はサービスで動かしておく)あとは外部からトラブルの対処とかのメンテを行なうことが可能である、しかもそいつ(メンテされる機械)はダイアルアップとかの IP アドレスが固定でない環境でも、とにかくインターネットに繋がっていてくれればよい、ということです。

[ ↑ content ↑ ]

設定

SSH サーバ

SSH のサーバは勝手に立ててください :) 立てられない人はこの方法は放棄してください。ポートフォワードを許可する設定をするのをお忘れなく。許可しないのであればこの方法は使えません。

SSH クライアント

[ ↑ content ↑ ]

VNC サーバ

いちばん注意しなければいけないのは、

SSH クライアントと VNC サーバが同じマシンに同居する場合は Loopback を許可する

ってことです。

VNC は通常では他のマシンからの接続を想定しています。

今回の方法は VNC server は SSH クライアントの動いているマシンから接続されるわけですが、この SSH クライアントが VNC サーバと同じマシン上で動いている場合はこの想定に反することになります。そこで設定を変更する必要があります。本家版 VNC を Windows で動かす場合はレジストリにタッチすることで、TightVNC を動かす場合はダイアログから設定します。(ここで TightVNC の速さ以外のメリットが生きてきます。もう一つは、GUI からログを取る設定ができるとこでしょう。)

接続を許可するスクリーンナンバーは動的に割り振っても固定にしても構いません。固定にしておいた方がフォワードの設定が確実に行なえますが。

VNC クライアント

vncviewer を使う場合はこれまで通り、しかし SSH サーバの動いているマシンに対して接続を行ないます。スクリーンナンバーは適宜指定してください。それでオッケー。特別な設定は必要ありません。ブラウザから繋げる場合は SSH サーバの動いているマシンのポート 58xx に接続してください。xx の部分がポート番号なのは前述の通り。

もちろん SSH サーバの動いているマシンに対して 58xx、59xx のポート番号での接続を直接行なえる環境、多くは同じ LAN 内にいる、ということが前提です。そうでない場合は以下の応用を読んでみてください。

[ ↑ content ↑ ]

応用

SSH サーバをリレーに使ってリモートメンテ、なんつー技も使えます。

SSH のポートフォワードをリレーして VNC を通す。

操作する側の SSH クライアントにローカルからリモートへの、よく見る方向でのフォワード設定を行ない、VNC クライアントでその SSH クライアントが動いているマシンに接続します。自分のマシンで両方動かす場合は VNC クライアントで localhost に接続するわけです。

そうすると自分の設定したポートフォワードと相手(操作される側)の設定したポートフォワードが連結されて、お互いがファイヤーウォールの中にいても、なんとなればお互いがダイアルアップでもリモートメンテが可能になります。もちろん SSH サーバに接続することが可能で、その SSH サーバがポートフォワードを許可していないとダメですが。

ついでに SSH サーバそのものをリレーさせることも可能です。でもそこまで行くとさすがに話が面倒ですし、現実にそんなことができるのか、あるいはやる意味があるのか、疑問です。

で、SSH ではなく Zebedee などの他のトンネルだけを目的にしたプログラムを動かした方がいいかなと思わなくはないのですが、(SSH はシェルを提供しちいますが、本当にトンネルが目的ならシェルは必要ないので)その辺はこちらの事情でちょっと紹介し切れません。Zebedee って、しかしいまいちマイナーですね。盛り上がりに欠けるというか。

Zebedee で逆向きにトンネルを掘る方法が分かりません(2004-05)。ssh 2 に対応した PortForwarder は RemoteForward の動きがまだおかしくて使えませんでした。むーん。

[ ↑ content ↑ ]

VNC インストール関係のちょっとしたメモ

本家Mac版

はじめに。このバージョンは OS X では使えません。(本家ってのは AT&T のことです。念のため。)

サーバ動作させたい場合は PPC が必要です。どうしても 68 を使いたい、Old Mac をサーバとして活用しているんだ、という場合は VNC ではなく Timbuktu などの従来からの有名な方法を採用してください。

で、VNC Server をインストールする AppleScript をダブルクリックするといろいろ怒られると思います。

実は簡単な話で、VNC Patches という機能拡張書類を機能拡張フォルダにインストールしようとしているのですが、このときにフォルダ名が英語環境に依存しているんです。これさえ分かればあとは簡単。手動でこの機能拡張書類を機能拡張フォルダに入れてやるだけ。

同様にコントロールパネルにもそのまま手で放り込んでやりましょう。

で、再起動。VNC Server を起動するとサーバ動作してくれるようになります。設定は VNC Controls をいじればなんとかなるでしょう(^^;

ただ、どういうわけか Win → Mac 方向の接続が途中でぶち切れたり、切断するときに Win 側の vncviewer が固まったり、悪さします。これ、有名な現象なんでしょうか?

Windows 2000 用ビデオドライバフック型 VNC

というものがあります。確かに画面の変化の取得範囲、更新範囲も狭く、非常にきびきび動きます。例えばウィンドウ配置も固定で、特定のアプリしか使わないような場合、例えばエディタで文字を書いたりする作業は、まじめな話、その場で古い機械を使っているのではないかと思うくらいに速いです。本家版や TightVNC を使った経験があるならとても同じ VNC とは思えないくらいに速いです。

ただ、インストールに失敗したり、サービス化に失敗したり、勝手に VNC server の動いているマシンの画面の設定がおかしくなったりといった弊害もあります。試したんですが、TightVNC の方が完成度も高いのでそちらを常用することにしました。試してみると感動しますが、常用にいたるかどうかは微妙なところだと思います。XP 対応とかする気あるのかもよく分かりません。

[ ↑ content ↑ ]

参考

VNC に関しては盛り上がりに欠けるのか、いつの間にかなくなってしまったサイトが、特に日本語関係は多く、なんだかちょっと残念な感じです。

あとは bookmark 参照。