DSRをしてみた(1)

勉強のためにLVSでDSR方式を組んでみました。


いろいろな構成があるようですが、とりあえずクライアント、ロードバランサ、リアルサーバがすべて同じネットワークで試してみました。


クライアント(cl)     実IP 10.233.11.20/24
ロードバランサ(lb)    実IP 10.233.11.21/24
             VIP 10.233.11.24/24
リアルサーバ(re)     実IP 10.233.11.22/24

カーネルはすべてCentOS4のものを使いました。
ロードバランサではロードバランスの設定をした後に、eth0にVIPのエイリアスをつけます。


[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 ~]# ifconfig eth0:0 10.233.11.24 netmask 255.255.255.0

リアルサーバではloにVIPのエイリアスをつけます。


[root@re ~]# ifconfig lo:0 10.233.11.24 netmask 255.255.255.25

さらにリアルサーバではVIP(10.233.11.24)のARP要求に応答しない設定をします。/etc/sysctl.confgに以下を記述して


#for LVS
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.eth0.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.eth0.arp_announce = 2

反映させます。


[root@re ~]# sysctl -p


クライアントからブラウザで10.233.11.24にアクセスしてみるとページが表示されています。それぞれのマシンでtcpdumpしてみると、

1.cl


IP 10.233.11.20.1284 > 10.233.11.24.http: S 3982979485:3982979485(0)
2.lb

IP 10.233.11.20.1284 > 10.233.11.24.http: S 3982979485:3982979485(0)
3.re

IP 10.233.11.24.http > 10.233.11.20.1284: S 2222346781:2222346781(0)
と、一応リアルサーバからクライアントにダイレクトにパケットが返っているように見えます。

NAT方式のロードバランスはDNATとSNATの組み合わせだったので、DSRもパケットに何か手を加えているかなと思っていたのですが、そうではないようです。このtcpdumpの結果には、リアルサーバ(re)のIPアドレスである10.233.11.22がどこにもありません。私にははじめ何でロードバランサ(lb)からリアルサーバ(re)へのパケットの転送が成功しているのかがわかりませんでした。
そこでtcpdumpに-eオプションをつけMACアドレスを表示してもう一度眺めてみました。

それぞのMACアドレスは以下の通りです。


クライアント(cl)     02:ff:14:a6:ca:7f
ロードバランサ(lb)    00:c0:a8:fc:08:89
リアルサーバ(re)     00:c0:a8:fc:06:aa


1.cl


02:ff:14:a6:ca:7f > 00:c0:a8:fc:08:89, ethertype IPv4 (0x0800),length 66: IP 10.233.11.20.1284 > 10.233.11.24.http: S 3982979485:3982979485(0)
2.lb

00:c0:a8:fc:08:89 > 00:c0:a8:fc:06:aa, ethertype IPv4 (0x0800), length 66: IP 10.233.11.20.1284 > 10.233.11.24.http: S 3982979485:3982979485(0)
3.re

00:c0:a8:fc:06:aa > 02:ff:14:a6:ca:7f, ethertype IPv4 (0x0800), length 66: IP 10.233.11.24.http > 10.233.11.20.1284: S 2222346781:2222346781(0)


太字の箇所を見て理解できました。
MACアドレスの宛先がリアルサーバ(re)宛になっています(当たり前ですが)。リアルサーバのNICは自分のMACアドレス宛のフレームを受け取ります。通常ですと、自分のMACアドレス宛のフレームをNICが受け取っても、IPアドレスが自分宛でないものはルーティングテーブルになければ破棄します(たぶん)。loのエイリアスにVIPのアドレスを貼り付けることによって、リアルサーバは自分宛のパケットとして受け取ってアプリケーションに渡しているのでしょう。DSR方式のLVSはリアルサーバのIPアドレスを解決するためにARP要求はしますが、転送するパケットにはリアルサーバのIPアドレスは使っていないということのようです。

わかってみると簡単ですが、普段レイヤ2まで意識することがあまりないので、MACアドレスの宛先が合っていればIPアドレスが異なっていてもフレームがNICまで届くということを忘れていました…


DSRを試すのにあたって、Webサイトで参考にさせて頂いたのは、以下のページです。
LVSの他にも技術情報を惜しみなく提供されていて、本当に助かります。


DSAS開発者の部屋:高トラフィックに対応できるLinuxロードバランサを目指して 〜 LVSをNATからDSRへ


書籍は以下のもの参考にしました。この本も面白いです。


Linuxアドバンストネットワークサーバ構築ガイド HAサーバ構築編 (Network server construction guide series (13))