2016/02/14
超久しぶりの投稿になりました。
なかなかここで記事にするようなニッチなネタがないのですが、ネットの情報を元にあれこれやってみた結果、最終的にそれらに従わず、「これでいいんじゃね?」という設定に辿りついたので、自分の備忘のために書きました。
今回は、nginx です。
掲題の通り、AWS の CloudFront – ALB – EC2 で nginx を使う構成です。
この手の構成の場合、まあ、普通に X-Forwarded-For ヘッダから真のクライアントIPを拾うことになるわけですが、いくつかのサイトを確認したところ、どれも、以下のような書き方が提示されてました。
1 2 3 4 |
real_ip_header X-Forwarded-For; set_real_ip_from 10.0.0.0/24; set_real_ip_from 172.31.0.0/16;; real_ip_recursive on; |
各パラメータの説明は他のサイトの方や、nginxのドキュメントにお任せしますが、ここで問題になったのは、set_real_ip_from です。
「信頼できるIP」という表現になっているサイトが多かったですが、要するに、ALB と CloudFront のIPを書けってことらしいです。
そうすると、それらを除いて、X-Forwarded-For で渡してくれるので、最終的にそれらに沿わないIP、つまり、一番最初のIP、真のクライアントのIPが残ってくれて、それが $remote_addr に入ってくれる、と。
しかし、CloudFront は、定期的にIPが変わるはず(実際は言うほど変わらないと個人的には思ってますが)。
それを、定期的に確認して書き換えるというのはなぁ、と考えた管理人は、プログラムを書いて自動的に CloudFront の IP を確認して…というのもまた面倒だなぁと考えていたのですが、各サイトの情報をずっと眺めていた際に、ふと以下の思いに駆られました。
「これ、全部、信頼できるIPにしてしまえばいいんじゃね?」
つまり以下のように書いてしまうということです。
1 2 3 |
real_ip_header X-Forwarded-For; set_real_ip_from 0.0.0.0/0; real_ip_recursive on; |
やってみました。
すると、どうでしょう。
見事に、期待した通り、$remote_addr に、一番最初のクライアントのIP、つまり、欲しかった真のクライアントIPが入るようになりました。
$http_x_forwarded_for には、CloudFront のIPと思しきものも入ってますが、とにかく、$remote_addr は欲しいIPが入るようになりました。
とりあえず、今のところこの方法で問題なさそうです。
誰か思いつきそうな気がするのですが、これダメなんですかね?
運用して、問題があるようなら、またここで書きます。
コメント
はじめまして、X-Fowarded-Forについて調べており当エントリを拝見させていただきました。
もし間違っていたら申し訳ないのですが、これだとアクセス元のユーザーがX-Fowarded-forヘッダーに不正な情報を入力していた場合 remote_addrがその不正な情報へと書き換わり IPを偽装することができてしまいます。
ですので、接続元のIPによって挙動が変わるような処理を実装していた場合、もしくは将来実装する場合は気をつけなければなりません。
そういったケースではないのであれば簡潔なやり方だとは思います。
by 2357gi 2022年4月18日 6:04 PM