元の訪問者IPの復元
あなたの ウェブサイトのトラフィックがCloudflareネットワークを通じてルーティングされると ↗、私たちはリバースプロキシとして機能します。これにより、Cloudflareはパケットをより効率的にルーティングし、静的リソース(画像、JavaScript、CSSなど)をキャッシュすることでページの読み込み時間を短縮できます。その結果、リクエストに応答し、それらをログに記録する際に、オリジンサーバーは Cloudflare IPアドレス ↗を返します。
例えば、元の訪問者のIPアドレスに依存するアプリケーションをインストールすると、デフォルトでCloudflare IPアドレスがログに記録されます。元の訪問者のIPアドレスは、CF-Connecting-IPというHTTPヘッダーに追加されて表示されます。私たちのウェブサーバーの指示に従うことで、オリジンサーバーで元の訪問者のIPアドレスをログに記録できます。このHTTPヘッダーがオリジンサーバーにリクエストが到達したときに利用できない場合は、Transform RulesおよびManaged Transformsの設定を確認してください。
以下の図は、Cloudflareを使用している場合と使用していない場合のIPアドレスの取り扱いの違いを示しています。

Cloudflareはもはやmod_cloudflareの更新とサポートを行っていません。しかし、Ubuntu Server 18.04およびDebian 9 StretchのようなオペレーティングシステムでApacheウェブサーバーを使用している場合、mod_remoteipを使用して訪問者の元のIPアドレスをログに記録できます。
このモジュールは外部の団体によって作成されたため、プラグインに関連する問題について技術サポートを提供することはできません。
Apacheウェブサーバーにmod_remoteipをインストールするには:
- 次のコマンドを実行してmod_remoteipを有効にします:
sudo a2enmod remoteip- サイトの設定を更新してRemoteIPHeader CF-Connecting-IPを含めます。例:
/etc/apache2/sites-available/000-default.conf
ServerAdmin webmaster@localhostDocumentRoot /var/www/htmlServerName remoteip.andy.supportRemoteIPHeader CF-Connecting-IPErrorLog ${APACHE_LOG_DIR}/error.logCustomLog ${APACHE_LOG_DIR}/access.log combinedapache.conf内のcombined LogFormatエントリを更新し、%hを*%aに置き換えます。例:現在のLogFormat*が以下のようになっている場合
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combinedLogFormatを以下のように更新します:
LogFormat "%a %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined- 信頼できるプロキシアドレスを定義するために、
/etc/apache2/conf-available/remoteip.confを作成し、次のコードとCloudflare IPs ↗を入力します:
RemoteIPHeader CF-Connecting-IPRemoteIPTrustedProxy 192.0.2.1 (例のIPアドレス)RemoteIPTrustedProxy 192.0.2.2 (例のIPアドレス)(https://www.cloudflare.com/ips/にリストされているすべてのCloudflare IPについて繰り返します)- Apache設定を有効にします:
sudo a2enconf remoteipconf remoteipを有効にしました。新しい設定を有効にするには、次のコマンドを実行する必要があります:service apache2 reload- Apache設定をテストします:
sudo apache2ctl configtest構文はOKです- Apacheを再起動します:
sudo systemctl restart apache2mod_cloudflareをインストールする方法は2つあります:GitHubからApache拡張をダウンロードするか、オリジンサーバーにコードを追加することです。
Apacheウェブサーバーを使用している場合、GitHub ↗からmod_cloudflareをダウンロードできます。
mod_cloudflareをインストールできない場合、または元の訪問者IPを復元するためのCloudflareプラグインがコンテンツ管理システムプラットフォームに利用できない場合は、元の訪問者IPが必要な任意のページの<body>タグの前または中に次のコードを追加します:
<?php if (isset($_SERVER['HTTP_CF_CONNECTING_IP'])) $_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_CF_CONNECTING_IP'];?>このコマンドは、IPアドレスを必要とするスクリプトにのみIPアドレスを利用可能にします。実際のサーバーログにIPを保存することはありません。
mod_cloudflareを削除するには、mod_cloudflareを読み込むApache設定行をコメントアウトする必要があります。
これはLinuxディストリビューションによって異なりますが、ほとんどの人にとって、/etc/apache2内を検索すれば次の行を見つけることができるはずです:
LoadModule cloudflare_module
この行をコメントアウトまたは削除し、Apacheを再起動すると、mod_cloudflareは削除されるはずです。
UbuntuまたはDebianを実行している場合、次のように表示されるはずです。
file/etc/apache2/mods-enabled/cloudflare.load
このファイルを削除してmod_cloudflareを削除し、Apacheを再起動します。
_mod_cloudflare_はNginxには必要ありません。ngx_http_realip_module NGINXモジュール ↗と、ウェブサーバーの指示 ↗で説明されている設定パラメータを使用してください。
以下に、ウェブサーバーの種類に基づいて元の訪問者IPをログに記録する方法の指示を示します:
- 次のものがインストールされていることを確認してください:
- Red Hat/Fedora
sudo yum install httpd-devel libtool git - Debian/Ubuntu
sudo apt-get install apache2-dev libtool git
- Red Hat/Fedora
- mod_cloudflareの最新ビルドをクローンします:
- Red Hat/Fedora/Debian/Ubuntu:
git clone https://github.com/cloudflare/mod_cloudflare.git; cd mod_cloudflare
- Red Hat/Fedora/Debian/Ubuntu:
- Apache拡張ツールを使用して.cファイルをモジュールに変換します:
- Red Hat/Fedora/Debian/Ubuntu:
apxs -a -i -c mod_cloudflare.c
- Red Hat/Fedora/Debian/Ubuntu:
- モジュールがアクティブであることを確認して再起動します:
- Red Hat/Fedora
service httpd restart; httpd -M|grep cloudflare - Debian/Ubuntu:
sudo apachectl restart; apache2ctl -M|grep cloudflare
- Red Hat/Fedora
- ウェブサーバーがロードバランサーの背後にある場合、Apache設定(通常はhttpd.conf)に次の行を追加し、123.123.123.123をロードバランサーのIPアドレスに置き換えます:
IfModule cloudflare_moduleCloudFlareRemoteIPHeader X-Forwarded-ForCloudFlareRemoteIPTrustedProxy [あなたのロードバランサーのIPアドレスを挿入]DenyAllButCloudFlare/IfModulengx_http_realip_module Nginxモジュール ↗と次の設定パラメータを使用します:
set_real_ip_from 192.0.2.1 (例のIPアドレス)
#次の2つのいずれかを使用
real_ip_header CF-Connecting-IP;#real_ip_header X-Forwarded-For;このプレフィックスのリストは定期的に更新する必要があり、Cloudflare IPアドレス ↗に完全なリストを公開しています。
また、CloudflareとNGINX ↗も参照してください。
- 次のスクリプトを実行してEasyApacheの一部としてmod_cloudflareをインストールします:
bash <(curl -s https://raw.githubusercontent.com/cloudflare/mod_cloudflare/master/EasyApache/installer.sh) - インストール後、新しいmod_cloudflareプラグインでApacheを再コンパイルする必要があります。
- これを修正するには、Apache設定を開きます。これは通常、
/etc/apache2/apache2.conf、/etc/httpd/httpd.conf、/usr/local/apache/conf/httpd.conf、または設定に応じて他の場所にあります。わからない場合は、ホスティングプロバイダーに問い合わせてください。 - 最後に、
CloudflareRemoteIPTrustedProxy {LOOPBACK_ADDRESS}を追加します。サーバーが127.0.0.1にある場合、次のようになります:CloudflareRemoteIPTrustedProxy 127.0.0.1 - 信頼できるプロキシリストに追加するサーバーが複数ある場合は、最後に追加できます:CloudflareRemoteIPTrustedProxy 127.0.0.1 127.0.0.2
LighttpdがアクセスログとアプリケーションのサーバーIPを自動的に書き換えるには、以下の2つの解決策のいずれかに従うことができます。
- lighttpd.confファイルを開き、mod_extforwardをserver.modulesリストに追加します。アクセスログに実際のIPを表示するためには、mod_accesslogの後に来る必要があります。
- lighttpd.confファイルのサーバーモジュールリストの後に次のコードブロックを追加し、Lighttpdを再起動します。
$HTTP["remoteip"] == "192.2.0.1 (例のIPアドレス)"{extforward.forwarder = ( "all" => "trust" )extforward.headers = ("CF-Connecting-IP")}- LiteSpeed Web Admin Consoleに移動します。
- 設定で「ヘッダー内のクライアントIPを使用する」オプションを有効にします。
- 有効にすると、アクセスログに正しいIPアドレスが表示され、PHPの
$_SERVER['REMOTE_ADDR']変数にもCloudflare IPアドレスではなくクライアントの実際のIPアドレスが含まれるようになります。これにより、PHP対応のウェブサイト(WordPressやvBulletinインストールなど)でCloudflareを有効にした際に発生するほとんどの問題が解決されます。
Microsoft Community ↗の指示に従ってください。
IIS 8.5以降、カスタムロギングは組み込みオプションです。IIS Enhanced Logging ↗を参照してください。
-
IIS Managerで、作業中のサイトのアクションメニューでロギングをダブルクリックします。
-
これが起動したら、フォーマットとしてW3Cを選択し、次にLog Fileサブセクションのフォーマットドロップダウンの隣にあるフィールドを選択をクリックします。
-
フィールドを追加をクリックし、CF-Connecting-IPヘッダーを追加します。
-
OKをクリックします。新しいエントリがカスタムフィールドの下に反映されるはずです。ロギングウィンドウに戻ったら適用をクリックします。
-
これが成功すると、ログファイルにはアンダースコアが表示されるはずです。また、フィールドの変更も確認できます。
-
サイトを再起動し、次にW3SVC、変更がすぐに反映されない場合はインスタンス全体を再起動します。IIS 8.5以降の拡張ロギングを使用する場合、アプリケーションレベルで元の訪問者IPを復元しません。
Tomcat7がアクセスログとアプリケーションに元の訪問者IPを自動的に復元するには、ログスキーマに%{CF-Connecting-IP}iを追加する必要があります。
例として、次のブロックをserver.xmlファイルに追加できます。
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log." suffix=".txt" pattern="%{CF-Connecting-IP}i - %h %u %t - "%r" - %s - %b - %{CF-RAY}i"/>これにより、ログは次のようになります:
訪問者IP - Cloudflare IP - [04/Dec/2014:23:18:15 -0500] - "GET / HTTP/1.1" - 200 - 1895 - 193d704b85200296-SJC
MagentoとCloudflareを使用して元の訪問者IPを復元する ↗に関するこのサードパーティのチュートリアルを参照してください。
同様に、CloudflareはこのMagento拡張機能 ↗を作成していませんが、一部の顧客は役立つと感じています。
このプラグインは外部の団体によって作成されたため、プラグインに関連する問題について技術サポートを提供することはできません。
Cloudflareを介してInvision Power Board 3インストールを実行する際に正しいIPマッチングを有効にするには、次の指示に従ってください:
IPBインストールのACPにログインします。
- システムをクリックします。
- 概要の下でセキュリティをクリックします。
- セキュリティセンターの下でセキュリティ設定をクリックします。*プロキシによって提供されたIPアドレスを信頼しますか?*が緑色になっていることを確認します。
ネットワーク環境によっては、リクエストがプロキシを介して処理される場合(オフィスや大学のイントラネット状況、またはロードバランサーのサーバークラスター上など)、正しいIPアドレスが使用されるようにこの設定を有効にする必要があります。ただし、有効にすると、悪意のあるユーザーが偽のIPアドレスを提供するためにシステムを悪用する可能性があります。ほとんどの環境では、この設定はオフのままにしておくべきです。
Apacheサーバーを使用している場合、訪問者IPをログに復元するためにmod_remoteip ↗をインストールすることをお勧めします。
サーバーにアクセスしてモジュールをインストールできない場合は、コアを修正する ↗ことができるかもしれません。
MyBBの最近のバージョンには、ユーザーのIPアドレスを精査するオプションが含まれています。
Admin CP > 設定 > サーバーと最適化オプション > ユーザーのIPアドレスを精査しますか? > はい
代わりに、MyBB 1.6用のCloudflare管理プラグイン ↗をインストールすることもできます。
./inc/functions.phpに移動します。- 2790行目に移動します。
if(isset($_SERVER['REMOTE_ADDR']))をif(isset($_SERVER['HTTP_CF_CONNECTING_IP']))に置き換えます。- 次に、
$ip = $_SERVER['REMOTE_ADDR'];を$ip = $_SERVER['HTTP_CF_CONNECTING_IP'];に置き換えます。
Vanillaチームのメンバーが、自己ホスト型サイトのログファイルに元の訪問者IPを復元するためのCloudflareプラグイン ↗を作成しました。
このプラグインは外部の団体によって作成されたため、プラグインに関連する問題について技術サポートを提供することはできません。MediaWiki
includes/GlobalFunctions.phpを開きます。約370行目で、次のように変更します:$forward = "\t(proxied via {$_SERVER['REMOTE_ADDR']}{$forward})";を$forward = "\t(proxied via {$_SERVER['HTTP_CF_CONNECTING_IP']}{$forward})";に変更します。includes/ProxyTools.phpを開きます。約79行目で、if ( isset( $_SERVER['REMOTE_ADDR'] ) ){を見つけて、if ( isset( $_SERVER['HTTP_CF_CONNECTING_IP'] ) ){に置き換えます。この2番目のステップはMediaWikiバージョン1.18.0以前にのみ適用されます。新しいバージョンのMediaWikiではProxyTools.phpが完全に書き換えられており、以下のコードはもはや存在しません。- 約80行目で、
$ipchain = array( IP::canonicalize($_SERVER['REMOTE_ADDR']) );を見つけて、保存してオリジナルのWebサーバーにアップロードします。
GlobalFunctions.phpの1232行目に移動し、REMOTE_ADDRをHTTP_CF_CONNECTING_IPに変更します。- 次に、
WebRequest.phpに移動し、1151行目から1159行目までのREMOTE_ADDRをHTTP_CF_CONNECTING_IPに変更します。
XenForoユーザーがCloudflare用のプラグイン ↗を作成しました。
このプラグインは外部の団体によって作成されたため、プラグインに関連する問題について技術サポートを提供することはできません。
library/config.phpを開きます。- 最後に、
if (isset($_SERVER['HTTP_CF_CONNECTING_IP'])) { $_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_CF_CONNECTING_IP'];}を追加します。 - アップロードして上書きします。
外部の団体がCloudflareとPunBB用のモジュール ↗を作成し、元の訪問者IPを復元します。
このプラグインは外部の団体によって作成されたため、プラグインに関連する問題について技術サポートを提供することはできません。Cherokeeサーバー
- サーバーで
cherokee-adminを起動します。 - WebブラウザでCherokee管理インターフェースに移動します。
- Cloudflareによってサービスされているドメインの仮想サーバーを選択します。
- 選択した仮想サーバーのログタブで、Accept Forwarded IPsを有効にします。
- Accept from Hostsボックスに、CloudflareのIPアドレス ↗を入力します。
Livezillaサーバー設定のPHP IP Server ParamフィールドをHTTP_CF_CONNECTING_IPに変更することで、IPアドレスを修正できます。
DataLife Engineに訪問者IPを復元するには:
- /engine/inc/include/functions.inc.phpを開き、
$db_ip_split = explode( ".", $_SERVER['REMOTE_ADDR'] );を見つけて、$db_ip_split = explode(".", $_SERVER['HTTP_CF_CONNECTING_IP'] );に変更します。 $_SERVER['REMOTE_ADDR']を見つけて、$ip_split = explode(".", $_SERVER['HTTP_CF_CONNECTING_IP'] );に変更します。- /engine/modules/addcomments.phpを開き、
$_SERVER['REMOTE_ADDR'],を見つけて、$_SERVER['HTTP_CF_CONNECTING_IP'],に変更します。 $db_ip_split = explode( ".", $_SERVER['REMOTE_ADDR'] );を見つけて、$db_ip_split = explode( ".", $_SERVER['HTTP_CF_CONNECTING_IP'] );に変更します。
外部の開発者が、元の訪問者IPをログに復元するためのCloudflare拡張機能 ↗を作成しました。この拡張機能は、Cloudflareキャッシュをクリアする機能も提供します。
このプラグインは外部の団体によって作成されたため、プラグインに関連する問題について技術サポートを提供することはできません。
ホスティングコントロールパネルVestaCPを使用している場合、サーバー上でNginxとApacheの両方が実行されています。リクエストはApacheに行く前にNginxを通じてプロキシされます。
このNginxプロキシのため、実際にはNginxを構成して本物の訪問者IPアドレスを返すための指示が必要です。Mod_remoteip ↗は、Nginxサーバーを一部のリクエストに対して無効にしない限り必要ありません。mod_remoteip ↗をApacheに追加しても、Nginxサーバーの構成と競合することはありません。
外部の開発者が訪問者IPを復元するためのモジュールnode_cloudflare ↗を作成しました。
X_FORWARDED_FORヘッダーから元のクライアントIPを抽出するには、HAProxyで次の構成を使用する必要があります:
- https://www.cloudflare.com/en-gb/ips/ ↗からすべてのIP範囲を含むテキストファイル
CF_ips.lstを作成します。 - HAProxyで
option forwardforを無効にします。
HAProxyの設定:
acl from_cf src -f /path/to/CF_ips.lstacl cf_ip_hdr req.hdr(CF-Connecting-IP) -m foundhttp-request set-header X-Forwarded-For %[req.hdr(CF-Connecting-IP)] if from_cf cf_ip_hdrEnvoy Gatewayの元のクライアントIPを抽出するには、Client Traffic Policy ↗を設定して、カスタムCF-Connecting-IPヘッダーを探します。
clientIPDetection: customHeader: name: CF-Connecting-IP failClosed: true詳細については、カスタムヘッダーの元のIP検出拡張機能 ↗を参照してください。