中継を設定するための「石」は, 図 9 で示したいずれかの形式で定義します。 「石」は「--」で区切ることにより, 複数個指定できます。
(1) あて先ホスト:あて先ポート 受けポート 接続許可リスト (2) ディスプレイ番号 接続許可リスト (3) proxy 受けポート 接続許可リスト (4) あて先ホスト:ポート/http 受けポート リクエスト 接続許可リスト (5) あて先ホスト:ポート/proxy 受けポート リクエスト・ヘッダー 接続許可リスト |
図 9 中継の設定形式 |
図 9 の(1)は基本型で, 「受けポート」への接続を「あて先ホスト」の「あて先ポート」へ中継します。 IP アドレスを複数持つホストでは, 「受けポート」の前に特定のアドレス「受けホスト:」を追加することにより, 「受けホスト」への接続のみを転送できます。
例えば 図 10 のように実行すると, localhost のポート 10023 番への接続のみを中継します。 ループバック・インターフェース(ホスト名 localhost,デバイス名 lo)は, そのホスト自身からのみアクセスできますから, その他のホストからアクセスできなくなります。
stone takatsu:telnet localhost:10023 & |
図 10 特定のインタフェースに届いたパケットのみ中継 |
(2)は, X プロトコル中継のための省略記法です。 「ディスプレイ番号」への接続を, 環境変数 DISPLAY で指定した X サーバーに中継します。
(3)は, stone を簡易 http プロキシとして使う場合の設定です。 普通の http プロキシに比べると,
などの機能上の制約があります。 機能は限定されていますが, ファイアウオールの外側から内側の LAN 上の Web サーバーを参照する といったように, 対象が限定されていて, 本格的な http プロキシだと役不足な場合であれば, stone を使うという選択も有り得ると思います。
(4)は, http リクエストに乗せてパケットを中継します。 ファイアウオール上で stone を走らせることができない場合でも, ファイアウオールの内側と外側で通信できるようになります。 これについは後述します。
(5)は http パケットを中継する際, 指定したリクエスト・ヘッダを追加して転送します。 fwall のポート 8080 番で http プロキシが走っていたとすると, 例えば localhost で 図 11 のように実行した上で, localhost で Web ブラウザを立ち上げ, http プロキシとして localhost の 9080 番を指定します。 これにより, Web ブラウザが送信するリクエスト・ヘッダーに 図 12 の文字列を挿入した上で, fwall 上の http プロキシへ転送します。 「Proxy-Authorization:」は, 認証を必要とする http プロキシを使う場合に必要なフィールドです。 「c2VuZ29rdTpoaXJvYWtp」はユーザー ID とパスワードを「:」でつないだ文字列 「sengoku:hiroaki」*12 を MIME base64 で符号化して作った文字列です*13。 Web ブラウザ側に「Proxy-Authorization:」フィールドを送信する機能がない場合は, stone 経由で http プロキシへアクセスすることにより, パスワードを入力することなく http プロキシを利用できます。
stone fwall:8080/proxy localhost:9080 'Proxy-Authorization: Basicc2VuZ29rdTpoaXJvYWtp' & |
図 11 リクエスト・ヘッダを追加して転送する場合の実行例 |
Proxy-Authorization: Basicc2VuZ29rdTpoaXJvYWtp |
図 12 これが挿入される |
(1)において, 「受ポート」に「/udp」を付けると, TCP パケットを中継する代わりに, UDP パケットを中継します。
また, (1)において, 「あて先ポート」に「/apop」を付けると, POP を APOP に変換して中継します。 例えば APOP のみを受け付ける POP サーバー mx.gcd.org に対して, APOP に対応していない MUA(メール・ユーザー・エージェント) からアクセスしたい場合, MUA を走らせるホスト上で, 図 13 のように stone を実行しておきます。 すると MUA の設定で POP サーバーを localhost に設定すれば, mx.gcd.org に届いたメールを読むことができます。
stone mx.gcd.org:pop/apop localhost:pop & |
図 13 POP を APOP へ変換しつつ中継 |
(1),(3),(4),(5)の形式において, 「あて先ポート」に「/base」を付けると, パケットを MIME base64 で符号化して中継します。 同様に「受けポート」に「/base」を付けると, MIME base64 で復号化して中継します。 base64 はその名の通りアルファベットなど 64 文字しか用いない符号化ですから, 8 ビット・キャラクタすべては通さない通信路を利用することが可能になります。
また, (1),(3),(4),(5)において, 「あて先ポート」に「/ssl」を付けると, パケットを SSL(セキュア・ソケット・レイヤー)で暗号化して中継し, 「受けポート」に「/ssl」を付けると, SSL で復号化して中継します。 SSL については次号「stone(後編)」で解説する予定です。
大企業のファイアウオールなどだと, 一般ユーザーはファイアウオール上にアカウントをもらえないことが多く, 自由に stone を走らせることができない場合がほとんどだと思います。 そんな方のために, stone には http プロキシを経由してパケットを転送する機能もあります (図 14)。
図 14 http プロキシを経由してパケットを転送できる |
ほとんどの http プロキシは, https プロトコルを中継するために,
CONNECT outer:443 HTTP/1.0 (改行) (改行) (改行) は,0x0D 0x0A の 2 byte |
を送ると,
HTTP/1.0 200 OK (改行) (改行) |
などのレスポンスを返した後, ホスト「outer」のポート 443 番(https)に接続してくれます。 本来の用途では, この後 SSL による暗号通信を開始するのですが, 他のプロトコルを流すことも可能です。
つまり,
(1) | http プロキシに対して, 「CONNECT outer:443 HTTP/1.0(改行)(改行)」 を送信 |
(2) | http プロキシが返信したレスポンスを無視 |
(1') | outer のポート 443 番へアクセスが来たら, それを目的のホスト・ポートへ転送 |
という手続きを踏めば, 後は inner と outer の間で自由に通信ができます。 この手続きは, stone の「あて先ポート」に「/http」を付けることにより実現できます。
例えば, http プロキシがファイアウオール fwall のポート 8080 番で走っている場合, inner で 図 15 を実行し, outer で 図 16 を実行しておけば, inner のポート 10023 番が outer の telnet のポートに中継されます。
stone fwall:8080/http 10023 'CONNECTouter:443HTTP/1.0' & |
図 15 httpプロキシを経由してパケットを転送する機能の実行例 |
http プロキシの内側にある inner で実行する。 |
stone localhost:telnet 443 & |
図 16 httpプロキシの外側のホストouterでは以下を実行する |
(ライターから)
本稿は日経Linux 2000 年 8 月号に掲載された、 実践で学ぶ、一歩進んだサーバ構築・運用術, 第 5 回「stone (前編)」を日経BP 社の許可を得て転載したものです。
Copyright(C)2000 by 仙石浩明 <sengoku@gcd.org>
無断転載を禁じます