DeleGateを使ってLAN内部のサーバを公開する方法

作成日:2002.11.17

DeleGate は産業技術総合研究所の佐藤豊さんが開発している多機能ゲートウェイ/プロキシサーバである。

多機能という中には以下のような機能がある。
 ・プロトコル中継、・プロトコル変換、・キャッシュ、・マウント、・コード変換
 ・経路制御、・アクセス制御、・トンネル 等々
プログラムはマルチプラットフォーム対応であり、Unix、Windows、OS/2 で動作する。

詳細な説明、設定方法などは例えば以下を参考に。
 http://www.delegate.org/delegate/tutorial/tutorial-jp.html
 http://www.delegate.org/delegate/howto/startup/
 http://i-red.info/docs/Manual.htm
 http://i-red.info/docs/JF/delegate-mini-howto-config.html

ここでは豊富な機能の説明をするわけではない。AN HTTPDではどうしても実現することができない複数サーバの「リバースプロキシ」機能の設定方法だけを説明する。
  1. 下記URLからDeleGateの最新版プログラムをダウンロードする。
     http://www.delegate.org/anonftp/DeleGate/bin/windows/
    ユーザ名/パスワードの問い合わせには anonymous/メールアドレスを入力する。

    2003/2下旬 現在、8.4.0(以下で 8_x_x の個所は 8_4_0 と読み替えること) が最新版である。
    ディレクトリ latest の中に常に最新版が置いてある。
    delegate.zip と dg8_x_x.zip は同じものであり、どちらかをダウンロードする。
    後でバージョン管理し易いように dg8_x_x.zip の方がいいであろう。

  2. ダウンロードした dg8_x_x.zip(あるいは delegate.zip)を例えば
    C:\Program Files\delegate に解凍する。

  3. C:\Program Files\delegate に delegate.batファイルを作成する(内容は以下の1行のみ)
    	dg8_x_x.exe +=delegate.cfg
  4. C:\Program Files\delegate に delegate.cfgファイルを作成する(以下は設定例)
    (注)「#」以下行末まではコメントである
    -- (この下の行から) ---------------------------------------------------
    -P80
    SERVER=http
    MOUNT="/* http://192.168.0.3/*        vhost=-aaa.domain.jp" #http://aaa.domain.jp/ -> http://192.168.0.3/
    REACHABLE=192.168.0.3 #このホスト以外には proxyアクセスできない。公開proxyにならないため必須
    MOUNT="/* http://192.168.0.4/*        vhost=-bbb.domain.jp" #http://aaa.domain.jp/-> http://192.168.0.4/
    REACHABLE=192.168.0.4
    #MOUNT="/* http://192.168.0.3/hoge1/* vhost=-aaa.domain.jp" #http://aaa.domain.jp/ -> http://192.168.0.3/hoge1/
    #REACHABLE=192.168.0.3
    #MOUNT="/hoge2/* http://192.168.0.3/* vhost=-aaa.domain.jp" #http://aaa.domain.jp/hoge2/ -> http://192.168.0.3/
    #REACHABLE=192.168.0.3
    #MOUNT="/* http://192.168.0.3:8000/*  vhost=-aaa.domain.jp" #http://aaa.domain.jp/ -> http://192.168.0.3:8000/
    #REACHABLE=192.168.0.3
    RELIABLE="*"                                           #全てのホストからのアクセスを許すので用途によっては要注意
    #RELIABLE="192.168.0.[0-255],*.domain.jp"              #特定のホスト/ドメインからのみアクセスを許可する
    ADMIN=user@host.domain.jp
    -- (この上の行まで) ---------------------------------------------------
  5. 具体的設定例
    下図は、DeleGateが動くPC1とAN HTTPDが動くPC2/PC3が別のPCのケースである。
    ルータでポート80は DeleGate が動く PC1にフォワードする。
                     Internet
                        │
                    ┏━┻━┓
                    ┃Router┃
                    ┃      ┃
        192.168.0.2 ┗┳┳┳┛ 192.168.0.4
          ┌─────┘│└─────┐
          │            │192.168.0.3 │
    ┏━━┻━━┓┏━━┻━━┓┏━━┻━━┓
    ┃   PC1    ┃┃   PC2    ┃┃   PC3    ┃
    ┃ DeleGate ┃┃ AnHttpd  ┃┃ AnHttpd  ┃
    ┗━━━━━┛┗━━━━━┛┗━━━━━┛
      │  │              ↑            ↑
      │  │  http://aaa.domain.jp/     │
      │  │              │   http://bbb.domain.jp/
      │  └───────┘            ↑
      │                                │
      └────────────────┘

    delegate.cfgファイル
    -- (この下の行から) -------------------------------
    -P80
    SERVER=http
    MOUNT="/* http://192.168.0.3/* vhost=-aaa.domain.jp"
    REACHABLE=192.168.0.3
    MOUNT="/* http://192.168.0.4/* vhost=-bbb.domain.jp"
    REACHABLE=192.168.0.4
    RELIABLE="*"
    ADMIN=user@host.domain.jp
    -- (この上の行まで) -------------------------------

    一方、こちらは AN HTTPD と DeleGate が同じ PC1 で動くケース。
                       Internet
                          │
                      ┏━┻━┓
                      ┃Router┃
                      ┃      ┃
          192.168.0.2 ┗┳━┳┛ 192.168.0.3
                ┌───┘  └───┐
        ┏━━━┻━━┓      ┏━━┻━━━┓
        ┃     PC1    ┃      ┃    PC2     ┃
        ┃  AnHttpd   ┃      ┃            ┃
        ┃  DeleGate  ┃      ┃  AnHttpd   ┃
        ┗━━━━━━┛      ┗━━━━━━┛
          ││      ↑              ↑
          ││http://aaa.domain.jp/ │
          ││      │         http://bbb.domain.jp/
          │└───┘              ↑
          │                        │
          └────────────┘

    delegate.cfgファイル
    -- (この下の行から) ------------------------------------
    -P80
    SERVER=http
    MOUNT="/* http://192.168.0.2:8000/* vhost=-aaa.domain.jp"
    REACHABLE=192.168.0.2
    MOUNT="/* http://192.168.0.3/*      vhost=-bbb.domain.jp"
    REACHABLE=192.168.0.3
    RELIABLE="*"
    ADMIN=user@host.domain.jp
    -- (この上の行まで) ------------------------------------
    このケースではポート80番をDeleGateが使うので、PC1のAN HTTPDは80以外のポート(例えば8000)で動作させる。
    内部でポートが8000であることは表には出ないので分からない。

    (注) MOUNT先がバーチャルサーバ時の誤動作対応仕様の追加(8.6.6以降)。
    http://www.delegate.org/mail-lists/delegate/11978
     MOUNT="/* http://-hostname/* vhost=-vhostname"

  6. カレントディレクトリを C:\Program Files\delegate にしてコマンドプロンプトから delegate.bat を実行。

    NT系のOS(WinNT/2000/XP)では DeleGate Server -P80 がサービスとして実行される。
    バッチファイル(delegate.bat)を実行するといくつかの y/n の問い合わせがあるが、通常はデフォルトのままでよい。
    delegate.cfgを変更したときには、再度delegate.batを実行する。
    DeleGateを終了するときは delegate.bat を実行し、「Create a new service ?」で n とする。
    --------------------------------------------------------------------------------
    The service `DeleGate Server -P80' exists.  Delete it ? [y] / n : y
    Create a new service ? [y] / n : n
    --------------------------------------------------------------------------------
    Win9x系ではサービスではなく MS-DOSプロンプトで実行されるので、Ctrl+C で終了する。

  7. リンク
    DeleGateメーリングリスト

  8. 追記
    鷹の巣さんの自宅サーバ掲示板Delegateに関する質問があったときに、筆者が回答した内容も参考になると思います。質問者はこの後、リバースプロキシとバーチャルホストを組み合わせたいと言うので、ポートを変える方法とIPアドレスを変える方法の 2つの方法をメールで教えました。具体的な方法については質問者のページのまとめにあるのでそちらを参考にしてください。

  9. X-Forwarded-For
    リバースプロキシにすると Webサーバから見たクライアントが、本来のアクセス元のホストではなくプロキシサーバに置き換わってしまうという現象が起きます。その結果、例えば掲示板CGIでアクセス元の IPアドレスを記録していると、それがプロキシサーバの IPアドレスになってしまい、全く意味がなくなってしまいます。

    これを解決するにために以下のような対策をします。
    1. DeleGateの設定(cfg)に以下の 1行を追加する
      HTTPCONF="add-qhead:X-Forwarded-For:%a"
     これによって DeleGateから Webサーバに X-Forwarded-For ヘッダが追加され、アクセス元の IPアドレスが通知されるようになります。

    2. 掲示板CGIにおいて環境変数 HTTP_X_FORWARDED_FOR を見る
     X-Forwarded-For ヘッダがあると Webサーバはそれを環境変数 HTTP_X_FORWARDED_FOR に設定します。掲示板CGIの中ではアクセス元の IPアドレスを $ENV{'REMOTE_ADDR'} で求めているはずなので、その個所を探し、それを $ENV{'HTTP_X_FORWARDED_FOR'} に書き換えます。これでリバースプロキシではなく本来のアクセス元ホストの IPアドレスが記録されるようになります。



作成:いと,mailto:gfh05223@nifty.com