stoneで穴掘り

このページは、stone 2.1wを対象にしています。

インストール

入手方法

オフィシャルサイトからtar.gzを持って きても良いですが、SSL対応のためのソースのいくつかが含まれていないので、CVSからまとめて持っ てきてしまうのが楽でしょう。

% cvs -d :pserver:anonymous@cvs.sourceforge.jp:/cvsroot/stone login
CVS password: (←空Enter)
% cvs -d :pserver:anonymous@cvs.sourceforge.jp:/cvsroot/stone co stone

コンパイル

OS名を指定してmakeするだけです。SSLを利用する場合には、OS名に「-ssl」を付加します。なお、SSLを使う場合にはOpenSSLがインストールされている必要があります。Linuxディストリビューション によってはopenssl-develのような開発向けパッケージのインストールが必要です。

% make linux-ssl

小さなツールなので、makeは一瞬です。できあがった「stone」が実行ファイルなので、適当な場所 に移します。筆者は/usr/local/bin/stoneとしました。

鍵の生成

SSL接続のため、serverには鍵が必要です。下準備としてこれも作成しておきます。本当のSSLであれ ば認証局を通してきちんとした鍵を得るべきですが、今回はホスト認証は目的でなく、単なる暗号化 が必要なだけなので、そこまでは行いませんでした。

環境によってパスが異なると思いますが、筆者の環境ではSSLを使ったサーバを起動しようとすると、stoneに「/var/ssl/certs/stone.pemがない」と叱られます。そこでこれを作ります。

server# cd /var/ssl/certs
server# make stone.pem
(以下、色々と質問される)

これでstone.pemができました。

掘削工事

まずはただのトンネル

こんな感じのトンネルを考えます。client上のsshは、まずlocalhost:10022で待っているstoneに接 続します。stoneはproxy:8080にあるHTTPSに対して、server:443(https)に接続するように依頼しま す。server:443で待っているのはHTTPSサーバではなく別のstoneで、これがlocalhost:22で待ってい るsshdにつなぎます。

トンネル設計図

最初にserver側のstoneを実行します。443で待つので、rootで実行する必要があります。

server# stone localhost:22 443

続いて、client側。こちらは一般ユーザでOKです。

client% stone proxy:8080/http 10022 "CONNECT server:443 HTTP/1.0"

10022で待ち、proxy:8080に転送する設定ですが、末尾の「CONNECT ...」がstone最大の魅力です。HTTP proxyに対してCONNECTメソッドを使って相手サーバの443ポートへの接続要求を出すと、proxyサ ーバはそのあとはSSL通信とみなしてかなり自由な通信ができます。GETやPOSTを使ったトンネルに比 べて安定した接続が得られます。

それではsshを使ってみましょう。

client% ssh -p 10022 localhost
Last login: Fri Oct 18 09:17:40 2002 from server
server% _

暗号化トンネルに拡張

SSHで暗号化されているので、内容が漏れる可能性はほとんどありませんが、proxy上を生のSSHプロ トコルが流れていると、proxy管理者に気づかれてしまう恐れがあります。これを回避して、「一見 ふつうのHTTPS通信」に見せかけるために、SSLによる暗号トンネルをかぶせます。つまり、図中の緑 色の矢印をSSLで暗号化することで、他のHTTPSセッションと見分けをつかなくさせるわけです。

暗号化トンネル

サーバ側を以下のように変えます。待ち受け側のポート番号に「/ssl」を付けると、受信データを復 号してから転送します。

server# stone localhost:22 443/ssl

クライアント側は二段仕込みになるので、以下のように指定します。転送先ポートに「/ssl」と付け た場合は、暗号化してから送出します。

client% stone localhost:10443/ssl 10022 -- proxy:8080/http 10443 "CONNECT server:443 HTTP/1.0"

sshからの使い方は、暗号化なしの場合と同様です。

その他の特徴

セキュアな運用

今回の例ではサーバ側のstoneをroot権限で動かしていますが、stoneには実効ユーザ、実効グループ を指定するオプション(-o、-g)や、chrootするオプション(-t)があります。

コマンドラインの末尾にホスト名を連ねることで、トンネルに接続可能なホストを制限することがで きます。トンネルの存在を秘匿しておきたいなら必須の設定でしょう。

また、アクセスログ(-a)やエラーログ(-L)を取得するようにしておいた方が良いでしょう。-lでsyslogに出すことも可能です。

多彩な転送機能

HTTPに乗せてパケットを転送するだけでなく、任意のTCPおよびUDP、Xプロトコルの転送ができます 。加えてPOP→APOP変換機能、簡易http proxyなど、転送機能のバリエーションが多彩なのがstoneの 特徴です。

リンク