このページは、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の 特徴です。