実践で学ぶ、一歩進んだサーバ構築・運用術

第 5 回 stone (前編)


stone の引数の書式

stone の引数の書式をまとめます。 基本となる書式は, 以下の通りです。


stone オプション 石 [ -- 石] &

([ ] 内は0回以上繰り返し可能)

「石」は中継の設定です。 「--」で区切ることにより複数設定できます。 例えば, telnet と X プロトコルの両方の中継を行いたい場合は, 図 6 のように実行します。


stone inner:23 10023 -- inner:6000 6001 outer &
図 6 telnet と X プロトコルの両方の中継を行う場合の実行例

以下, オプションについて個別に説明します(表 1 参照)。

表 1 stone のオプションとその役割
オプション役割
-dデバッグ・レベルを増加
-nホスト名やサービス名の代わりに,IP アドレスやサービス番号を表示
-u 数値同時に記憶できる UDP パケットの発信元の最大数の設定
-f 数値子プロセスの数を設定
-a ファイル名アクセス・ログの出力先の指定
-L ファイル名エラー・ログの出力先の指定
-lエラー・メッセージなどを syslog へ出力(デフォルトは標準出力)
-o 数値stone を実行するユーザー ID の指定
-g 数値stone を実行するグループ ID の指定
-t ディレクトリchroot するディレクトリの指定
-z SSLオプション次号「stone(後編)」で解説予定
-C ファイル名設定ファイルの読み込み
-P コマンド名設定ファイルを読み込むときのプリプロセッサの指定

-d オプション

-d オプションを指定すると, stone はデバッグ情報を出力します。 -d を複数指定すればより詳細なデバッグ情報を出力できます。

-n オプション

-n オプションを指定すると, stone が出力するアクセス・ログ,エラー・ログやデバッグ・ログにおいて, ホスト名やサービス名の代わりに IP アドレスやサービス番号を表示します。 例えば 図 2 で示した用例で -n オプションを追加すると, 図 7 のように表示されます。


% stone -n takatsu:23 10023 &
May 29 23:55:15 start (2.1) [22287]
May 29 23:55:15 stone 3: 192.168.1.7:23 <- 10023

図 7 -n オプションを追加して実行した例

ホスト名の代わりに IP アドレスが, サービス名の代わりにポート番号が表示される。

-u オプション

-u オプションは, 同時に記憶できる UDP パケットの発信元の最大数の設定します。

UDP 上の大抵のプロトコルでは, パケットを受け取ったホストが発信元のホスト・ポートに対して 「返事」パケットを送り返します。 したがって往路のパケットを stone で中継した場合, パケットを受け取ったホストは, stone に対して返事を送信してきます。 したがって stone は これを元の発信元ホスト・ポートへ送り返さなければならないわけです。 そのため stone は, 返事パケットが返ってくるまで, 発信元ホスト・ポートを記憶しています。

ところが, プロトコルによっては返事パケットが返ってくるまでに時間がかかるものや, そもそも返事を返さないプロトコルもあります。 UDP なのでパケットが届かないこともあります。 返事が返ってくるまで発信元を記憶し続けていると, stone が消費するメモリー領域がどんどん膨らむ恐れがあります。 そこでデフォルトでは記憶する発信元ホスト・ポートの数を10個に制限して, 返事がないものについては発信元を次々と忘れるようにしています。

大抵の場合, 返事は速やかに返ってくるので, 個人的な中継*11 であれば 10 個程度で十分と思われます。 しかし, 返事が返ってくるまで時間がかかるプロトコルの場合や, 多人数で stone を利用する場合は, -u オプションを指定して記憶する送信ホストの数を増やす必要があります。

-f オプション

stone のデフォルトの設定では, 多数の中継を行う場合でも, 単一プロセスとして動作します。 これは stone を実行するホストに対する影響を最小限にする, という配慮からなのですが, 多人数で stone を利用する場合は単一プロセスだと, ソケット数の上限に達してしまったり, 処理が追い付かない場合があるかも知れません。 このような問題が生じたときは, -f オプションを使って複数プロセスで動作させてください。

-a, -L, -l オプション

stone はデフォルトでは, すべてのログを標準出力に出します。 -l オプションを指定すると, syslog に出力します。 stone をデーモンとして動かすときは, -l オプションを指定した方が良いでしょう。 -a, -L を指定すると, それぞれアクセス・ログ,エラー・ログを指定したファイルに出力します。

-o, -g, -t オプション

root 特権が必要なポート, すなわち 1023 番以下のポートを中継する場合は, stone を root 権限で実行する必要があります。 ただし, いったんポートを開いてしまえば, root 権限は必要ありません。 そこで,-o,-g オプションを使って, stone を実行するユーザー/グループ ID を変更すると良いでしょう。 万一 stone のセキュリティ・ホール (現時点ではセキュリティ・ホールの存在は確認されていません) を突く攻撃を受けても, 権限のないユーザーIDで実行されていれば, 安心です。

さらに, -t オプションを使って stone を実行するルート・ディレクトリを変更すれば, 被害をそのディレクトリ(犠牲パーティション)に限定できるので, より一層安心です。

-C, -P オプション

stone はすべての設定をコマンド・ラインで指定できますが, 多数のオプションや「石」をコマンド・ラインから指定するのは面倒かも知れません。 そこで設定ファイルにオプションと「石」を書いておき, -C オプションで stone に読み込ませられるようになっています。 設定ファイルの書式はコマンド・ラインと同じです。 設定ファイル中の改行は無視されるので, 適当な場所に改行を入れて読みやすくできます。

コンパイル時に設定していれば, stone はプリプロセッサ(cppなど)を通してから設定ファイルを読み込みます。 したがって, #define などでマクロを設定して使うことができます。 表 2 に示したマクロは自動的に設定されます。

表 2 自動的に設定されるマクロ
マクロ内容
HOSTホスト名
HOST_ホスト名1
HOMEホーム・ディレクトリ

コンパイル時に設定したプリプロセッサと異なるプリプロセッサを用いる場合は, -P オプションを利用してください。

設定ファイルの例を 図 8 に示します。 この例では, ホスト名が asao.gcd.org である時のみ, マクロ「HOST_asao_gcd_org」が定義されるので, 「#ifdef ... #endif」部分の指定が有効になります。


#ifdef HOST_asao_gcd_org
-l -dd
-f 2
-o 99 -g 99

takatsu.gcd.org:telnet  1023    outer1  outer2                    --
takatsu.gcd.org:6000    6001    210.145.125.160/255.255.255.192   --
#endif

図 8 設定ファイルの例

ホスト名が asao.gcd.org である時のみ, 「#ifdef ... #endif」部分の指定が有効になる。

この設定ファイルを, 例えば /etc/rc.d/stone というファイル名で保存しておいて,


stone -C /etc/rc.d/stone &

などと実行します。

*11
元々 stone は個人的な中継を目的に開発されました。 ファイアウオールの管理者の手を煩わすことなく, 1 ユーザーがファイアウオール越えを手軽に実現できるようにすることを 第一の目的としています。 もちろん現在のバージョンでは多人数での使用も考慮されているわけですが, -u オプションのデフォルトが 10 であり, また -f オプションのデフォルトが 0 であるあたりに, 元々の目的の痕跡が残っています。

(「石」の設定方法)


banner 本稿は日経Linux 2000 年 8 月号に掲載された、 実践で学ぶ、一歩進んだサーバ構築・運用術, 第 5 回「stone (前編)」を日経BP 社の許可を得て転載したものです。

Copyright(C)2000 by 仙石浩明 <sengoku@gcd.org>
無断転載を禁じます

| home | up |

sengoku@gcd.org