【IBM Cloud】ALB/NLBの違いとパケットの流れについて簡単に整理してみた

## はじめに
今回はIBM Cloudを利用する中でのLoad Balancerの種類をご紹介し、そのLoad Balancerを使ったらパケットがどのように流れるかを図で表現してみました。
## Load Balancer（ロード・バランサー）とは
Load Balancerを説明するためには、まずLoad（ロード）についての説明が必要と思います。

例えば、インターネットから各種サーバーにアクセスがあると、サーバーはその機器に搭載されているCPUやメモリーなどのリソースを使って指示を処理しますが、その指示を処理するための準備のことをロードと言います。
処理した結果が利用者のパソコンに送られて、指示内容がブラウザに表示されるため、アクセス数がそこまで多くなく、処理数が少ない場合には問題ないのですが、もしアクセスが特定のサーバーに集中してしまうとブラウザの表示が遅くなったり、重くなる場合があるかと思います。
これはアクセスに対するロードに時間がかかってしまい、準備が遅くなっている状態といえます。
![スクリーンショット 2024-01-24 14.31.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/951c0496-718f-f6f5-163a-c55b35562f40.png)

その負荷を上手に調整し、ロードの遅れを解消するようにする仕組みがLoad Balancerです。
つまり、Load Balancerとは、外部からの通信に対するサーバー負荷を複数のリソースに均等に割り振ってくれる機能となります。
![スクリーンショット 2024-01-24 14.37.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/42746ab6-7912-d89e-f8bf-c87c3e6c68bc.png)

## IBM Cloudで提供しているLoad Balancerの種類
IBM CloudのVPCでもLoad Balancerは提供されています。VPCのLoad Balancerを使うことにより、VPC上のサーバーにアクセスする際の負荷を均等に分けてくれるようになります。

IBM Cloud VPCのLoad Balancerには二つの種類がありますが、
「Application Load balancer（ALB）」と「Network Load Balancer（NLB）」の２種類です。

こちら二つのLoad Balancerは必要な要件に応じて選択することができ、その違いを明確に把握しておく必要がありますので、その際には[こちら](https://cloud.ibm.com/docs/vpc?topic=vpc-nlb-vs-elb&locale=ja)を確認ください。

また、IBM Cloudで提供しているLoadBalancerの種類によってデータパケットの流れが少し変わってきます。
下記は例として、自宅のPCからインターネットを経由してIBM Cloud上に構成したWebサーバーにアクセスする経路を３つ挙げています。その際にLoad Balancerを使わないアクセスや２種類のLoad Balancerを使ったアクセスによって経路が変わります。そのため、ここでは主に送信元と宛先を中心に確認してください。

#### 1. Load Balancerを使わない場合のパケットの流れ
![スクリーンショット 2024-01-24 15.16.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/8c1664fb-889c-e15c-0b08-5ee2ce376ff4.png)

自宅でPCからIBM Cloud上のサーバー（`10.x.x.x`）にアクセスする時、送信元となるPCが持つIPアドレス(192.xxx.x.x)はプライベートIPアドレスのため、ルーターによりNATされ、グローバルIPアドレスである`124.x.x.xx`に変換されます。そのため、ルーターを介した時点で送信元は変換されるようになります。
IBM Cloud上のサーバーにアクセスする際、宛先となるVPCの仮想サーバーのIPアドレス`10.x.x.x`は、サーバーに付与されたReserved IPですが、これはプライベートIPアドレスであるため、まずはグローバルIP（ここでは`128.x.x.xx`にしています）を追加してアクセスする必要があります。IBM Cloud VPCに入った時点でVPCの[SDN（Software Defined Networking）](https://www.ibm.com/topics/sdn)機能により、宛先がグローバルIPからReserved IPに書き換えられるようになります。この例では、`128.x.x.xx`→`10.x.x.x`となります。
サーバーから戻る際には今までの流れの送信元と宛先が逆になった形でPCに戻っていくようになります。

つまり、自宅PCからWebサーバーにアクセスした際にWebページが表示されるまでのパケットの流れとしては、`PC`→`ルーター`→`サーバー`→`ルーター`→`PC`となります。

#### 2. ALBを使ったパケットの流れ
![スクリーンショット 2024-01-24 15.17.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/58605a81-a4ee-029b-820d-e52097eada7b.png)

自宅のPCからサーバー`10.x.x.x`にALBを使ってアクセスする流れについてです。ALBを使っての通信では、自宅のPCからルーターを経由して送信元が変更される部分（送信元：`192.xxx.x.x`→`124.x.x.xx`）は同様ですが、宛先はIBM Cloud VPCのSubnetになる点が異なります（今回はSubnet IP Adressを`128.x.x.xx`としています）。宛先のSubnet IP`128.x.x.xx`に到達すると、そこから宛先が[DNAT（Destination Network Adress Translation）](https://cloud.ibm.com/docs/vpc?topic=vpc-about-networking-for-vpc&locale=ja)によりALBのIP Adressに変更されます(今回ALBのIP Adressは`172.x.xx.x`にしています)。ALBを経由する時点で送信元はALBのIP Adressになり、宛先はサーバーのReserved IPに変更され、`10.x.x.x`に変更されます。
サーバーから戻る際には今までの流れの送信元と宛先が逆になった形でPCに戻っていくようになります。

つまり、自宅PCからALBを経由してWebサーバーにアクセスした際にWebページが表示されるまでのパケットの流れとしては、`PC`→`ルーター`→`ALB`→`サーバー`→`ALB`→`ルーター`→`PC`となります。

#### 3. NLBを使ったパケットの流れ
![スクリーンショット 2024-01-24 15.18.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/1dd03a5f-3a67-afec-08d1-f278e9e0d1cb.png)

自宅のPCからサーバー`10.x.x.x`にNLBを使ってアクセスする流れについてです。NLBを使っての通信では上記の２パターンと異なり、OutとInが対応して流れません。
まずはPCからサーバーまでの流れですが、サーバーのGlobal IP`128.x.x.xx`を追加してアクセスするために、上記2パターンと同様に送信元がPC`192.xxx.x.x`からルーターを経由してGlobal IP`124.x.x.xx`に変更され、NLBを経由することになります。NLBからサーバーにアクセスする際、宛先がサーバーのGlobal IPからReserved IPに変更（`128.x.x.xx`→`10.x.x.x`）されます。
PCに戻る際には、NLBではなくHypervisorレベルでNATされるため、送信先が変更（`10.x.x.x`→`128.x.x.xx`）されるようになり、宛先がPCのGlobal IP`124.x.x.xx`になります。その後ルーターを経由してPCに戻るようになります。

つまり、自宅PCからNLBを経由してWebサーバーにアクセスした際にWebページが表示されるまでのパケットの流れとしては、`PC`→`ルーター`→`NLB`→`サーバー`→`Hypervisor`→`ルーター`→`PC`となります。