ELB配下のEC2で以下のような設定でApacheを動かしていると、ログにX-Forwarded-Forが"[クライアントのIP], [ELBのIP], [ELBのIP]"となるのがよくわからなかったので調べた。
図に書いてみると分かったけどややこしかったのでメモしておく。
ErrorDocument 502 /error/502.html
ProxyPass /error http://localhost:3010/error
# 必ずタイムアウトする
ProxyPass / http://localhost:3020/
動作
- クライアントからELBにリクエストが送られる。
- 送信元IPはクライアントのIPでX-Forwarded-Forはまだ無い。
- ELBからEC2(mod_proxy)にリクエストが送られる。
- ELBがX-Forwarded-ForにクライアントIPの値をしまい、送信元IPとしてELBのIPでリクエストする。
- mod_proxyから背後のサーバーにリクエストが送られる(タイムアウトして502となる)。
- mod_proxyがX-Forwarded-ForにELBのIPを追加し、送信元IPとしてlocalhostからリクエストする。
- 502のErrorDocumentが設定されているため再度ELBからのリクエストという扱いで指定されたproxyを行う。
- 送信元IPがELBのIPでX-Forwarded-Forの値は変更しないままのリクエストとしてproxyする。
- ErrorDocument用のproxyが行われる。
- mod_proxyがX-Forwarded-ForにELBのIPを追加し、送信元IPとしてlocalhostからリクエストする。