コンテンツにスキップ

元の訪問者IPの復元

あなたの ウェブサイトのトラフィックがCloudflareネットワークを通じてルーティングされると、私たちはリバースプロキシとして機能します。これにより、Cloudflareはパケットをより効率的にルーティングし、静的リソース(画像、JavaScript、CSSなど)をキャッシュすることでページの読み込み時間を短縮できます。その結果、リクエストに応答し、それらをログに記録する際に、オリジンサーバーは Cloudflare IPアドレスを返します。

例えば、元の訪問者のIPアドレスに依存するアプリケーションをインストールすると、デフォルトでCloudflare IPアドレスがログに記録されます。元の訪問者のIPアドレスは、CF-Connecting-IPというHTTPヘッダーに追加されて表示されます。私たちのウェブサーバーの指示に従うことで、オリジンサーバーで元の訪問者のIPアドレスをログに記録できます。このHTTPヘッダーがオリジンサーバーにリクエストが到達したときに利用できない場合は、Transform RulesおよびManaged Transformsの設定を確認してください。

以下の図は、Cloudflareを使用している場合と使用していない場合のIPアドレスの取り扱いの違いを示しています。

この図は、Cloudflareを使用している場合と使用していない場合のIPアドレスの取り扱いの違いを示しています。


mod_remoteip

Cloudflareはもはやmod_cloudflareの更新とサポートを行っていません。しかし、Ubuntu Server 18.04およびDebian 9 StretchのようなオペレーティングシステムでApacheウェブサーバーを使用している場合、mod_remoteipを使用して訪問者の元のIPアドレスをログに記録できます。

このモジュールは外部の団体によって作成されたため、プラグインに関連する問題について技術サポートを提供することはできません。

Apacheウェブサーバーにmod_remoteipをインストールするには:

  1. 次のコマンドを実行してmod_remoteipを有効にします:
Terminal window
sudo a2enmod remoteip
  1. サイトの設定を更新してRemoteIPHeader CF-Connecting-IPを含めます。例:/etc/apache2/sites-available/000-default.conf
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ServerName remoteip.andy.support
RemoteIPHeader CF-Connecting-IP
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
  1. apache.conf内のcombined LogFormatエントリを更新し、%hを*%aに置き換えます。例:現在のLogFormat*が以下のようになっている場合
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined

LogFormatを以下のように更新します:

LogFormat "%a %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
  1. 信頼できるプロキシアドレスを定義するために、/etc/apache2/conf-available/remoteip.confを作成し、次のコードとCloudflare IPsを入力します:
