プロキシとリバースプロキシ — 同じ箱を、どちら側に置くか
プロキシ(proxy)とは「代理」のことです。通信の途中に1つ箱を挟み、本人のかわりに相手とやり取りさせる仕組みを指します。
ややこしいのはフォワードプロキシとリバースプロキシという2つの名前があること。でも中身はほとんど同じ箱で、違うのはどちら側に置くかだけです。クライアントのそばに置けばクライアントの身代わり、サーバーのそばに置けばサーバーの身代わりになります。図1で3つを切り替えて、パケットに書かれたIPがどう変わるか見てください。
フォワードプロキシ — クライアントの身代わり
単に「プロキシ」と言ったら普通はこちらです。クライアント側に置き、外に出ていく通信をまとめて代理します。図1のフォワードプロキシで送ると、サーバーのログに残るのはプロキシのIPだけ。サーバーからは誰が本当の依頼主か分かりません。
この性質から、社内から外部サイトへのアクセスを一箇所に集めて記録・制限する、同じページを何度も取りに行かずキャッシュする、といった使い方をします。クライアントの側が「使うぞ」と設定して初めて経路に入る、というのも特徴です。
リバースプロキシ — サーバーの身代わり
同じ箱をサーバー側に置いたのがリバースプロキシです。クライアントから見るとそこが目的のサーバーそのものに見えます。図1でリバースに切り替えて何度か送ると、裏側の web-01 / web-02 / web-03 が入れ替わるのに、クライアントが知っている接続先は192.0.2.10 のまま変わりません。
裏に何台いるか、どれが今止まっているかを外から見えなくできるので、負荷分散、TLSの終端、攻撃の受け止めをここで引き受けられます。フォワードと違い、クライアントは何も設定しません。存在に気づかないまま通っています。
置く場所が違うだけで、隠れる相手が反転する
2つを分けているのは「誰の代理として立っているか」だけです。フォワードはクライアントを隠し、リバースはサーバーを隠す。図1の2枚のカードが、モードを切り替えるたびに反対側だけ変わるのはそのためです。
なお、リバースプロキシが本当の送信元を裏のサーバーに伝えたいときは、X-Forwarded-For というヘッダーに元のIPを書き足して渡します。裏のサーバーが「アクセス元はいつも同じIP」に見えて困るのは、この受け渡しが抜けているときです。
- プロキシ
- 通信を代理する中継役。本人のかわりに相手とやり取りする。
- フォワードプロキシ
- クライアント側に置く代理。サーバーからは依頼主が見えなくなる。
- リバースプロキシ
- サーバー側に置く代理。クライアントからは裏の構成が見えなくなる。
- 負荷分散
- リバースプロキシが裏の複数サーバーへ振り分けること。
- X-Forwarded-For
- 本当の送信元IPを裏のサーバーへ伝えるためのHTTPヘッダー。
まとめ
プロキシは「間に立つ1つの箱」でしかありません。それをクライアントの前に置けばフォワード、サーバーの前に置けばリバース。名前で覚えるより、どちらを隠したいのかで考えると迷いません。図1の2枚のカードを見ながらタブを往復させると、その反転がそのまま確認できます。