stone (TCP/IP packet repeater)

[ 戻る | トップページに戻る ]

概要

stone とは、アプリケーションレベルの TCP & UDP パケットリピーター。
SSL/APOP 対応や、簡易 HTTP Proxy 機能等が特徴。

URL

http://www.gcd.org/sengoku/stone/Welcome.ja.html (Official Site)

インストール環境

Slackware 7.0 (Kernel 2.2.14 + glibc 2.1.2)
Plamo Linux 2.2.1 (Kernel 2.2.19 + glibc 2.2)
Plamo Linux 1.4.4 (Kernel 2.2.10 + libc5)

必要なもの

OpenSSL, MD5

バージョン

2.1a, 2.1j, 2.1u, 2.2c

インストール手順 (2.1u 〜)

$ tar xvfz stone-2.1u.tar.gz
$ cd stone-2.1u
$ make linux-ssl

起動テストをしてみると以下のエラーにより起動しない。あれれ。
$ su
# ./stone -o nobody -g nobody -l server:443 443 &
./stone: error while loading shared libraries: libssl.so.0.9.6: \
         cannot load shared object file: No such file or directory

ldd してみると...。
# ldd /usr/local/sbin/stone
        libpthread.so.0 => /lib/libpthread.so.0 (0x4001a000)
        libssl.so.0.9.6 => not found
        libcrypto.so.0.9.6 => not found
        libc.so.6 => /lib/libc.so.6 (0x40030000)
        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

libssl.* は /usr/local/ssl/lib にインストールされているので、以下のように LD_LIBRARY_PATH を指定して解決。
# LD_LIBRARY_PATH=/usr/local/ssl/lib ./stone -o nobody -g nobody -l server:443 443 &

あとはインストールしておしまい。
$ su
# install -m 511 stone /usr/local/sbin
# install -m 644 stone.1 /usr/local/man/man1
# install -m 644 stone.1.ja /usr/local/man/ja_JP.ujis/man1
# exit

インストール手順 (〜 2.1j)

$ tar xvfz stone-2.1a.tar.gz
$ cd stone-2.1a

configure 等はないので単に make すればいいのかな...。
$ make
run make with one of the following arguments
linux     ; for Linux
bsd       ; for FreeBSD or BSD/OS
sun       ; for SunOS 4.x with gcc
solaris   ; for Solaris with gcc
hp        ; for HP-UX with gcc
irix      ; for IRIX
win       ; for Windows 96/NT with VC++
emx       ; for OS/2 with EMX
using POP -> APOP conv., add '-pop' (example: linux-pop)
using above conv. and OpenSSL, add '-ssl' (example: linux-ssl)

ふむ。APOP 対応と SSL 対応を同時にするにはどうするのだ? Makefile を見ると、linux-ssl が linux-pop を含むようだが...。 とりあえず linux-ssl からやってみる。
$ make linux-ssl
make TARGET=linux ssl_stone
make[1]: Entering directory `/usr/local/src/stone-2.1a'
make[1]: *** No rule to make target `md5c.o', needed by `ssl_stone'.  Stop.
make[1]: Leaving directory `/usr/local/src/stone-2.1a'
make: *** [linux-ssl] Error 2

おろ? md5c.o なんて付属してないぞよ??
MD5 のソースを持ってこないといけないのか。 そういえばここで始めて気付いたのだが、md5sum は (デフォルトで) インストール されているのだが、md5 そのものは存在しないのねん。
とゆー訳で、MD5 をまずインストール。その後、MD5 をコンパイルして出来る md5c.o をカレントディレクトリにコピーしてくる。それから再度 stone のコンパイル。
$ cp ../MD5/md5c.o .      <--- ディレクトリは適宜修正のこと
$ make linux-ssl
make TARGET=linux ssl_stone
make[1]: Entering directory `/usr/local/src/stone-2.1a'
make FLAGS="-DUSE_POP -DUSE_SSL -I/usr/local/ssl/include" LIBS="md5c.o -L/usr/local/ssl/lib
     -lssl -lcrypto" linux
