AWS NLB は Source IP/Port を維持するが DSR 動作はしない
AWS Black Belt Online Seminar は毎回、素晴らしい内容です。 2017 年公開の資料なので、最新の情報ではありませんが NLB の基本的動作については ELB Update - Network Load Balancer (NLB) と関連サービス に分かりやすく、且つ、丁寧にかかれています。 この資料の P.20 に下記の記載があります。
- クライアントの Source IP と Port が、そのまま Target まで届く
- Target はクライアントと直接通信しているかの様に見える
- 実際は、行きも帰りも NLB を通っている (DSR ではない)
- IP Target (後述) の場合は保持されず、NLB からの通信となる
- Direct Connect は接続されている VPC からのみ通信可能なので、こちらで回避
Instance Target で NLB を設定すると分散対象のサーバでは送信元パケットで「クライアントのアドレス」が確認出来る為、一見すると「NLB は DSR 動作している」ように見えますが、上述の Black Belt 資料に記載がある通り、実は DSR 動作をしていないそうです。 今回は検証環境で実際のトラフィックフローを確認してみました。
DSR した場合のトラフィックフロー (※ NLB はこの動作をしない)¶
NLB が「DSR 動作をしている」と仮定すると、トラフィックフローは下図のようになっているはずです。 後述しますが、実際にパケットをキャプチャしてみると Black Belt 資料に記載がある通り、この動作 (DSR 動作) はしていませんでした。
NLB を利用した場合のトラフィックフロー¶
結果から述べると、NLB を経由した場合は以下のトラフィックフローになっていました。
実際のパケットキャプチャ¶
実際にテスト環境で NLB 環境で動作確認し、パケットをキャプチャしてみます。
クライアント側でのパケットキャプチャ結果¶
クライアント (PC-11) から NLB に対して curl
で HTTP GET リクエストを実行してみます。
1 2 |
|
クライアント側でのパケットキャプチャ結果は以下の通りです。
1 2 3 4 5 6 7 8 9 10 |
|
以下の事柄が分かります。
- NLB (10.0.1.100) からのパケットのみ、受信していること
- Web-101 (10.0.1.101) からのパケットは 受信していない こと
Web サーバ側でのパケットキャプチャ結果¶
Web サーバ側でのパケットキャプチャ結果は以下の通りです。
1 2 3 4 5 6 7 8 9 10 11 12 |
|
以下の事柄が分かります。
- クライアント (10.0.1.11) からのパケットのみ、受信していること
- NLB (10.0.1.100) からのパケットは 受信していない こと
- つまり、NLB を経由していても送信元アドレスが維持されている
「従来の DSR」と「AWS NLB」の比較¶
「従来の DSR」と「AWS NLB」を比較してみます。
DSR の特徴¶
DSR 構成には一般的に以下のような特徴があると思います。
- 以下のトラフィックフローになる
- 行きのトラフィックは LB を経由する
- 戻りのトラフィックは LB を経由しない (LB では Source NAT しない)
- つまり、往復で非対称トラフィックフローになる (非対称トラフィックフローに対する配慮が必要になる)
- LB で戻りトラフィックを処理する必要が無い為、パフォーマンスが改善する
- トラフィックが往復ともに LB を経由することが前提である機能が使えない (例. SSL/TLS オフロード等)
- 負荷分散対象となるサーバで、戻りパケットの送信元アドレスを LB の VIP にする必要がある
AWS NLB では負荷分散対象サーバ側での DSR 用設定が不要¶
DSR 構成では Windows サーバにしろ、Linux サーバにしろ、上記 4. の設定が必要でした。 しかし、AWS NLB では恰も DSR のように「Source IP/Port は維持されている」にも関わらず、クライアントに通信を戻す際は「NLB のアドレスから戻ってくる」為に上記 4. の対処が不要です。 これは大きなメリットだと思います。
AWS NLB であれば、そもそも十分なパフォーマンスが期待出来る¶
また、NLB は AWS インフラで提供され、しかも AWS ALB とは違い「暖機運転」が不要なので突発的なバーストトラフィックにも強い、という特性があります。 従来の DSR には上記 2. の「パフォーマンスの優位性」がありましたが、AWS NLB は往復のパケットが経由しているとしても、「NLB がボトルネックになる」というケースは考えづらいのでは無いかと思われます。
他サービス同様、NLB はメンテナンスが不要¶
NLB も他のサービス同様、AWS のサービスなので「脆弱性対応」などのメンテナンスを意識してユーザが実施する必要がありません。「敢えて AWS インフラ内部に Linux/Windows で DSR な LB を構築する」という構成は手間が面倒で "敢えて自前で LVS を作ろう!" といったケースは少ないと思いますが…