stone

Contents

stoneとは

stoneはTCP/UDPの中継ソフトである。

SSL暗号化に対応しており、SSL非対応のソフトウェアの通信を暗号化することができる。

 

公式ページ:http://www.gcd.org/sengoku/stone/Welcome.ja.html

 

環境

 

 

 

環境構築

 

stoneインストール

 

ソースコードからインストール

 

  1. rootになる
    su -
  2. 関連パッケージをインストールする
    まとめてインストールする場合
    yum install gcc make -y
    1. コンパイラをインストールする
      yum install gcc
    2. makeをインストールする
      yum install make
  3. ダウンロードサイト:http://www.gcd.org/sengoku/stone/Welcome.ja.htmlからアーカイブのURLを取得する
  4. ダウンロードする
    wget http://www.gcd.org/sengoku/stone/stone-2.3e.tar.gz
  5. アーカイブファイルを展開する
    tar xzfv stone-*.tar.gz
  6. ソースコードディレクトリへ移動する
    cd stone-*
  7. READMEファイルを読む場合、文字コードを変換する
    iconv -f ISO2022JP -t UTF8 README.txt
  8. コンパイル最適化設定を行う
    export CFLAGS="-O3 -m64"
  9. コンパイルする
    このままではエラーが発生するので、Makefileを書き換える。
    vi Makefile
    以下を
    linux:
            $(MAKE) FLAGS="-O -Wall -DCPP='\"/usr/bin/cpp -traditional\"' -DPTHREAD -DUNIX_DAEMON -DPRCTL -DSO_ORIGINAL_DST=80 -DUSE_EPOLL $(FLAGS)" LIBS="-lpthread $(LIBS)" stone
    次のように書き換える。(-D_GNU_SOURCEを加える。)
    linux:
            $(MAKE) FLAGS="-O -Wall -DCPP='\"/usr/bin/cpp -traditional\"' -DPTHREAD -DUNIX_DAEMON -DPRCTL -DSO_ORIGINAL_DST=80 -DUSE_EPOLL -D_GNU_SOURCE $(FLAGS)" LIBS="-lpthread $(LIBS)" stone
    makeを実行する。
    make | tee make.log
    エラー内容は以下。

    make TARGET=linux ssl_stone LIBS="-ldl"
    make[1]: Entering directory `/root/stone-2.3d-2.3.2.7'
    make FLAGS="-DUSE_POP -DUSE_SSL " LIBS="-ldl -lssl -lcrypto" linux
    make[2]: Entering directory `/root/stone-2.3d-2.3.2.7'
    make FLAGS="-O -Wall -DCPP='\"/usr/bin/cpp -traditional\"' -DPTHREAD -DUNIX_DAEMON -DPRCTL -DSO_ORIGINAL_DST=80 -DUSE_EPOLL -DUSE_POP -DUSE_SSL " LIBS="-lpthread -ldl -lssl -lcrypto" stone
    make[3]: Entering directory `/root/stone-2.3d-2.3.2.7'
    cc  -O -Wall -DCPP='"/usr/bin/cpp -traditional"' -DPTHREAD -DUNIX_DAEMON -DPRCTL -DSO_ORIGINAL_DST=80 -DUSE_EPOLL -DUSE_POP -DUSE_SSL  -o stone stone.c -lpthread -ldl -lssl -lcrypto
    stone.c: In function ‘saDup’:
    stone.c:1558: warning: cast from pointer to integer of different size
    stone.c: In function ‘sendPairUDPbuf’:
    stone.c:3023: warning: cast from pointer to integer of different size
    stone.c: In function ‘freePair’:
    stone.c:3644: warning: cast from pointer to integer of different size
    stone.c: In function ‘doconnect’:
    stone.c:3883: warning: cast from pointer to integer of different size
    stone.c: In function ‘acceptPair’:
    stone.c:4072: warning: cast from pointer to integer of different size
    stone.c: In function ‘strnUser’:
    stone.c:4509: error: dereferencing pointer to incomplete type
    stone.c:4524: error: dereferencing pointer to incomplete type
    stone.c:4536: error: dereferencing pointer to incomplete type
    stone.c:4551: error: dereferencing pointer to incomplete type
    stone.c:4557: error: dereferencing pointer to incomplete type
    stone.c: In function ‘proto2fdset’:
    stone.c:6239: warning: cast from pointer to integer of different size
    stone.c:6300: warning: cast from pointer to integer of different size
    stone.c: In function ‘dispatch’:
    stone.c:6916: warning: cast from pointer to integer of different size
    stone.c: In function ‘newMatch’:
    stone.c:7070: warning: cast from pointer to integer of different size
    stone.c: In function ‘freeMatch’:
    stone.c:7084: warning: cast from pointer to integer of different size
    stone.c: In function ‘sslopts_default’:
    stone.c:8875: warning: assignment discards qualifiers from pointer target type
    stone.c:8885: warning: assignment discards qualifiers from pointer target type
    stone.c: In function ‘sslopts’:
    stone.c:8971: warning: assignment discards qualifiers from pointer target type
    stone.c:8972: warning: assignment discards qualifiers from pointer target type
    stone.c:8976: warning: assignment discards qualifiers from pointer target type
    stone.c:8977: warning: assignment discards qualifiers from pointer target type
    stone.c:8981: warning: assignment discards qualifiers from pointer target type
    stone.c:8982: warning: assignment discards qualifiers from pointer target type
    stone.c: In function ‘initialize’:
    stone.c:10178: warning: cast from pointer to integer of different size
    make[3]: *** [stone] Error 1
    make[3]: Leaving directory `/root/stone-2.3d-2.3.2.7'
    make[2]: *** [linux] Error 2
    make[2]: Leaving directory `/root/stone-2.3d-2.3.2.7'
    make[1]: *** [ssl_stone] Error 2
    make[1]: Leaving directory `/root/stone-2.3d-2.3.2.7'
    make: *** [linux-ssl] Error 2
  10. 生成された実行ファイルを移動する
    mv stone /usr/local/bin/stone-2.3e
    ln -s /usr/local/bin/stone-2.3e /usr/local/bin/stone
  11. SSL用の証明書を生成する
    openssl req -new -outform pem -out stone.cert -newkey rsa:2048 -keyout stone.key -nodes -x509 -batch -days 356
    cat stone.cert stone.key > stone.pem
    mv stone.pem /etc/pki/tls/certs/stone.pem
  12. インストールに使用したパッケージを削除する
    cd ../
    rm -rf stone-*

 