make[2]: Entering directory `/usr/local/src/stone-2.1a'
make FLAGS="-DINET_ADDR -DCPP='\"/usr/bin/cpp -traditional\"' -DUSE_POP -DUSE_SSL
     -I/usr/local/ssl/include" stone
make[3]: Entering directory `/usr/local/src/stone-2.1a'
cc  -DINET_ADDR -DCPP='"/usr/bin/cpp -traditional"' -DUSE_POP -DUSE_SSL -I/usr/local/ssl/include
    -o stone stone.c md5c.o -L/usr/local/ssl/lib -lssl -lcrypto
make[3]: Leaving directory `/usr/local/src/stone-2.1a'
make[2]: Leaving directory `/usr/local/src/stone-2.1a'
make[1]: Leaving directory `/usr/local/src/stone-2.1a'

無事できた (以後、このバイナリを stone-ssl と呼ぶ) 。
今度は linux-pop でやってみる。
$ make clean
$ make linux-pop
make TARGET=linux pop_stone
make[1]: Entering directory `/usr/local/src/stone-2.1a'
make[1]: *** No rule to make target `md5c.o', needed by `pop_stone'.  Stop.
make[1]: Leaving directory `/usr/local/src/stone-2.1a'
make: *** [linux-pop] Error 2

$ cp ../MD5/md5c.o .
$ make linux-pop
make TARGET=linux pop_stone
make[1]: Entering directory `/usr/local/src/stone-2.1a'
make FLAGS="-DUSE_POP" LIBS="md5c.o" linux
make[2]: Entering directory `/usr/local/src/stone-2.1a'
make FLAGS="-DINET_ADDR -DCPP='\"/usr/bin/cpp -traditional\"' -DUSE_POP" stone
make[3]: Entering directory `/usr/local/src/stone-2.1a'
cc  -DINET_ADDR -DCPP='"/usr/bin/cpp -traditional"' -DUSE_POP -o stone stone.c md5c.o
stone.c:236: global.h: No such file or directory
stone.c:237: md5.h: No such file or directory
make[3]: *** [stone] Error 1
make[3]: Leaving directory `/usr/local/src/stone-2.1a'
make[2]: *** [linux] Error 2
make[2]: Leaving directory `/usr/local/src/stone-2.1a'
make[1]: *** [pop_stone] Error 2
make[1]: Leaving directory `/usr/local/src/stone-2.1a'
make: *** [linux-pop] Error 2

あら? linux-ssl と挙動が違う。 ソース (stone.c) を調べてみると 236 行目あたりの #ifdef 、 これでは -DUSE_POP と -DUSE_SSL は両立しないような...。 が、これは調べてみて分かった。SSL を用いる場合は、SSL のインクルードファイル に必要な定義 (MD5_CTX) が含まれるのだが、SSL を使わない場合は、別途 md5.h をインクルードしないといけないため、こうなっているようだ。 結局、SSL 対応と APOP 対応、両方に対応したバイナリを作る場合は、linux-ssl すれば OK 。

以下、linux-pop のコンパイルを通すための方法を記述しておく。
まず、先にコピーした md5c.o を削除。 次に Makefile を以下のように修正する。
POP_FLAGS=      -DUSE_POP -I../MD5
                          ~~~~~~~~ MD5 のインストールディレクトリを指定
POP_LIBS=       ../MD5/md5c.o
                ~~~~~~~ MD5 のインストールディレクトリを指定

後は make linux-pop すれば OK (以下、これでできたバイナリを stone-pop と呼ぶ) 。
以下、POP --> APOP の変換中継の実験をやってみる。
$ su
# ./stone-ssl pop.hoge.co.jp:pop/apop localhost:pop &
Feb  5 16:40:47 start (2.1a) [916]
Feb  5 16:40:47 stone 3: Can't bind err=98.

おろ。なんで?? stone-pop を使っても同じ。むむっ...。
ああ、そうか。errno = 98 は "Address already in use" か。 popper が 110 を握っているのね。10110 等、未使用のポートを指定すれば、 stone-pop でも stone-ssl でもどちらでも動作に問題なし。 あとは適当なディレクトリにインストールしておしまい。
$ su
# install -m 511 stone /usr/local/sbin
# install -m 644 stone.1 /usr/local/man/man1
# install -m 644 stone.1.ja /usr/local/man/ja_JP.ujis/man1
# exit

[ 戻る | トップページに戻る ]