DSRをしてみた(2)

前回はロードバランサ、リアルサーバともVIPをインターフェースに設定したのですが、iptablesを使うことでその必要がなくなるそうです。

前回の設定を一度全てはずした上で、それぞれのマシンで以下のコマンドを実行しました。


[root@lb ~]# ipvsadm -A -t 10.233.11.24:http -s rr
[root@lb ~]# ipvsadm -a -t 10.233.11.24:http -r 10.233.11.22:http -g
[root@lb ~]# iptables -t mangle -A PREROUTING -d 10.233.11.24 -j MARK --set-mark 1
[root@lb ~]# ip rule add prio 100 fwmark 1 table 100
[root@lb ~]# ip route add local 0/0 dev lo table 100
[root@lb ~]# iptables -t mangle -A POSTROUTING -d 10.233.11.24 -j TOS --set-tos 2

[root@real ~]# iptables -t nat -A PREROUTING -m tos --tos 2 -j REDIRECT
私の環境ではクライアント(cl)からロードバランサ(lb)への通信ができませんでした。クライアント(cl)のarpテーブルを見てみると、VIP(10.233.11.24)のMACアドレスが取得できません。ロードバランサ(lb)は自分のインターフェースに振られていないVIP(10.233.11.24)のarp要求に応答していないようです。DSASさんのページを見てみると、VRRPのところでクライアントにルーティングの設定をしているようです。
というわけで、クライアント(cl)に以下の設定を追加しました。


[root@cl ~]# route add -host 10.233.11.24 gw 10.233.11.21
今度はうまく通信できました。

iptablesが何をしているかを理解するために、このページを読んでみたのですが、TOSをPOSTROUTINGではなくPREROUTINGでセットしてその後にTOSでルーティングさせれば、iptalesのルールを減らすことができるのでは?と思いました。

さっそくロードバランサの設定を一旦すべて解除して、設定し直してみました。


[root@lb ~]# ipvsadm -A -t 10.233.11.24:http -s rr
[root@lb ~]# ipvsadm -a -t 10.233.11.24:http -r 10.233.11.22:http -g
[root@lb ~]# iptables -t mangle -A PREROUTING -d 10.233.11.24 -j TOS --set-tos 2
[root@lb ~]# ip rule add prio 100 tos 2 table 100
[root@lb ~]# ip route add local 0/0 dev lo table 100

この設定では接続できませんでした。tcpdumpをしてみると、ロードバランサがVIP(10.233.11.24)のarp要求を出していました。loをtcpdumpしても何も流れていないようですので、ルーティングできていないということでしょうか。