monoの開発ブログ

http/httpsしか利用できない環境下でsshが使えるようにしてみる

世の中には、何らかの事情でhttp/httpsしか利用できないようにファイアウォールで制限しているネットワークが存在します。このような環境下でsshを使いたい場合、stoneなどを利用してトンネリングを行うことで制限を回避できる場合があります。

stoneとは

stoneはアプリケーションレベルのTCP&UDPリピータです。任意のプロトコルの通信をhttpsの中に通すことで、プロトコル制限を回避できます。

サーバの設定

Debian/UbuntuなどのOSにはパッケージが用意されているので、それを利用します。

sudo aptitude install stone

インストールが完了したら、daemontoolsで動作させるように設定を行います。

cd /etc/servicesudo mkdir stonecd stonesudo vi runsudo chmod +x run

run

443番ポートにSSLで暗号化された状態で送られてきたパケットを復号して22番ポートに流すように設定します。

#!/bin/shexec stone localhost:22 443/ssl

クライアントの設定

ここでは、クライアントにWindowsを利用すると想定して説明します。Debian/Ubuntuなどの場合は、サーバと同様にパッケージが存在するだけインストールできます。

Windows版のstoneは以下のWebサイトからダウンロードできます。Vista以降に対応するバージョンは無いようですが、手元のWindows 7ではXP向けのものが動作しているので試してみる価値はあると思います。 Simple Repeater `stone' プログラムを適当なディレクトリに配置したら、以下のようなコマンドでstoneを起動します。

stone localhost:10443/ssl 10000 -- proxy/http 10443 "CONNECT server:443 HTTP/1.0"

この設定では、まず10000番ポートへのパケットをSSLで暗号化して10443番ポートに流し、10443番ポートに流れてきたパケットをproxy経由でserverの443番ポートに飛ばすようにしています。

あとはsshクライアントでlocalhost:10000に接続すれば、httpsの中にsshを通す形でサーバに接続できるはずです。

ただ、このままだとどこからでもアクセス可能になってしまうため、サーバ側の設定を変更して指定したホストからの接続のみ許可するようにしておきましょう。

#!/bin/shexec stone localhost:22 443/ssl host1 host2