無料のCDN、CloudFlareを使うと環境変数REMOTE_ADDRがCloudFlareのIPになってしまう件

WS2013-09-24_20_27_44

Home | CloudFlare | The web performance & security company

コンテンツデリバリネットワーク – Wikipedia

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も考えものですね。

タグ :