RemoteIPHeader CF-Connecting-IP
RemoteIPTrustedProxy 192.0.2.1 (例のIPアドレス)
RemoteIPTrustedProxy 192.0.2.2 (例のIPアドレス)
(https://www.cloudflare.com/ips/にリストされているすべてのCloudflare IPについて繰り返します)
  1. Apache設定を有効にします:
Terminal window
sudo a2enconf remoteip
conf remoteipを有効にしました。
新しい設定を有効にするには、次のコマンドを実行する必要があります:
service apache2 reload
  1. Apache設定をテストします:
Terminal window
sudo apache2ctl configtest
構文はOKです
  1. Apacheを再起動します:
Terminal window
sudo systemctl restart apache2

mod_cloudflare

インストール

mod_cloudflareをインストールする方法は2つあります:GitHubからApache拡張をダウンロードするか、オリジンサーバーにコードを追加することです。

GitHubからパッケージまたはスクリプトをダウンロードする

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を保存することはありません。

削除

Apache

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を再起動します。

Nginx

_mod_cloudflare_はNginxには必要ありません。ngx_http_realip_module NGINXモジュールと、ウェブサーバーの指示で説明されている設定パラメータを使用してください。


ウェブサーバーの指示

以下に、ウェブサーバーの種類に基づいて元の訪問者IPをログに記録する方法の指示を示します:

Apache 2.4

  1. 次のものがインストールされていることを確認してください:
    • Red Hat/Fedorasudo yum install httpd-devel libtool git
    • Debian/Ubuntusudo apt-get install apache2-dev libtool git
  2. mod_cloudflareの最新ビルドをクローンします:
    • Red Hat/Fedora/Debian/Ubuntu:git clone https://github.com/cloudflare/mod_cloudflare.git; cd mod_cloudflare
  3. Apache拡張ツールを使用して.cファイルをモジュールに変換します:
    • Red Hat/Fedora/Debian/Ubuntu:apxs -a -i -c mod_cloudflare.c
  4. モジュールがアクティブであることを確認して再起動します:
    • Red Hat/Fedoraservice httpd restart; httpd -M|grep cloudflare
    • Debian/Ubuntu:sudo apachectl restart; apache2ctl -M|grep cloudflare
  5. ウェブサーバーがロードバランサーの背後にある場合、Apache設定(通常はhttpd.conf)に次の行を追加し、123.123.123.123をロードバランサーのIPアドレスに置き換えます:
IfModule cloudflare_module
CloudFlareRemoteIPHeader X-Forwarded-For
CloudFlareRemoteIPTrustedProxy [あなたのロードバランサーのIPアドレスを挿入]
DenyAllButCloudFlare
/IfModule

Nginx

ngx_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とcPanel

  1. 次のスクリプトを実行してEasyApacheの一部としてmod_cloudflareをインストールします:bash <(curl -s https://raw.githubusercontent.com/cloudflare/mod_cloudflare/master/EasyApache/installer.sh)
  2. インストール後、新しいmod_cloudflareプラグインでApacheを再コンパイルする必要があります。
  3. これを修正するには、Apache設定を開きます。これは通常、/etc/apache2/apache2.conf/etc/httpd/httpd.conf/usr/local/apache/conf/httpd.conf、または設定に応じて他の場所にあります。わからない場合は、ホスティングプロバイダーに問い合わせてください。
  4. 最後に、CloudflareRemoteIPTrustedProxy {LOOPBACK_ADDRESS}を追加します。サーバーが127.0.0.1にある場合、次のようになります:CloudflareRemoteIPTrustedProxy 127.0.0.1
  5. 信頼できるプロキシリストに追加するサーバーが複数ある場合は、最後に追加できます:CloudflareRemoteIPTrustedProxy 127.0.0.1 127.0.0.2

Lighttpd

LighttpdがアクセスログとアプリケーションのサーバーIPを自動的に書き換えるには、以下の2つの解決策のいずれかに従うことができます。

  1. lighttpd.confファイルを開き、mod_extforwardserver.modulesリストに追加します。アクセスログに実際のIPを表示するためには、mod_accesslogに来る必要があります。
  2. lighttpd.confファイルのサーバーモジュールリストの後に次のコードブロックを追加し、Lighttpdを再起動します。
$HTTP["remoteip"] == "192.2.0.1 (例のIPアドレス)"
{
extforward.forwarder = ( "all" => "trust" )
extforward.headers = ("CF-Connecting-IP")
}

LiteSpeedサーバー

  1. LiteSpeed Web Admin Consoleに移動します。
  2. 設定で「ヘッダー内のクライアントIPを使用する」オプションを有効にします。
  3. 有効にすると、アクセスログに正しいIPアドレスが表示され、PHPの$_SERVER['REMOTE_ADDR']変数にもCloudflare IPアドレスではなくクライアントの実際のIPアドレスが含まれるようになります。これにより、PHP対応のウェブサイト(WordPressやvBulletinインストールなど)でCloudflareを有効にした際に発生するほとんどの問題が解決されます。

Microsoft IIS

IIS 7 - 8:

Microsoft Communityの指示に従ってください。

IIS 8.5 - 10:

IIS 8.5以降、カスタムロギングは組み込みオプションです。IIS Enhanced Loggingを参照してください。

  1. IIS Managerで、作業中のサイトのアクションメニューでロギングをダブルクリックします。

  2. これが起動したら、フォーマットとしてW3Cを選択し、次にLog Fileサブセクションのフォーマットドロップダウンの隣にあるフィールドを選択をクリックします。

  3. フィールドを追加をクリックし、CF-Connecting-IPヘッダーを追加します。

  4. OKをクリックします。新しいエントリがカスタムフィールドの下に反映されるはずです。ロギングウィンドウに戻ったら適用をクリックします。

  5. これが成功すると、ログファイルにはアンダースコアが表示されるはずです。また、フィールドの変更も確認できます。

  6. サイトを再起動し、次にW3SVC、変更がすぐに反映されない場合はインスタンス全体を再起動します。IIS 8.5以降の拡張ロギングを使用する場合、アプリケーションレベルで元の訪問者IPを復元しません

Tomcat 7

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 - &quot;%r&quot; - %s - %b - %{CF-RAY}i"/>

これにより、ログは次のようになります:

訪問者IP - Cloudflare IP - [04/Dec/2014:23:18:15 -0500] - "GET / HTTP/1.1" - 200 - 1895 - 193d704b85200296-SJC

Magento

MagentoとCloudflareを使用して元の訪問者IPを復元するに関するこのサードパーティのチュートリアルを参照してください。

同様に、CloudflareはこのMagento拡張機能を作成していませんが、一部の顧客は役立つと感じています。

このプラグインは外部の団体によって作成されたため、プラグインに関連する問題について技術サポートを提供することはできません。

IPB (Invision Power Board)

Cloudflareを介してInvision Power Board 3インストールを実行する際に正しいIPマッチングを有効にするには、次の指示に従ってください:

IPBインストールのACPにログインします。

  1. システムをクリックします。
  2. 概要の下でセキュリティをクリックします。
  3. セキュリティセンターの下でセキュリティ設定をクリックします。*プロキシによって提供されたIPアドレスを信頼しますか?*が緑色になっていることを確認します。

IPB4の*プロキシによって提供されたIPアドレスを信頼しますか?*の説明

ネットワーク環境によっては、リクエストがプロキシを介して処理される場合(オフィスや大学のイントラネット状況、またはロードバランサーのサーバークラスター上など)、正しいIPアドレスが使用されるようにこの設定を有効にする必要があります。ただし、有効にすると、悪意のあるユーザーが偽のIPアドレスを提供するためにシステムを悪用する可能性があります。ほとんどの環境では、この設定はオフのままにしておくべきです。

PHPBB

Apacheサーバーを使用している場合、訪問者IPをログに復元するためにmod_remoteipをインストールすることをお勧めします。

サーバーにアクセスしてモジュールをインストールできない場合は、コアを修正することができるかもしれません。

MyBBフォーラム

MyBBの最近のバージョンには、ユーザーのIPアドレスを精査するオプションが含まれています。

Admin CP > 設定 > サーバーと最適化オプション > ユーザーのIPアドレスを精査しますか? > はい

代わりに、MyBB 1.6用のCloudflare管理プラグインをインストールすることもできます。

MyBB 1.6.0、1.6.1、1.6.2、または1.6.3

  1. ./inc/functions.phpに移動します。
  2. 2790行目に移動します。
  3. if(isset($_SERVER['REMOTE_ADDR']))if(isset($_SERVER['HTTP_CF_CONNECTING_IP']))に置き換えます。
  4. 次に、$ip = $_SERVER['REMOTE_ADDR'];$ip = $_SERVER['HTTP_CF_CONNECTING_IP'];に置き換えます。

Vanilla forums

Vanillaチームのメンバーが、自己ホスト型サイトのログファイルに元の訪問者IPを復元するためのCloudflareプラグインを作成しました。

このプラグインは外部の団体によって作成されたため、プラグインに関連する問題について技術サポートを提供することはできません。MediaWiki

  1. includes/GlobalFunctions.phpを開きます。約370行目で、次のように変更します:$forward = "\t(proxied via {$_SERVER['REMOTE_ADDR']}{$forward})";$forward = "\t(proxied via {$_SERVER['HTTP_CF_CONNECTING_IP']}{$forward})";に変更します。
  2. includes/ProxyTools.phpを開きます。約79行目で、if ( isset( $_SERVER['REMOTE_ADDR'] ) ){を見つけて、if ( isset( $_SERVER['HTTP_CF_CONNECTING_IP'] ) ){に置き換えます。この2番目のステップはMediaWikiバージョン1.18.0以前にのみ適用されます。新しいバージョンのMediaWikiではProxyTools.phpが完全に書き換えられており、以下のコードはもはや存在しません。
  3. 約80行目で、$ipchain = array( IP::canonicalize($_SERVER['REMOTE_ADDR']) );を見つけて、保存してオリジナルのWebサーバーにアップロードします。

バージョン1.27.1周辺の場合:

  1. GlobalFunctions.phpの1232行目に移動し、REMOTE_ADDRHTTP_CF_CONNECTING_IPに変更します。
  2. 次に、WebRequest.phpに移動し、1151行目から1159行目までのREMOTE_ADDRHTTP_CF_CONNECTING_IPに変更します。

XenForo

XenForoユーザーがCloudflare用のプラグインを作成しました。

このプラグインは外部の団体によって作成されたため、プラグインに関連する問題について技術サポートを提供することはできません。

  1. library/config.phpを開きます。
  2. 最後に、if (isset($_SERVER['HTTP_CF_CONNECTING_IP'])) { $_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_CF_CONNECTING_IP'];}を追加します。
  3. アップロードして上書きします。

PunBB

外部の団体がCloudflareとPunBB用のモジュールを作成し、元の訪問者IPを復元します。

このプラグインは外部の団体によって作成されたため、プラグインに関連する問題について技術サポートを提供することはできません。Cherokeeサーバー

  1. サーバーでcherokee-adminを起動します。
  2. WebブラウザでCherokee管理インターフェースに移動します。
  3. Cloudflareによってサービスされているドメインの仮想サーバーを選択します。
  4. 選択した仮想サーバーログタブで、Accept Forwarded IPsを有効にします。
  5. Accept from Hostsボックスに、CloudflareのIPアドレスを入力します。

Livezilla

Livezillaサーバー設定のPHP IP Server ParamフィールドをHTTP_CF_CONNECTING_IPに変更することで、IPアドレスを修正できます。

Datalife Engine

DataLife Engineに訪問者IPを復元するには:

  1. /engine/inc/include/functions.inc.phpを開き、$db_ip_split = explode( ".", $_SERVER['REMOTE_ADDR'] );を見つけて、$db_ip_split = explode(".", $_SERVER['HTTP_CF_CONNECTING_IP'] );に変更します。
  2. $_SERVER['REMOTE_ADDR']を見つけて、$ip_split = explode(".", $_SERVER['HTTP_CF_CONNECTING_IP'] );に変更します。
  3. /engine/modules/addcomments.phpを開き、$_SERVER['REMOTE_ADDR'],を見つけて、$_SERVER['HTTP_CF_CONNECTING_IP'],に変更します。
  4. $db_ip_split = explode( ".", $_SERVER['REMOTE_ADDR'] );を見つけて、$db_ip_split = explode( ".", $_SERVER['HTTP_CF_CONNECTING_IP'] );に変更します。

TYPO3

外部の開発者が、元の訪問者IPをログに復元するためのCloudflare拡張機能を作成しました。この拡張機能は、Cloudflareキャッシュをクリアする機能も提供します。

このプラグインは外部の団体によって作成されたため、プラグインに関連する問題について技術サポートを提供することはできません。

VestaCP

ホスティングコントロールパネルVestaCPを使用している場合、サーバー上でNginxとApacheの両方が実行されています。リクエストはApacheに行く前にNginxを通じてプロキシされます。

このNginxプロキシのため、実際にはNginxを構成して本物の訪問者IPアドレスを返すための指示が必要です。Mod_remoteipは、Nginxサーバーを一部のリクエストに対して無効にしない限り必要ありません。mod_remoteipをApacheに追加しても、Nginxサーバーの構成と競合することはありません。

node.js

外部の開発者が訪問者IPを復元するためのモジュールnode_cloudflareを作成しました。

HAProxy

X_FORWARDED_FORヘッダーから元のクライアントIPを抽出するには、HAProxyで次の構成を使用する必要があります:

  1. https://www.cloudflare.com/en-gb/ips/からすべてのIP範囲を含むテキストファイルCF_ips.lstを作成します。
  2. HAProxyでoption forwardforを無効にします。

HAProxyの設定:

acl from_cf src -f /path/to/CF_ips.lst
acl cf_ip_hdr req.hdr(CF-Connecting-IP) -m found
http-request set-header X-Forwarded-For %[req.hdr(CF-Connecting-IP)] if from_cf cf_ip_hdr

Envoy Gateway

Envoy Gatewayの元のクライアントIPを抽出するには、Client Traffic Policyを設定して、カスタムCF-Connecting-IPヘッダーを探します。

切り捨てられたクライアントトラフィックポリシーの例
clientIPDetection:
customHeader:
name: CF-Connecting-IP
failClosed: true

詳細については、カスタムヘッダーの元のIP検出拡張機能を参照してください。


関連リソース