2006年6月10日土曜日

sshでポート・フォワーディングしてVNCを使う

VNCは、昔から本当にとっても世話になっているソフトなんですが、どんなソフトにもセキュリティホールがある可能性はあるわけだし、以前からちょっと「これってナニな気がしない?」という感触(って何だよ?!)がVNCからしていたので、

「さすがに、家のADSLルータでNATの設定をしてまでして、VNCサーバのポートをインターネット側に見せてしまうのはまずいだろう」
(だいたいsshやsendmailを見せるのでさえも、ちょっと怖いですからねぇ・・・)

とは思ってました。



バッファオーバーフローでDoSか、もしくは任意コードの実行くらいあるかも・・・と予想はしていましたが、まさか、これほどまでに

RealVNCに超やばいセキュリティホール

ナニな穴が掘られてしまっていたとは、予想もしてませんでしたけど。



さてさて、じゃあ、どうやって、外からVNCにアクセスするかっていうと、自宅からの場合は、

(FreeBSD) 実家と自宅をvtunでVPN接続

というように、VPNしてるので、インターネットを意識することなく、LANでそのまんまつながっちゃってるような感じで、VNCも使えています(ちなみに、vtundは大丈夫なんだろうか、という疑問も生じるのでありますが・・・)。



それ以外の場所からVNCを使うには、sshでポートフォワーディングをして、VNCサーバにアクセスしていました。



sshのポートフォワーディングについては、以前、





で、ちょろっと触れてました。



あ、そうそう、余談ですが、つい最近知ったのですが、ssh2プロトコルに対応したteratermがあるんですね。

UTF-8 TeraTerm Pro with TTSSH2 (SourceForge.jp)



UTF-8 TeraTerm Pro with TTSSH2 (窓の杜)

これからは、こっちの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と書かれています。



Sshvnc01







というわけで、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にしておきますか


というわけで、こういう設定になります。



Sshvnc02



Sshvnc03







sshでログインして、上記のようにポートフォワーディングができるように設定しておいてから、VNCクライアントを実行します。ここでは、TightVNCのVNCクライアント(TightVNC Viewer)を実行してみました。



この例では、sshクライアントを実行しているWindowsパソコン(127.0.0.1)のポート5901に接続するので、「127.0.0.1:1」と指定します。



Sshvnc04





実際に使用するポート番号は5901なのですが、VNCでサーバを指定するときは、「:1」のように、ディスプレイ番号を指定するので「127.0.0.1:1」となります。



ところで・・・TightVNCでは、ディスプレイ番号ではなく、「::ポート番号」という形式で、ポート番号を明示的に指定することもできます。そのため、この場合、「127.0.0.1::5901」(コロンを2つ連続)という風に指定しても同じようにアクセスできます。



Sshvnc05







● 例2) sshでログインした先のネットワーク上にいる、WindowsのVNCサーバにアクセスする場合



たとえば、



  1. 家の外でWindowsを使っているときに、


  2. 自宅のFreeBSDサーバにsshでログインしてから、


  3. さらに、家庭内LAN経由で、Windowsパソコン上のVNCサーバに接続して、


  4. Windowsを家の外からリモートコントロールする、


というような使い方を想定してます(ちょっと複雑~)。



とりあえず、ここでは例として、WindowsパソコンのIPアドレスを192.168.0.23とします。



sshのポートフォワーディングは、こうなります。



  • リモート側については、
    • IPアドレスは、WindowsのIPアドレスである、192.168.0.23


    • ポート番号は、さきほどの画面例にあったように、通常、Windowsでは5900番でVNCクライアントの接続を待ちうけしているので、5900


  • ローカルのポートは、とりあえず5923にしておきますか


というわけで、こういう設定になります。



Sshvnc06



Sshvnc07





上記のようにポートフォワーディングを設定しておいてから、sshで家庭内FreeBSDサーバにログインして、VNCクライアントを実行します。



この例では、sshクライアントを実行しているWindowsパソコン(127.0.0.1)のポート5923に接続すればよくて、ディスプレイ番号は、ポート番号から5900を引き算すればいいので、「127.0.0.1:23」と指定することになります。



Sshvnc08



ポートフォワーディングの設定で、5923なんていう中途半端な番号を指定したのは、ここで、「IPアドレスが192.168.0.23のVNCサーバには:23でアクセス」ということで、わかりやすいかなぁ~と思ってのことでした。





さきほど同様に、TightVNC Viewerの場合は、「127.0.0.1::5923」と、ポート番号で指定することもできます。



Sshvnc09







(おまけ)



なんとなく、RealVNC 4.1.2のVNC Viewerでも、「IPアドレス::ポート番号」の書式を試してみたら、なんと、使えました。なーんだ、RealVNCでもいつのまにか対応してたんですね。



Sshvnc11



Sshvnc10



0 件のコメント:

コメントを投稿