使い方

 

READMEより

 

使用方法

        stone [-C <file>] [-P <command>] [-Q <options>] [-N] [-d] [-p] [-n]
              [-u <max>] [-f <n>] [-l] [-L <file>] [-a <file>] [-i <file>]
              [-X <n>] [-T <n>] [-A <n>] [-r]
              [-x <port>[,<port>][-<port>]... <xhost>... --]
              [-s <send> <expect>... --]
              [-b [<var>=<val>]... <n> <master>:<port> <backup>:<port>]
              [-B <host>:<port> <host1>:<port1>... --]
              [-I <host>]
              [-o <n>] [-g <n>] [-t <dir>] [-D] [-c <dir>]
              [-q <SSL>] [-z <SSL>]
              [-M install <name>] [-M remove <name>]
              <st> [-- <st>]...

        -C はオプションおよび <st> をコマンドラインで指定するかわりに設
        定ファイルから読み込みます。-P は設定ファイルを読み込む際のプリ
        プロセッサを指定します。プリプロセッサへ与える引数は -Q で指定で
        きます。-N を指定すると、コマンドラインおよび設定ファイルを読み
        込んだ後、終了します。つまりポートを開くこと無く設定ファイルの
        チェックを行なうことができます。

        オプションとして -d を指定すると、デバッグレベルを増加させます。
        -p を指定すると中継したデータをダンプします。-n を指定すると、ホ
        スト名やサービス名の代わりに IP アドレスやサービス番号を表示しま
        す。

        -u オプションは同時に記憶できる UDP の発信元の最大数を指定します。
        デフォルトは 100 です。-f オプションは子プロセスの数を指定します。
        デフォルトは子プロセス無しです。

        -l を指定すると、エラーメッセージ等を syslog へ出力します。-L を
        指定すると、エラーメッセージ等を file へ出力します。-a を指定す
        ると、アクセスログを file へ出力します。-i は stone のプロセス
        ID を出力するファイルを指定します。

        -X は中継を行なう際のバッファの大きさを指定します。デフォルトは
        1000 バイトです。-T を指定すると TCP セッションのタイムアウトの秒
        数を変更できます。デフォルトは 600 (10 分) です。-A を指定すると
        listen 呼び出しの未処理接続キューの最大長を変更できます。デフォル
        トは 50 です。-r を指定すると <st> のソケットに SO_REUSEADDR を設
        定します。

        -x を指定すると http proxy の接続先を制限できます。接続先のポー
        ト番号のリスト <port>[,<port>][-<port>]... および接続先ホストの
        リスト <xhost>... を指定します。-x を複数指定すると、最後に指定
        したものから順に、ポート番号のリストがマッチするものを検索します。
        -x -- を指定すると、それ以前のものは検索対象となりません。

        -b は中継先 <master>:<port> に接続できないときのバックアップとし
        て <backup>:<port> を指定します。すなわち <n> 秒ごとに
        <master>:<port> に対するヘルスチェック (後述する -s オプションで
        設定) が成功するかチェックし、もしチェックに失敗した場合は、中継
        先を <backup>:<port> へ変更します。<var> として「host」を指定す
        ることにより、<master> とは異なるホストをチェックすることができ
        ます。同様に、<var> として「port」を指定することにより、異なるポー
        トをチェックすることができます。

        -s はヘルスチェックのスクリプトを設定します。<send> を送信後、レ
        スポンスが、正規表現 <expect> にマッチするか確認します。

        -B は中継先グループの指定です。中継先が <host>:<port> である場合、
        このグループの中からランダムに一つの中継先を選んで中継します。-b
        オプションで設定済みの中継先で、ヘルスチェックに失敗したものは、
        選択枝から除外します。

        -I は中継先へ接続する際に用いるインタフェースを指定します。

        -o と -g はそれぞれユーザ ID とグループ ID を指定します。ID は数
        字のみ指定可能です。-t を指定すると、dir へ chroot します。-D を
        指定すると、stone をデーモンとして起動します。-c はコアダンプを
        行なうディレクトリを指定します。

        -M は stone を NT サービスとして登録/削除するためのオプションで
        す。サービス名 <name> を指定します。サービスとして登録した後、
        net start <name> コマンドを実行してサービスを開始させてください。
        例:
                C:\>stone -M install repeater -C C:\stone.cfg
                C:\>net start repeater

        -q および -z は、SSL 暗号化/復号 のオプションです。-q は、stone
        が SSL クライアントとして、他の SSL サーバへ接続するとき、すなわ
        ち中継先が SSL サーバの時の、SSL オプションです。-z は stone が
        SSL サーバとして、他の SSL クライアントからの接続を受付ける時の、
        SSL オプションです。

        <SSL> は SSL オプションで、次のいずれかです。

        default         SSL オプション指定をデフォルトに戻します。
                        複数の <st> を指定する際、<st> 毎に異なる SSL オ
                        プションを指定することができます。
        verbose         デバッグ用文字列をログに出力します。
        verify          SSL 接続相手に、SSL 証明書を要求します。
        verify,once     セッション開始時に一度だけ、
                        SSL クライアントに証明書を要求します。(-z 専用)
        verify,ifany    SSL クライアントから証明書が送られてきたときのみ
                        認証します。送られてこない場合は認証せずに
                        セッションを開始します。(-z 専用)
        verify,none     SSL 接続相手に SSL 証明書を要求しません。
        crl_check       CRL をチェックします。
        crl_check_all   証明書チェーンの全てにおいて CRL をチェックします。
        uniq            SSL 接続相手の SSL 証明書のシリアル番号が前回の
                        接続と異なる場合、接続を拒否します。
        re<n>=<regex>   SSL 証明書のチェーンが満たすべき正規表現を指定します。
                        <n> は depth です。re0 が証明書のサブジェクト、
                        re1 がその発行者を意味します。
                        <n> は 9 まで指定できます。
                        <n> が負の値の場合は、re-1 が root CA で、
                        re-2 がその子 CA を意味します。
        depth=<n>       SSL 証明書チェーンの長さの最大値を指定します。
                        チェーンの長さがこの値を越えると認証が失敗します。
                        <n> の最大値は 9 です。
        tls1            プロトコルとして TLSv1 を用います。
        ssl3            プロトコルとして SSLv3 を用います。
        ssl2            プロトコルとして SSLv2 を用います。
        no_tls1         プロトコルの選択枝から TLSv1 を外します。
        no_ssl3         プロトコルの選択枝から SSLv3 を外します。
        no_ssl2         プロトコルの選択枝から SSLv2 を外します。
        sni             サーバ名通知 (Server Name Indication) を行ないます。
        servername=<str>        SNI で通知するサーバ名を指定します。
        bugs            SSL の実装にバグがある接続相手との接続を可能にします。
        serverpref      SSL サーバの指定した暗号を用います (SSLv2 のみ)。
        sid_ctx=<str>   SSL セッション ID コンテキストを設定します。
        passfile=<file> 秘密鍵のパスフレーズを格納したファイルを指定します。
        passfilepat=<file>      ファイル名のパターンを指定します。
        key=<file>      証明書の秘密鍵ファイルを指定します。
        keypat=<file>           ファイル名のパターンを指定します。
        cert=<file>     証明書ファイルを指定します。
        certpat=<file>          ファイル名のパターンを指定します。
        certkey=<file>  秘密鍵付証明書ファイルを指定します。
        certkeypat=<file>       ファイル名のパターンを指定します。
        CAfile=<file>   認証局の証明書ファイルを指定します。
        CApath=<dir>    認証局の証明書があるディレクトリを指定します。
        pfx=<file>      PKCS#12 ファイルを指定します。
        pfxpat=<file>           ファイル名のパターンを指定します。
        store=<prop>    [Windows] 証明書ストア内の秘密鍵付証明書を指定。
                        "SUBJ:<substr>" あるいは "THUMB:<hex>"
        storeCA         [Windows] 証明書ストア内の認証局証明書を使用します。
        cipher=<list>   暗号化アルゴリズムのリストを指定します。
        lb<n>=<m>       SSL 証明書の CN に応じて中継先を切り替えます。
                        SSL オプションの re<n>= で指定した正規表現中、
                        <n> 番目の ( ... ) 内の正規表現にマッチした文字
                        列から算出した数値の剰余 <m> に基づいて、-B オプ
                        ションで指定した中継先グループの中から中継先を選
                        びます。

        <st> は次のいずれかです。<st> は「--」で区切ることにより、複数個
        指定できます。

        (1)     <host>:<port> <sport> [<xhost>...]
        (2)     <host>:<port> <shost>:<sport> [<xhost>...]
        (3)     proxy <sport> [<xhost>...]
        (4)     <host>:<port>/http <sport> <request> [<xhost>...]
        (5)     <host>:<port>/proxy <sport> <header> [<xhost>...]
        (6)     health <sport> [<xhost>...]

        stone を実行しているマシンのポート <sport> への接続を、他のマシ
        ン <host> のポート <port> へ中継します。インタフェースを複数持つ
        マシンでは、(2) のようにインタフェースのアドレス <shost> を指定
        することにより、特定のインタフェースへの接続のみを転送することが
        できます。<host>:<port> の代わりに、「/」ないし「./」から始まる
        パス名を指定することにより、UNIX ドメインソケットを扱うこともで
        きます。

        (3) は、http proxy です。WWW ブラウザの http proxy の設定で、
        stone を実行しているマシンおよびポート <sport> を指定します。
        「proxy」には、「/」に続けて以下の拡張子を付けることができます。

        v4only  proxy の接続先を IP アドレスに限定します。

        v6only  proxy の接続先を IPv6 アドレスに限定します。

        (4) は、http リクエストにのせて中継します。<request> は HTTP 1.0
        で規定されるリクエストです。リクエスト文字列中、「\」はエスケー
        プ文字であり、次のような置き換えが行なわれます。

                \n      改行 (0x0A)
                \r      復帰 (0x0D)
                \t      タブ (0x09)
                \\      \    (0x5C)
                \a      接続元の IP アドレス
                \A      「接続元の IP アドレス」:「ポート番号」
                \d      接続先の IP アドレス
                \D      「接続先の IP アドレス」:「ポート番号」(透過プロキシ用)
                \u      接続元のユーザID (番号)
                \U      接続元のユーザ名
                \g      接続元のグループID (番号)
                \G      接続元のグループ名
                        \u \U \g \G は UNIX ドメインソケットの場合のみ
                \0      SSL 証明書のシリアル番号
                \1 - \9 SSL オプションの re<n>= で指定した正規表現中、
                        ( ... ) 内の正規表現にマッチした文字列
                \?1<then>\:<else>\/
                        もし \1 (\2 - \9 も同様) の文字列が、空文字列で
                        なければ <then>、空文字列であれば <else>

        (5) は、http リクエストヘッダの先頭に <header> を追加して中継し
        ます。(4) と同様のエスケープを使うことができます。「/proxy」の代
        わりに「/mproxy」を指定すると、リクエストヘッダごとに <header>
        を追加します。

        (6) は、stone が正常に動作しているか検査するためのポートの指定で
        す。<sport> で指定したポートに接続して以下のコマンドを送信すると、
        stone の状態が返されます。

                HELO 任意の文字列       stone, pair, trash 等の個数
                STAT                    スレッドの個数, mutex コンフリクト回数
                FREE                    free リスト長
                CLOCK                   経過秒数
                CVS_ID                  CVS の ID
                CONFIG                  config ファイルの内容
                STONE                   各 stone の設定内容
                LIMIT <var> <n>         変数 <var> の値が <n> 未満か調べる

        <var> は次のうちのいずれかです。

                PAIR            pair の個数
                CONN            conn の個数
                ESTABLISHED     最後に接続確立してからの秒数
                READWRITE       最後に read or write してからの秒数
                ASYNC           スレッドの本数

        stone からの応答は、正常時は 200 番台、異常時は 500 番台の数値が
        先頭につきます。

        <xhost> を列挙することにより、stone へ接続可能なマシンを制限する
        ことができます。マシン名、あるいはその IP アドレスを空白で区切っ
        て指定すると、そのマシンからの接続のみを中継します。

        <xhost> には、「/」に続けて以下の拡張子を付けることができます。
        複数の拡張子を指定するときは「,」で区切ります。

        <m>     ネットワーク・マスクのビット数を指定することにより、特定
                のネットワークのマシンからの接続を許可することができます。
                例えば、クラス C のネットワーク 192.168.1.0 の場合は、
                「192.168.1.0/24」と指定します。

        v4      <xhost> を IP アドレスとして扱います。

        v6      <xhost> を IPv6 アドレスとして扱います。

        p<m>    <xhost> からの接続のみ、中継したデータをダンプします。
                <m> はダンプ方法の指定です。-p オプションの個数に相当し
                ます。

        <xhost> の代わりに「!」を指定すると、後続の <xhost> は接続を拒否
        するマシンの指定になります。

        <port> には、「/」に続けて以下の拡張子を付けることができます。
        複数の拡張子を指定するときは「,」で区切ります。

        udp     TCP を中継する代わりに、UDP を中継します。

        ssl     SSL で暗号化して中継します。

        v6      中継先へ IPv6 接続します。

        base    MIME base64 で符号化して中継します。

        <sport> には、「/」に続けて以下の拡張子を付けることができます。
        複数の拡張子を指定するときは「,」で区切ります。

        udp     TCP を中継する代わりに、UDP を中継します。

        apop    POP を APOP へ変換して中継します。
                変換には RSA Data Security 社の MD5 Message-Digest アル
                ゴリズムを使用します。

        ssl     SSL を復号して中継します。

        v6      IPv6 接続を受付けます。(1) のようにインタフェースの
                アドレス <shost> を指定しない場合は、IP 接続も受付けるこ
                とができます。

        v6only  IPv6 接続のみを受付けます。(1) のようにインタフェースの
                アドレス <shost> を指定しない場合も、IP 接続を受付けるこ
                とはありません。

        base    MIME base64 を復号して中継します。

        http    http リクエストヘッダを取り除いて中継します。

        ident   接続を受付けるときに接続元に対し ident プロトコル
                (RFC1413) を使ってユーザ名を照会します。


