ネットワーク #7 - プロキシ

Last Edited: 10/7/2024

このブログ記事ではプロキシやリバースプロキシについて紹介します。

DevOps

クライアントとサーバー間の通信を中継するサーバーをプロキシ、またはプロキシサーバーと呼び、これらはさまざまな重要な役割を担っています。 本記事では、異なる種類のプロキシとその役割について解説します。

フォワードプロキシ

フォワードプロキシは、クライアントに代わってサーバーにリクエストを送信し、レスポンスを受信します。これにより、リクエストやレスポンスをキャッシュして、 同じリクエストを重複して送信するのを防ぐ、クライアントを匿名化する、クライアントの活動を監視する、特定のウェブサイトをブロックする、などの目的で使用できます。 また、クライアントがサーバーのプロトコルをサポートしていない場合に、プロトコルの変換(例:HTTP 1.1からHTTP 2.0)を行うこともできます。 たとえば、企業が従業員のオンライン活動を監視し、キャッシュを活用してセキュリティやパフォーマンスを向上させるために、従業員のコンピュータにフォワードプロキシを設定することがあります。

リバースプロキシ

リバースプロキシは、サーバーに代わってクライアントからのリクエストを受信し、レスポンスを送信します。 フォワードプロキシと同様に、リバースプロキシも重複するリクエストを防ぐためにリクエストやレスポンスをキャッシュしたり、 サーバーのパフォーマンスを監視したり、悪意のある攻撃をブロックするなどの役割を果たします。 また、異なるプロトコル(例:HTTP 1.1からgRPC)を使用するマイクロサービスを活用するためにも利用されます。 さらに、リクエストを複数のサーバーに分散させて水平スケーリング(ロードバランシング)を行ったり、 カナリアデプロイメント(新しいバージョンをテストするためにトラフィックを旧バージョンと新バージョンに分割)に活用することができます。

ロードバランサー

リバースプロキシが担うさまざまな役割の中で、ロードバランシングはサービスのスケーラビリティとパフォーマンスに大きく影響を与えるため最も重要なものの一つです。 リバースプロキシは、しばしばロードバランシング専用に設定され、このような専用プロキシはロードバランサーと呼ばれます。

タスクをサーバーに分散させる方法は、単純にリクエストを順番に割り当てる(ラウンドロビン)ものから、 各サーバーに割り当てられているタスクの数を測定して最も負荷が少ないサーバーを選ぶ(最小接続)方法までさまざまです。 また、サーバーの応答時間やデータ量を測定し、パフォーマンスの高いサーバーを優先的に選ぶ方法(PEWMA)もあります。 ロードバランシングアルゴリズムに関心がある場合は、Sam氏による Load Balancing という記事をお勧めします。

L4 vs L7プロキシ

プロキシはOSIモデルのレイヤー4(トランスポート層)またはレイヤー7(アプリケーション層)で動作します。 レイヤー4(L4)プロキシは、以前の記事 Network Engineering #2 - DNS, で説明した、NATを使用してデータパケットの送信元アドレスと送信先アドレスを変換します。そのため、データを復号したり内容を確認したりすることはありません。 一方、レイヤー7(L7)プロキシはデータを復号し、内容を確認するため、より柔軟な処理が可能です。

L4プロキシ(例えばTCPプロキシ)は、パケットのアドレス変換のみを行い、内容は無視するため、クライアントとサーバーの間で1つのTCP接続を利用できる代わりに、 キャッシュの利用やスマートなロードバランシング、異なるプロトコルを使用するマイクロサービスを活用することはできません。 L7プロキシ(例えばHTTPプロキシ)は、それらすべてを活用できますが、クライアント、プロキシ、サーバーの間で2つのTCP接続を確立する必要があり、 コンテンツを復号し処理する時間が追加でかかります(ただし、通常この時間はほとんど無視できる程度です)。

HTTP vs HTTPSプロキシ

クライアント、プロキシ、サーバーがすべて同じプライベートネットワーク内にある場合、TLSを使用して通信を暗号化する必要はないかもしれません。 このような場合には、HTTPプロキシを使用するのが合理的です。HTTPプロキシはTLSを使用しません。

しかし、プロキシがプライベートネットワーク外のデバイスと通信する場合、その通信を保護することが重要です。この場合、HTTPSプロキシが使用されます。 HTTPSプロキシには、TLS終端プロキシとTLSフォワードプロキシの2種類があります。TLS終端プロキシは、プライベートネットワーク外のデバイスとだけTLSを確立します。 たとえば、同じプライベートネットワーク内にあるウェブサーバーとロードバランサーを設定する場合、クライアントとはHTTPSを使用し、ウェブサーバーとはHTTPを使用します。

しかし、プライベートネットワークが侵害された場合、すべてのデータが攻撃者に見られてしまいます。 これを防ぐため、プロキシとサーバーの間にもHTTPSを設定することができます。これをTLSフォワードプロキシと呼びます。 HTTPSを使用するコストはほとんど無視できるため、TLSフォワードプロキシはより一般的に好まれる選択肢です。

結論

この記事では、さまざまな種類のプロキシと、それらがセキュリティやパフォーマンス向上に果たす重要な役割について解説しました。 プロキシを提供するサービスは数多く存在し、Nginxなどを使用して自分自身でリバースプロキシやロードバランサーを設定することも可能です。 この点については今後の記事で詳しく説明します。

リソース