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にも通じるものがあるなぁ。