無料のCDN、CloudFlareを使うと環境変数REMOTE_ADDRがCloudFlareのIPになってしまう件
Home | CloudFlare | The web performance & security company
CDNっていうのはコンテンツデリバリネットワークの略なのですが、CloudFlare(クラウドフレア)は無料で利用できるCDNです。極単純に表現するとリバースプロキシとして動作して、ホームページの表示を高速化してくれます。
無料プランがあって無料で利用することが出来ます。申し込みと利用は簡単なのですが、設定するにはネームサーバーをCloudFlareの物に切り替える必要があるので、基本的に独自ドメインを持ってないと使えません。
使ってみると、実際ホームページの表示が爆速になります。そりゃリバースプロキシですから、Nginxを使うのと同じなので当然です。
そして、まあ、キャッシュされるので、キャッシュにまつわる問題もついてきます。当然、色々解決策は用意されています。ここでは解説しませんけど、回避するコードや設定が有ります。
で、本題ですが、REMOTE_ADDRがCloudFlareのものになってしまうのがかなり問題です。自前でアクセス解析を設置していたり、IPアドレスで、アクセス拒否をしていたりする全く使えなかったりするわけです。
Nginxを使っていても同様の問題が発生します。Apacheにモジュールを組み込むことで回避できるので、多分同じことをすればCloudFlareでもリアルなIPアドレスを取得できると思います。
[Linuxメモ]nginxでリバースプロキシしてみた – KUMA TYPE
今回は、CGIでIPを記録している場合の対処です。
How do I restore original visitor IP with vBulletin? – CloudFlare Support
解決策については、上記のリンク先に幾つか書かれていました。
実際に、環境変数を全部ファイルに出力してみると、リアルなIPアドレスが、下記の環境変数に設定されていました。
HTTP_CF_CONNECTING_IP
HTTP_X_FORWARDED_FOR
そういうわけで、上記の環境変数をみて、ない時はREMOTE_ADDRを見るようにすれば良いわけです。
sub REMOTE_ADDR{
($ENV{HTTP_CF_CONNECTING_IP}) ? $ENV{HTTP_CF_CONNECTING_IP} : $ENV{REMOTE_ADDR};
}
こんな感じのサブルーチンでいけると思います。
各httpサーバにもモジュールやパッチがあったり、CDNに対応しているのではないかと思います。
このブログにも利用したいのですが、サブドメインを色々使っているので、それらの検証や整理が面倒なので、ちょっと導入には勇気がいりそうです。その前にサーバーの引っ越しかなーと思っています。今使っているサーバーのパケットロスがひどくて、投稿も失敗するし、表示も遅いしで、ちょっとブログ更新する気力も失せてます。Nginx導入して早くなった分も全く帳消しにされています。安いVPSも考えものですね。
タグ :