ttt

getttyent

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

2006-06-09 23:30:12 | デジタル・インターネット

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


コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。