例
        outer: ファイアウォールの外側にあるマシン
        inner: ファイアウォールの内側にあるマシン
        fwall: ファイアウォール. このマシン上で stone を実行

        stone outer:telnet 10023
                outer へ telnet プロトコルを中継
                inner で telnet fwall 10023 を実行

        stone outer:domain/udp domain/udp
                DNS 問い合わせを outer へ中継
                inner で nslookup - fwall を実行

        stone outer:ntp/udp ntp/udp
                outer へ NTP を中継
                inner で ntpdate fwall を実行

        stone localhost:http 443/ssl
                WWW サーバを https 対応にする
                WWW ブラウザで https://fwall/ をアクセス

        stone localhost:telnet 10023/ssl
                telnet を SSL 化
                inner で SSLtelnet -z ssl fwall 10023 を実行

        stone proxy 8080
                http proxy

        stone outer:110/apop 110
                APOP に対応していないメーラで inner:pop へ接続

        fwall が http proxy (port 8080) である時:

        stone fwall:8080/http 10023 'POST http://outer:8023 HTTP/1.0'
        stone localhost:telnet 8023/http
                inner と outer でそれぞれ stone を実行
                http リクエストにのせて中継

        stone fwall:8080/proxy 9080 'Proxy-Authorization: Basic c2VuZ29rdTpoaXJvYWtp'
                proxy 認証に対応していないブラウザ用

 

HTTPSポートからHTTPポートへ転送


HTTP(80)ポートで待ち受けているときにHTTPSポートへの接続をHTTPへ転送するようstoneで行うことで、HTTPSを使用することができる。

stone localhost:80 443/ssl &

 

HTTPSプロキシとして動作させる


自ホストのHTTPSポートを別のホストで稼動しているHTTPポートへ転送する。

stone X.X.X.X:80 443/ssl &

 

SSLトンネルを生成する


他のアプリケーションの通信を透過的にSSLトンネル経由とさせる


Notice: Trying to get property 'queue' of non-object in /usr/local/wordpress/wp-includes/script-loader.php on line 2876

Warning: Invalid argument supplied for foreach() in /usr/local/wordpress/wp-includes/script-loader.php on line 2876