IPVS-NATでリアルサーバーから応答がない事象の解決方法

○ 事象
IPVS(LVS)(NAT/マスカレード構成)環境にて、端末からサービスIPにアクセスするとサーバーからの応答がない。
tcpdumpで調べると、応答パケットがリアルサーバーからアクセス元端末に戻っておらず、さらに調べると、IPVSを構築しているサーバーで応答パケット(戻りの通信)が破棄(遮断)されている。

□ アクセス端末
↓|
■×IPVS・ファイアーウォール
↓|↑
□ リアルサーバー

○原因
ファイアーウォールがIPVSを経由した応答パケットを認識していない!
ファイアウォールのルールが

iptables -P FORWARD DROP

iptables -A INPUT -i eth0 -p tcp –dport 80 -j ACCEPT
iptables -A FORWARD -i eth0 -p tcp –dport 80 -j ACCEPT
iptables -A INPUT -i eth0 -m state –state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i eth0 -m state –state ESTABLISHED,RELATED -j ACCEPT
(eth0・・・WAN(入り口) eth1・・・LAN(リアルサーバー側)

であったりすると、通常のルーティングならファイアーウォールがアクセス先にHTTPアクセスがあったこを記憶して転送し、の応答が戻ってきたときにアクセス端末側に返す。
しかし転送にIPVSを噛ますとアクセスがあったという記憶をしていないらしい。
※正確に言うと、記憶している場所が違うので情報を取り出せない。
端末→IPVS→リアルサーバー・・・INPUTチェイン
端末←IPVS←リアルサーバー・・・FORWARDチェイン
なので、応答パケット(戻りのパケット)のダイナミックフィルタリングで許可がでず、PVSを構築しているサーバー上でパケットが破棄されてしまう・・・
詳細はこのURLのイントロダクション参照(英文)
http://www.austintek.com/LVS/LVS-HOWTO/HOWTO/LVS-HOWTO.filter_rules.html
※要訳
IPVS-NATはnetfilter(iptables)の仕様上、経路追跡に問題がある。
カーネルにパッチを適用することによって問題が解決するらしい。
またはDSR構成にする。
と言われても、素のカーネルをコンパイルして(しかもパッチ適用)使用するのはすがに怖い!
かといてDSR構成にもできない(並行して、SSL証明書などの問題で
PoundやApacheをつかってURLベースのバランシングをしているなど・・・)
ではどうするか?
○解決方法
ダイナミックフィルタリングができないなら、静的フィルタリングで無理やり許可する!
IPVSサーバー上で、リアルサーバーからの転送通信を送信元のポートを特定して許可る。
たとえばSMTPなら

iptables -A FORWARD -i eth1 -o eth0 -p tcp –sport 25 -j ACCEPT
(eth0・・・WAN(入り口) eth1・・・LAN(リアルサーバー側)

これでめでたく開通。
セキュリティー上ちょっと怖いが・・・