ミニCDNのような物を作りたいと思います。


サービスがA国とB国ユーザーが対象で、それぞれの国にServerがあります。

最初は、リバースプロキシーとmod_proxy_balancerモジュールで出来るのでは無いかと思っていたのですが

A mod_proxy_balancerにアクセス元IPにより振り分ける先を指定するようなことができるのか?
B Aが可能だとしても、通信がA国内のbalancer → B国内のリバースプロキシーServer → A国内へのレスポンス となり無意味(改悪)なのではないか?

という疑問が出てきました。

上記疑問と、解決策を教えて下さい。

やりたいことは A国内からのアクセスについてはA国内のServerが B国内からのアクセスについてはB国内のServerが それぞれ応答するという物です。

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2014/07/11 23:29:17
  • 終了:2014/07/18 23:30:05

回答(2件)

id:JULY No.1

JULY回答回数966ベストアンサー獲得回数2472014/07/12 08:35:44

ポイント100pt

そもそも、リバースプロキシだと、クライアントが接続する Web サーバはリバースプロキシとなるサーバであって、mod_proxy_balancer を使うと、リバースプロキシの裏に隠れた複数の Web サーバでバランスを取ることができるだけで、クライアントから見た接続は、リバースプロキシであることに違いありません。

クライアント ── リバースプロキシ
            ├ ── Web サーバ A
            └─── Web サーバ B

クライアントが Web サーバ A や Web サーバと、直接接続する事はありません。

もし、自前で用意した DNS サーバがあるなら、DNS の応答で振り分ける手はあります。

UNIX 系 OS で一般的な DNS サーバである BIND の機能で、問い合わせ元の IP アドレスで答えを変える「view」という機能が古くからあります。

実用 BIND 9で作るDNSサーバ(13):次世代のセキュリティ拡張DNSSECをBIND 9で実現 (3/3) - @IT

A 国用の view、B 国用の view、その他の view と作っておけば、同じ URL で、ソースアドレス毎に別のサーバへ誘導できます。

ただ、条件があって、

  • ドメイン名が自分の物である(借り物ではない)。
  • そのドメイン名の権威サーバとなるすべての DNS サーバが、自分で用意した DNS サーバである。

という必要があります。前者は当然として、後者に関してありがちなのは、マスターとなる DNS サーバは自分で用意した DNS サーバであっても、スレーブになる DNS サーバが、ISP のサービスを使っている、という事が多いと思います。この場合、スレーブ側の DNS サーバに問い合わせが行くと、当然、ISP 側の DNS サーバで、こっちの都合と同じ view が切られている訳ではないので、「ソースアドレス毎に」とはなりません。

その他に、view を使っている時のマスターからスレーブへのゾーン転送の問題とか、気をつける点は他にもありますが、環境が用意できれば、できない話ではないと思います。

id:kichitaka

ありがとうございます。なるほどDNSの時点で振り分けを変える訳ですね。
マスター、スレーブはともかくキャッシュなどで多少思い通りにならないのが欠点でしょうか。ありがとうございます!

2014/07/12 19:29:00
id:snow0214 No.2

snow0214回答回数470ベストアンサー獲得回数1162014/07/12 13:00:32

ポイント100pt

質問のケースだとプロキシを設置するより、A国サーバがドメインにリンクしているとして、B国からA国サーバへのアクセスをB国サーバへリダイレクトする方がオーバーヘッドが少ないでしょう。

mod_rewrite を使って下のように書きます。

下のxxx.xxx.xxx.xxxにB国のアクセス元IPのリストを指定してください(正規表現指定可能)。

RewriteEngine On
RewriteCond %{REMOTE_ADDR} !xxx\.xxx\.xxx\.xxx [OR]
RewriteCond %{REMOTE_ADDR} !xxx\.xxx\.xxx\.xxx [OR]
・
・
・
RewriteCond %{REMOTE_ADDR} !xxx\.xxx\.xxx\.xxx [L]
RewriteRule ^/(.*) http://B国サーバのIP/$1 [L]

.htaccessで特定のIPアドレス以外からアクセスされたらリライトして表示する

http://webrl.amrde.com/htaccess/htaccess-rewrite.html

id:kichitaka

なるほど。rewriteを使う方法もあるのですね。

ただ、すこし飲み込めない部分も有り(私の知識不足です)補足頂けると幸いです。

>>RewriteRule ^/(.*) http://B国サーバのIP/$1 [L]

上記なのですが、こちら、実際のパケットは

フロント(上記設定があるServer)がA国
ユーザーB国
rewrite先B国

だとして、実際のバケットはB国内Serverから直接B国内ユーザーへ飛ぶものでしょうか?

また、

>>A国サーバがドメインにリンク

とはどのような意味でしょうか?

是非、教えて頂けると嬉しく思います。

ps
上記が可能なのであれば、例えば勝手にyahooをrewriteかけて自分のドメイン下にyahooがあるようにみせることも可能なんでしょうかね?無意味ですが。

2014/07/12 19:37:07
id:snow0214

> 実際のバケットはB国内Serverから直接B国内ユーザーへ飛ぶものでしょうか?
いったんA国サーバを経由します。
リクエストとリターンの流れは次のようになります。

A国サーバが持つドメインが hoge.com とします。

A国クライアント→リクエスト http://hoge.com/ →A国サーバ→A国サーバがリターン
B国クライアント→リクエストhttp://hoge.com/ →A国サーバ mod_rewrite→B国サーバへ転送→B国サーバがリターン

>例えば勝手にyahooをrewriteかけて自分のドメイン下にyahooがあるようにみせることも可能なんでしょうかね?
そのドメインに対するリクエストを返すサーバにrewriteルールが書いてなければできません。yahoo.comの中を書き換えるわけにはいかないので、できません。

これを行うには、No.1の回答にあるようにDNSの改ざんを行う必要があります。

2014/07/12 20:03:17

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません