Cloudflare Load Balancing と Cloudflare Tunnel を使用した構成

# オリジンの宛先にパブリックホストを使う場合

- トンネルごとに紐づく `UUID.cfargotunnel.com` を1つのオリジンとして負荷分散の対象にできる
    - > [Session affinity and replicas · Cloudflare Zero Trust docs](https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/routing-to-tunnel/lb/#session-affinity-and-replicas)
ロードバランサは同じトンネルのレプリカを区別しません。同じトンネルUUIDを2つの別々のホストで実行すると、ロードバランサーは両方のホストを1つのオリジンサーバーとして扱います。クライアントと特定のホスト間のセッションアフィニティを維持するには、異なるトンネルUUIDを使って各ホストをCloudflareに接続する必要があります。
     - > [Cloudflare Load Balancers · Cloudflare Zero Trust docs](https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/deploy-tunnels/deploy-cloudflared-replicas/#cloudflare-load-balancers)
このモデルでは、同じ設定で複数のトンネルが必要です。各CloudflareトンネルのDNSレコード(UUID.cfargotunnel.com)はロードバランサー内のオリジンで使うことができます。そして、トラフィックがどのように各トンネルにルーティングされるべきかを決定するために、トラフィックステアリングポリシーを定義することができます。
- 1つのトンネル UUID に対して、複数のトンネルを用意（レプリカ）することが可能だが、レプリカは負荷分散の仕組みを提供しない。
    - > [`cloudflared` replicas · Cloudflare Zero Trust docs](https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/deploy-tunnels/deploy-cloudflared-replicas/#cloudflared-replicas)
設計上、レプリカはいかなるレベルのトラフィックステアリング（ランダム、ハッシュ、ラウンドロビン）も提供しません。その代わり、リクエストがCloudflareに到着すると、地理的に最も近いレプリカに転送されます。その距離計算がうまくいかなかったり、接続に失敗した場合、他の接続を再試行しますが、どの接続が選択されるかは保証されません。

![lb-tunnel-public-hostname.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/179827ac-4146-4009-64f2-2959ebf93233.png)


# オリジンの宛先にプライベート IP を使う場合

- 個々のサーバーごとに `cloudflared` を導入する形ももちろん取れる
- 1つのトンネル ID を使ってゲートウェイ型の構成をとって負荷分散することも可能
    - > [​​Private IP: Cloudflare Load Balancing Reference Architecture · Cloudflare Reference Architecture docs](https://developers.cloudflare.com/reference-architecture/architectures/load-balancing/#private-ip)
この方法では、Cloudflareグローバルネットワーク内にプライベート仮想ネットワークを作成するために使用されるプライベートIPアドレスとサブネットマスクを定義することができます。プライベートサブネット方式ではポートの定義ができないため、サブネットとマスクが定義されると、定義されたゼロトラストポリシーによってアクセスを許可された組織内のユーザーに限り、そのトンネルを介してサブネット全体に到達することができます。
このサブネットはCloudflare内の仮想ネットワークに追加され、そこでユーザがどのようにアクセスし、どのユーザがアクセスできるかを制御することができます。このサブネットは、32ビットマスク（単一IPアドレス、IE.10.0.0.1/32）の使用を含め、任意のサブネットまたはルーティング用に定義できます。許可されたサブネットは、cloudflaredプロセスを実行しているホスト上に存在する必要はない。必要なのはcloudflaredを実行しているホストとCloudflare Tunnel経由で到達可能なサブネット間のレイヤー3またはIP接続だけです。
    - > [Set up private IPs with Tunnel · Cloudflare Load Balancing docs](https://developers.cloudflare.com/load-balancing/local-traffic-management/ltm-tunnels-setup/)
現在、Cloudflareは、異なる仮想ネットワークを使用する場合でも、同じオリジンIPアドレスを複数回入力することをサポートしていません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/b3facc4b-26b7-b72d-fe44-13ea693b3689.png)

![lb-tunnel-private-ip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/37ca7c94-f4de-7c36-bc31-999d58a92157.png)

## 参考：仮想ネットワーク

- Cloudflare Tunnel 作成後に `cloudflared` から到達可能なプライベートネットワークをルート情報として定義できます。
    - > [Virtual networks · Cloudflare Zero Trust docs](https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/private-net/cloudflared/tunnel-virtual-networks/)
仮想ネットワークを使用すると、ユーザーやサービスの競合を発生させることなく、IP範囲が重複するプライベート・ネットワークを接続することができる。例えば、ある組織が2つの異なる仮想プライベート・クラウド（VPC）ネットワークを公開したい場合がある。しかし、2つのプライベート・ネットワークが同じRFC 1918 IP割り当てを受けた場合、同じIPアドレスを持つ2つの異なるリソースが存在する可能性があります。2つの別々の仮想ネットワークを作成することで、10.128.0.1/32 stagingと10.128.0.1/32 productionのように、重複するプライベートアドレスに決定論的にトラフィックをルーティングすることができます。
- [Cloudflare Tunnel (cloudflared) に Tunnel Virtual Networks を使ったルーティング設定を行う #cloudflare - Qiita](https://qiita.com/khayama/items/9ca5235de3497fa4c257)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/e04bc34d-c952-ccf7-c4a2-41c21e215177.png)


# 参考：リファレンスアーキテクチャ

- [Reference Architecture: Cloudflare Load Balancing Reference Architecture · Cloudflare Reference Architecture docs](https://developers.cloudflare.com/reference-architecture/architectures/load-balancing/)
    - >Cloudflare Tunnelsはオリジンを特定のCloudflareデータセンターに接続するため、オリジン宛てのトラフィックはオリジンに到達するためにそれらのデータセンターを横断する必要があります。図9は、Cloudflare Tunnelを介して接続されたプライベートオリジンへの接続が、トンネルの終端であるデータセンターを通過しなければならないことを示しています。

> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/7689bdd6-402e-c06c-5f2d-a2363e8754c1.png)
> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/aedfece8-011b-cbb7-aca1-7cbde7dca8da.png)
> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/b1cbf243-9487-4fb1-695d-5f39e5d4acc4.png)