PR

DeleGate の設定(リバースプロキシ)

設定をはじめる前に、サーバーが上図のように稼働していることを前提とする。

前提としたサーバーの構築は「DeleGate を設定する前の準備」を参照。

その状態にDelGate をカマせて正しくアクセスできるか、というのが今回の内容。

閲覧者からはDeleGate が唯一のサーバーとしか見えないが、実際は2つのサーバーがバックエンドで動作している。これはリバースプロキシとしてDeleGate を動作させているためで、1つのグローバルIP アドレスしかなくても、複数のドメインを構築できるメリットがある。

一般的には1つのサーバーで複数のドメインを利用する場合は「バーチャルホスト」を使うが、リバースプロキシを使うことで、そのサーバーの処理能力を超えてしまう場合や、アドレス内の任意のディレクトリや任意のドメインを任意のバックエンドサーバーに割り振ることができる。

負荷分散だけでなく、動的処理を行うサーバーと静的ファイルを保管するサーバー、あるいはOS を選ぶシステムなどを混在しても1つのドメインとして動作させることもできる。

スポンサードリンク

動作確認

閲覧者をエミュレートした端末(192.168.1.105)のhosts ファイルを書き換え、テスト用の3つのドメインのアドレスをDeleGate (192.168.1.17)を参照させたところ、すべてのアドレスについて正しく表示できた。

※記事の都合上、動作確認を先に書きました

設定例

今回は次のように設定した。

SERVER="http"
CACHE="no"
MOUNT="/* http://www.example.com/* nvhost=www.example.com,rserv=192.168.1.15"
MOUNT="/* http://dummy-host.example.com/* nvhost=dummy-host.example.com,rserv=192.168.1.14"
MOUNT="/* http://dummy-host2.example.com/* nvhost=dummy-host2.example.com,rserv=192.168.1.14"
RELIABLE="*"
RELAY=no
CONNECT="d:*:*:*"
RESOLV="/etc/hosts,dns"
LOGFILE=""
MOUNT="/-/ = rcode=404"
MOUNT="/* = rcode=404 host=192.168.1.17"
HTTPCONF="add-qhead:X-Forwarded-For:%a"
DGSIGN=""

nvhost

→ 以下のメモを参照

rserv

→ 以下のメモを参照

CACHE

キャッシュさせることで負荷分散などを行えるが、今回はテストのためキャッシュしないように設定している。

MOUNT

http://www.example.com/* にアクセスがあった場合、192.168.1.15 というサーバーに対してHost:www.example.com を使ってアクセスせよ。というような内用が記載されている。書き方を変えれば任意のディレクトリに対してのアクセスを別のマシンに割り振ることなどもできる(たぶん)。

RELIABLE

RELIABLE=”*” は、誰がアクセスしても良いというもの。

RELAY

幾つかの動作があるが、RELAY=no はプロキシとして動作しないという記述。リバースプロキシとしては動作している(たぶん)が、公開プロキシにしないためだとか解説されていた気がする。

CONNECT

CONNECT=”d:*:*:*” は、まずダイレクトにアクセスせよという内容。これは先にキャッシュを見て、無ければサーバーに取りに行けという指示ができる。

RESOLV

RESOLV=”/etc/hosts,dns” は、まずhosts を見に行き、無ければdns に問い合わせよという内容。記述のしかた間違っているかも。

LOGFILE

LOGFILE=”” は、ログしないというもの。

HTTPCONF

様々な設定ができるが、HTTPCONF=”add-qhead:X-Forwarded-For:%a” DGSIGN=”” は転送先サーバー(バックアップサーバ)でアクセス解析を行うような場合、アクセス元がDeleGate になってしまうため、環境変数X-Forwarded-For を取得して処理することで本来の作業を可能にするもの。

リバースプロキシはしばしばレンタルサーバーでも用いられるため、一部のサーバーでは一般的な利用に際してもこの環境変数を参照する必要があるものもあるらしい。

MOUNT=”/-/ = rcode=404″

MOUNT=”/* = rcode=404″ はDeleGate に対して要求があった時に404 ステータス・コードを返却せよというものらしいが、期待した動作をしなかったので MOUNT=”/* = rcode=404 host=192.168.1.17″ とした。

設定していない時。

設定した時。

エラーとセキュリティー

何か問題があると、どういうわけかいろいろな情報を訪問者に与えてしまう。

Proxy HTTP Server DeleGate/x.x.x (x x, x) by Yutaka Sato (National Institute of Advanced Industrial Science and Technology) @_@V

設定を変更(DGSIGN=””)することで、上記のようにバージョン情報を出さないようにすることができる・・・のだが、ページごと書き換えたほうが良いかもしれない。

メモ

仮想ホスティング

仮想ホスティングを容易にする nvhost オプションを導入  DeleGate自身が、名前ベースの仮想ホスティングを行なう場合、従来は  vhost=-host のように、”-” をホスト名に前置することで、ホストの名前  だけの一致検査を強制するようにしていましたが、今回、名前ベースの  仮想ホスティングを明示するオプションとして、上の例でも出てきましたように、  nvhost=host というオプションを導入しました。nvhost では、”-” を前置  する必要はありません。  また、もともと仮想ホスト名としての一致検査だけに使われるので、IPアドレス  のリゾルブも試行されず、アドレスがない場合にもログに警告が出るこはなく、  起動時に構成エラーを解消を試みるための自動再起動も行なわれません(「Article delegate/14045 (08Jul07) DeleGate/9.8.2-pre46 — MOUNTing virtual hosting servers」より引用)

仮想ホスティングを正しく設定すると、以下のようなエラーが表示されない。

30:39.943 [6818] inets._.c:622 --E unknown gethostname(dummy-host2.example.com)

侵入者

テスト中に以下のように表示された。

Services for your host[192.168.1.105] are suspended now on a suspicion of intruder

Google 翻訳によれば「ホスト[192.168.1.105]のサービスは、侵入者の疑いで現在中断されます」とのこと・・・。

# cat /home/delegate/adm/shutout/192.168.1.105

としてファイルを確認したところ、以下のようになっていた。

To administrator:
  Remove this file to restart the service for "192.168.1.105"
This file was created on a fatal error detected in DeleGate,
which COULD BE the result of an ATTACK from the host.
More likely, it can be a usual bug in DeleGate.
See LOGDIR/abort/80, and consult with the author if necessary.
(You can specify the varidity of shutout like TIMEOUT=shutout:60s)
--
06/11 19:36:13: [29566] reason=SIGSEGV src=192.168.1.105 dst=**.***.44.111
06/11 19:36:13: [29566] SERVER=http
06/11 19:36:13: [29566] SERVER=http://**.**.com:80

次のようにファイルを削除したところ、ロックの解除ができた。

# rm /home/delegate/adm/shutout/192.168.1.105

参考文献

コメント