LVS(DSR) & IP alias & IP-based virtualhost
ではまったのでメモ。
状況はこんなかんじ
V-IP1 V-IP2 | | | | +-+--------+-+ | | LVS | | +-+--------+-+ | | R-IP1 | | R-IP2(IP alias) | | +-+--------+-+ | | Apache | | | | | | | S1 S2 | +-+--------+-+
(ここでは思いっきり単純化してますが…)
- DSRでパケット投げっぱなしのLVSがいて、サービス用のIP(V-IP1, V-IP2)でListenしている
- その下にはIPエイリアスしているWebサーバー(Apache)がいて、R-IP1, R-IP2でListenしている
- V-IP1にきたリクエストはR-IP1に、V-IP2にきたやつはR-IP2に振り分けている
- Webサーバーは自分に飛んできたV-IP1, V-IP2宛のパケットをiptables REDIRECTで自身にリダイレクトしている
- ApacheはIPベースのVirtualHostしてて、V-IP2(調査のため念のためR-IP2も)にきたやつはS2に、それ以外(_default_)はS1のディレクトリに振っている
という状況で、V-IP2宛にリクエストを飛ばすと、S1に行きついてしまうのであった。
で、いろいろ試していたら、Webサーバー側でV-IP2宛のパケットをiptables REDIRECTすると、V-IP2でもR-IP2でもなくてR-IP1になっていることに気がついた。R-IP2はIPエイリアスなので、実体のR-IP1になってしまうのかしら?
ということで、iptables DNAT --to-destination R-IP2 にして解決したのであった。
それにしてもiptablesは強力。強力な故に危険なのは、mod_rewriteにも通じるものがあるなぁ。