異なる2つのプライベートネットワークにあるサーバ間の通信において、間にロードバランサ機器を介したHTTP通信ができないケースがあるが、なんでそうなるのかちゃんとわかっていなかったので、調べたのでメモとして記録しておく。
通信の状態
ネットワーク構成は以下のような感じ。 Server#1 からロードバランサが持つVIPを経由してServer#2, Server#3にHTTPリクエストをしたい、というもの。
デフォルトゲートウェイはL3SWになっているので、行きと戻りの通信が異なるせいだとは思っていたけど実際HTTP通信がどうなっているのかちゃんとわかっていなかったのでパケットを見てみたら以下のような感じになっていた。
- Server#1 から LB(のVIP)に対して HTTP リクエストを送る。
- Server#1 から LB(のVIP)に対して SYN が送られる。
- LB から Server#1 に対して SYN, ACK が送られる。
- Server#1 から LB(のVIP)に対して SYN が送られる。
- Server#1 から LB(のVIP)に対して HTTP リクエストが送られる(LBでいったん終端して、配下のサーバにリクエストが流れる?)。
- LB配下のサーバ Sever#2 or #3 から Server#1 に対して SYN, ACK が送られる。
- Server#1 から Sever#2 or #3 に対して RST が送られる。
- Sever#2 or #3 から Server#1 に対して TCP Previous segument not capture が送られる。
- 6と7の繰り返し
最初のHTTPリクエストがLB配下のサーバに到達した後の戻り通信のやり取りが Server#1 ←→ Sever#2 or #3 になってしまい、TCPが整合性を取れなくなって通信の中断、パケットを失った、という形になっている模様。
解決策
この構成で問題を解消するにはLBを通る段階でSrc IPをNATするようにして行きと戻りの通信を同じような経路になるようにするとか、L7の制御が不要ならL3DSRを組むのでも行けると思う。 BIG-IPだとSNAT Poolという設定ができるがこういうときのためにあるんだと思う。
まとめ
あんまりわかっていなかった件について、とりあえず調べて、まだそんなにわかっていないけどいったんメモとして書いた。