VNCは、昔から本当にとっても世話になっているソフトなんですが、どんなソフトにもセキュリティホールがある可能性はあるわけだし、以前からちょっと「これってナニな気がしない?」という感触(って何だよ?!)がVNCからしていたので、
「さすがに、家のADSLルータでNATの設定をしてまでして、VNCサーバのポートをインターネット側に見せてしまうのはまずいだろう」
(だいたいsshやsendmailを見せるのでさえも、ちょっと怖いですからねぇ・・・)
とは思ってました。
バッファオーバーフローでDoSか、もしくは任意コードの実行くらいあるかも・・・と予想はしていましたが、まさか、これほどまでに
ナニな穴が掘られてしまっていたとは、予想もしてませんでしたけど。
さてさて、じゃあ、どうやって、外からVNCにアクセスするかっていうと、自宅からの場合は、
というように、VPNしてるので、インターネットを意識することなく、LANでそのまんまつながっちゃってるような感じで、VNCも使えています(ちなみに、vtundは大丈夫なんだろうか、という疑問も生じるのでありますが・・・)。
それ以外の場所からVNCを使うには、sshでポートフォワーディングをして、VNCサーバにアクセスしていました。
sshのポートフォワーディングについては、以前、
で、ちょろっと触れてました。
あ、そうそう、余談ですが、つい最近知ったのですが、ssh2プロトコルに対応したteratermがあるんですね。
UTF-8 TeraTerm Pro with TTSSH2 (SourceForge.jp)
これからは、こっちのteratermを使ってみようと思います。
■ VNCサーバが使うポート
オリジナルのVNCサーバのソースコードが、Xサーバにおんぶしているようなことからわかるように、VNCサーバってのは、Xサーバと同じようなポートの使い方をしています。
Xサーバの場合は、ディスプレイ番号が0のXサーバ(DISPLAY=:0)はTCPの6000番を開いていて、ディスプレイ番号が1(DISPLAY=:1)なら6001番が対応します。
またまた余談ですが、数年前から、XサーバはデフォルトではTCPのポートを開かなくなっています。
startxでXサーバを起動して、ps axwwコマンドでみたところ、こんな感じになっています。
593 v0 I+ 0:00.01 /bin/sh /usr/X11R6/bin/startx
611 v0 I+ 0:00.01 /usr/X11R6/bin/xinit /home/nhh/.xinitrc -- -auth /home/nhh/.serverauth.593 -nolisten tcp
612 v0 S 0:00.88 X :0 -auth /home/nhh/.serverauth.593 -nolisten tcp (Xorg)
Xサーバが、「-nolisten tcp」というオプションつきで起動しています。
sockstatコマンドで調べてみると、「/tmp/.X11-unix/X0」といったUNIXドメインソケットしか使われていないことに気がつきます。
これだと、リモートマシンでXクライアントを実行して、表示だけを手元のXサーバで行う、という使い方ができません。
そういう使い方をする場合は、昔みたいに、TCPソケットもlistenするようにします。
そのやり方は、どういう風にXサーバを起動するかによって、異なってきるのですが、startxコマンドで起動する場合は、
startx -listen tcp
という風に「-listen tcp」オプションを追加すればいいみたいです(startxがシェルスクリプトだったのでわかった)。xdmやkdmなどを使っている場合は、やり方はまた違ってきます(やれやれ・・・)。
さて、こういう風にして起動したXサーバは、sockstatコマンドで調べてみると、
root Xorg 675 1 tcp6 *:6000 *:*
root Xorg 675 3 tcp4 *:6000 *:*
という感じで、6000番のポートを開いています。
vncserverを実行すると、
nhh@freebsd% vncserver
New 'freebsd.vmware.local:1 (nhh)' desktop is freebsd.vmware.local:1
Starting applications specified in /home/nhh/.vnc/xstartup
Log file is /home/nhh/.vnc/freebsd.vmware.local:1.log
というふうに、Xのディスプレイ番号1として、VNCサーバが動いています。ちなみに、もう1つVNCサーバを動かすと、
nhh@freebsd% vncserver
New 'freebsd.vmware.local:2 (nhh)' desktop is freebsd.vmware.local:2
Starting applications specified in /home/nhh/.vnc/xstartup
Log file is /home/nhh/.vnc/freebsd.vmware.local:2.log
ディスプレイ番号2で動く、という具合です。
sockstatで、VNCサーバ(Xvnc)が開いているポートを調べてみると・・・
ディスプレイ番号1のほうは、こんなかんじ。
nhh Xvnc 726 0 tcp4 *:6001 *:*
nhh Xvnc 726 3 tcp4 *:5901 *:*
nhh Xvnc 726 4 tcp4 *:5801 *:*
ディスプレイ番号2のほうは、こんなかんじ。
nhh Xvnc 760 0 tcp4 *:6002 *:*
nhh Xvnc 760 3 tcp4 *:5902 *:*
nhh Xvnc 760 4 tcp4 *:5802 *:*
というわけで、
- 5800 + (ディスプレイ番号)
- 5900 + (ディスプレイ番号)
- 6000 + (ディスプレイ番号)
という3種類のポートをオープンしているのがわかります。
- 6000番台のポートは、Xサーバと同様で、XクライアントがXサーバにアクセスするときに使用しています。
- 5900番台は、VNC固有のもので、VNCクライアントが、VNCサーバにアクセスするときに使用します
- 5800番台は、mini-HTTPサーバというもので、JavaアプレットのVNCクライアントのためにあるものだったような気がします。Javaなんてつかわね、っていうなら、これは、なくてもかまいません。
というわけで、VNCクライアントがアクセスしにいくのは5900番台のポートなので、この5900番台のポートを、sshでポートフォワーディングしてやればいいわけです。
■ Windows上で動いているVNCサーバの場合
Windows版のVNCサーバは、Xサーバのようにディスプレイ番号の概念がないので(???)・・・というか、VNCサーバ用の画面が新たに割り当てられるのではなく、Windowsの画面がそのままVNCで使われてしまいますので・・・、ディスプレイ番号は0とみなして、5900番のポートが、デフォルトで使われています。
以下はTightVNCのVNCサーバの設定画面。薄い文字で5900と書かれています。
というわけで、Windows上のVNCサーバの場合も同様に、5900番台のポートを、sshでポートフォワーディングしてやればいいわけです。
■ teratermでVNCのポートフォワーディングをする設定
さっそく、「UTF-8 TeraTerm Pro with TTSSH2」を使ってみました。
● 例1) sshでログインしたホスト上で動いているVNCサーバにアクセスする場合
たとえば、外でWindowsを使っていて、sshでリモートのFreeBSDにログインして、そのFreeBSD上で動いているVNCサーバ(ディスプレイ番号は1)につなぐような場合です。
リモート側については、
- IPアドレスは(sshでログインした先そのものなので)127.0.0.1
- ポート番号は、VNCクライアントがVNCサーバにアクセスするためのポートであり、例ではディスプレイ番号が1なので、5901
- わかりやすいので、ローカルのポートは、とりあえず5901にしておきますか
というわけで、こういう設定になります。
sshでログインして、上記のようにポートフォワーディングができるように設定しておいてから、VNCクライアントを実行します。ここでは、TightVNCのVNCクライアント(TightVNC Viewer)を実行してみました。
この例では、sshクライアントを実行しているWindowsパソコン(127.0.0.1)のポート5901に接続するので、「127.0.0.1:1」と指定します。
実際に使用するポート番号は5901なのですが、VNCでサーバを指定するときは、「:1」のように、ディスプレイ番号を指定するので「127.0.0.1:1」となります。
ところで・・・TightVNCでは、ディスプレイ番号ではなく、「::ポート番号」という形式で、ポート番号を明示的に指定することもできます。そのため、この場合、「127.0.0.1::5901」(コロンを2つ連続)という風に指定しても同じようにアクセスできます。
● 例2) sshでログインした先のネットワーク上にいる、WindowsのVNCサーバにアクセスする場合
たとえば、
- 家の外でWindowsを使っているときに、
- 自宅のFreeBSDサーバにsshでログインしてから、
- さらに、家庭内LAN経由で、Windowsパソコン上のVNCサーバに接続して、
- Windowsを家の外からリモートコントロールする、
というような使い方を想定してます(ちょっと複雑~)。
とりあえず、ここでは例として、WindowsパソコンのIPアドレスを192.168.0.23とします。
sshのポートフォワーディングは、こうなります。
- リモート側については、
- IPアドレスは、WindowsのIPアドレスである、192.168.0.23
- ポート番号は、さきほどの画面例にあったように、通常、Windowsでは5900番でVNCクライアントの接続を待ちうけしているので、5900
- ローカルのポートは、とりあえず5923にしておきますか
というわけで、こういう設定になります。
上記のようにポートフォワーディングを設定しておいてから、sshで家庭内FreeBSDサーバにログインして、VNCクライアントを実行します。
この例では、sshクライアントを実行しているWindowsパソコン(127.0.0.1)のポート5923に接続すればよくて、ディスプレイ番号は、ポート番号から5900を引き算すればいいので、「127.0.0.1:23」と指定することになります。
ポートフォワーディングの設定で、5923なんていう中途半端な番号を指定したのは、ここで、「IPアドレスが192.168.0.23のVNCサーバには:23でアクセス」ということで、わかりやすいかなぁ~と思ってのことでした。
さきほど同様に、TightVNC Viewerの場合は、「127.0.0.1::5923」と、ポート番号で指定することもできます。
(おまけ)
なんとなく、RealVNC 4.1.2のVNC Viewerでも、「IPアドレス::ポート番号」の書式を試してみたら、なんと、使えました。なーんだ、RealVNCでもいつのまにか対応してたんですね。
0 件のコメント:
コメントを投稿