Home > お知らせ > DSRとは

DSRとは

DSRとは

Direct Server Returnのことです。一般にはNAT(Network Address Translation)との対称みたいな感じで使われていることが多い気がします。先ほどの例であった同一IP帯内でのDNAT戻りパケットの処理を少し変えた感じです。

・DSRの例

「クライアント(192.168.0.10:5000)」→(192.168.0.20:80あて)→「DSRサーバー(受付:192.168.0.20)(宛先IPは書き換えず、パケットの送付先のみ変更。192.168.0.30のNICあて)」→「192.168.0.30:80」

上記例は、先ほどのDNATとほとんど同じです。ただし、今回は、192.168.0.30に届くパケットの送信先は192.168.0.20のままです。このパケットが192.168.0.30に届くのは、パケットの宛先MACアドレスのみが、192.168.0.30のMACアドレスに書き換わっているからです。ゲートウェイにIPパケット送るときと同じです。

(MACアドレスとパケットについて)通常のTCP/IP通信では、次のようになっています。(それぞれの部分でパケットを一定サイズに分割しています。)

  「アプリケーションが送りたいデータ」→「TCPパケットで包み込む(ポート番号付加)」→「IPパケットで包み込む(送信/受信IPアドレス付加)」→「ethernetフレームで包み込む(宛先/送信元MACアドレス付加)」→「ネットワーク上を流れる」

もちろん、届いたパケットは逆順で元に戻されてデータとなります。(TCPの輻輳処理は省略)上記のDSR例のように送信先が異なっていても、パケットが届くのは、ethernetフレームでのMACアドレスが(192.168.0.30)のMACアドレスに設定されていたためです。

 話を戻しまして、通常であれば、DSRのパケットは、(192.168.0.30)では処理されません。当然、IPアドレスが自分のIPでないためです。iptablesとかで、Forwarding処理を許可していれば、(192.168.0.30)に転送してしまうかもしれません。(かもです。ARPチェックではねられるのかな?誰か教えてください。)

 DSRを行うには、このパケットを受け取れるようにしなければなりません。最も簡単な手段が、「透過型プロキシ設定」を行うことです。透過型プロキシを利用すると、自分のIPで無いIPアドレスのデータを受け取って、返信を、あたかもそのIPアドレスからのように返すことができます。これを行うのは、非常に簡単で、iptablesで次のように設定するだけです。

{{{

# iptables -t nat -A PREROUTING -d *.*.*.*(受け取りたいIP) -j REDIRECT

}}}

詳しい説明は省略しますが、REDIRECTターゲットを使うと、自分自身のIPアドレスにリダイレクトして、その結果を返すときは、もともと来たIPアドレスに書き換える処理をする、という動作をしてくれます。まんま「透過型プロキシ」ですね。

iptablesにこの動作を加えることによって次のような流れができあがります。

・DSRの例

「クライアント(192.168.0.10:5000)」→

→(元:192.168.0.10:5000、先:192.168.0.20:80)→

→「DSRサーバー(受付:192.168.0.20)(宛先IPは書き換えず、パケットの送付先のみ変更。192.168.0.30のNICあて)」

→(元:192.168.0.10:5000、先:192.168.0.20:80 ※送信先MACアドレスは192.168.0.30のNIC)

→「192.168.0.30のiptablesが、192.168.0.20あてのパケットを受け取って192.168.0.30:80にリダイレクト」

→(元:192.168.0.10:5000、先:192.168.0.30:80)→

→「192.168.0.30:80で待ち受けているアプリが処理して返答」

→(元:192.168.0.30:80、先:192.168.0.10:5000)→

→「192.168.0.30のiptablesが送信元を192.168.0.20に書き換えて192.168.0.10:5000に返信」

→(元:192.168.0.20:80、先:192.168.0.10:5000)→

→「クライアント(192.168.0.10:5000)が受信」

こんな感じの流れになります。略すと

[クライアント]→[DSRサーバー]→[バックエンドサーバー]→[クライアント]

となり、行きはDSRサーバーを通るが、戻りは直接返す、という行動になります。このため、DSR(Direct Server Return)というみたいです。

DSRの利点は、DSRをロードバランサと置き換えると、わかりやすくなります。

 「ロードバランサは、リクエストをバックエンドに分配はするが、返答はバックエンドが直接行う。このため、ロードバランサは返答の処理の必要性が無くなり、処理が軽くなる。

いいですね〜★。帯域も無駄遣いしなくて済みますし。

※ ふつうのロードバランサは、大抵次のような行動をします。(NATのところで少し触れましたが・・)

[クライアント]→[ロードバランサ]→[バックエンドサーバー]→[ロードバランサ]→[クライアント]

この動作を行うため、ロードバランサは、バックエンドとの通信時に送信元と送信先のIPをどちらも替えています。

次は、実践編。keepalived使って、DSRでmysqlの負荷分散します。

間違いや誤植がありましたら、お教えください。

Comments:0

Comment Form

Trackbacks:0

Trackback URL for this entry
http://dev.tapweb.co.jp/2010/08/242/trackback
Listed below are links to weblogs that reference
DSRとは from tap dev blog

Home > お知らせ > DSRとは

Search
Feeds

Return to page top