httptunnelで穴掘り

このページは、httptunnel 3.0.5を対象にしています。

インストール

入手方法

オフィシャルサイトから、必要なファイルを持ってきます。

コンパイル

ソースからビルドする場合は、autoconfに対応しているので非常に簡単です。

% tar zxf httptunnel.tar.gz
% cd httptunnel
% ./configure
% make
% sudo make install

コマンドは/usr/local/binに入るhts(サーバ)とhtc(クライアント)です。ちゃんとmanページもあります。

掘削工事

トンネルを掘る

想定環境のHTTP proxyは、CONNECTメソッドこそ443番ポートしか通しませんが、その他のメソッドでは任意のポート番号が使えます。そこで今回は暗号化については考えず、サーバ側に8888番(httptunnelのデフォルト)のhtsを常駐させ、それにsshdへの転送をさせます。

トンネル設計図

まず、serverでhtsを起動します。特にバックグラウンド実行を指示しなくても、勝手にdaemon化するようです。8888番ポートを使うので、一般ユーザで実行できます。

server% hts -F localhost:22

client側ではhtcを起動します。これも勝手にdaemon化するようです。-PオプションでHTTP proxyの情報を与えます。

client# htc -P proxy:8080 -F 10022 server

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

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

なお、hts、htcを終了させる時は、普通にkillします。反応しなくなることが少なくないので、筆者はわりと頻繁にkillをする羽目になりました。

serverを踏み台にして別のホストへ

Zebedeeで穴掘りのマルチターゲットを使わずに、httptunnelで実現してみましょう。serverにはZebedeeで乗り込んで、server2へのトンネルをhtsに掘らせます。

踏み台

server% hts -F server2:22

client側は変わりません。これでserver2への接続手段が手に入りました。

最初からserver2でhtsを起動しておけばいいのですが、client直接乗り込める環境でないと、反応しなくなったhtsをkillするといった作業ができません。このように、別の手段でloginできるserverにserver2へのトンネルを用意することで、このような問題を回避しました。

なお、実際にserver2にloginするために、筆者は以下のようなスクリプトを書いて使っています。httptunnelの信頼性では、常時起動しておくのは心もとないので、必要なときにだけ実行するためです。なお、途中にはさまっているsleepは、htsとhtcのaccept準備が整うのを待つために入れたウェイトです。

#!/bin/sh
ssh server hts -F server2:22 &
htc -P proxy:8080 -F 2200 server
sleep 1
ssh -p 2200 server2
killall htc
ssh server killall hts

その他の特徴

daemon化

htsもhtcも、起動すると勝手にdaemon化してしまい、フォアグラウンドで動作させることができないように見えます。このため、ちょっとテストするときには不便です。

一方、htsにはpidファイルを吐き出すオプションがあり(-p)、syslogにもメッセージを出すので、いちおうサーバとして連続運用することを考慮されているようです。ただし上にも書いたように、頻繁に無反応になるため、どうしても安定した運用ができずにいます。これは筆者の環境のせい(Squidの多段proxy)かも知れません。

リンク

http://www.nocrew.org/software/httptunnel.html : オフィシャルサイト