Skip to content

非公式本サイトは非公式の日本語ドキュメントであり、Cloudflare 公式サイトではありません。最新情報はdevelopers.cloudflare.comをご確認ください。

元の訪問者 IP を復元する

最終更新 Markdown で表示Agent セットアップ

ウェブサイトのトラフィックが Cloudflare ネットワーク経由でルーティングされる と、Cloudflare はリバースプロキシとして動作します。パケットをより効率よく振り分け、静的リソース(画像、JavaScript、CSS など)をキャッシュすることで、ページの読み込みを速くできます。その結果、オリジンサーバーがリクエストに応答してログに残す IP は、Cloudflare の IP アドレス になります。

たとえば、元の訪問者の受信 IP アドレスに依存するアプリケーションを入れている場合、既定では Cloudflare の IP アドレスが記録されます。元の訪問者 IP アドレスは、追加される HTTP ヘッダー CF-Connecting-IP に入ります。Web サーバーの手順 に従うと、オリジンサーバーで元の訪問者 IP アドレスを記録できます。リクエストがオリジンサーバーに届いたときにこの HTTP ヘッダーがない場合は、Transform RulesManaged Transforms の設定を確認してください。

次の図は、Cloudflare を使う場合と使わない場合で、IP アドレスの扱いがどう異なるかを示します。

Cloudflare を使う場合と使わない場合で、IP アドレスの扱いがどう異なるかを示す図です。

mod_remoteip

Cloudflare は mod_cloudflare の更新とサポートを終了しています。ただし、Ubuntu Server 18.04Debian 9 Stretch などの OS で Apache Web サーバーを使っている場合は、mod_remoteip で訪問者の元の IP アドレスを記録できます。

このモジュールは外部の方が作成したものです。プラグインに関する問題について、技術サポートは提供できません。

Apache Web サーバーに mod_remoteip をインストールするには、次の手順を実行します。

  1. 次のコマンドで mod_remoteip を有効にします。
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 を更新し、/etc/apache2/apache2.conf%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. 信頼するプロキシアドレスを定義するため、次のコードと Cloudflare の IP を入れて /etc/apache2/conf-available/remoteip.conf を作成します。
RemoteIPHeader CF-Connecting-IP
RemoteIPTrustedProxy 192.0.2.1 (example IP address)
RemoteIPTrustedProxy 192.0.2.2 (example IP address)
(repeat for all Cloudflare IPs listed at https://www.cloudflare.com/ips/)
  1. Apache の設定を有効にします。
sudo a2enconf remoteip
Enabling conf remoteip.
To activate the new configuration, you need to run:
service apache2 reload
  1. Apache の設定をテストします。
sudo apache2ctl configtest
Syntax OK
  1. Apache を再起動します。
sudo systemctl restart apache2

mod_cloudflare

インストール

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

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

Apache Web サーバーを使っている場合は、GitHub から mod_cloudflare をダウンロードできます。

オリジン Web サーバーにコードを追加する

mod_cloudflare をインストールできない場合や、元の訪問者 IP を復元する Cloudflare プラグインが CMS にない場合は、元の訪問者 IP が必要なページの <body> タグ内、またはその直前に、次のコードをオリジン Web サーバーへ追加します。

<?php if (isset($_SERVER['HTTP_CF_CONNECTING_IP'])) $_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_CF_CONNECTING_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

Nginx では mod_cloudflare は不要です。代わりに ngx_http_realip_module NGINX モジュール と、Web サーバーの手順 に記載の設定パラメーターを使います。


Web サーバーの手順

Web サーバーの種類に応じて、元の訪問者 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. Web サーバーがロードバランサーの背後にある場合は、Apache の設定(通常は httpd.conf)に次の行を追加し、123.123.123.123 をロードバランサーの IP アドレスに置き換えます。
IfModule cloudflare_module
CloudFlareRemoteIPHeader X-Forwarded-For
CloudFlareRemoteIPTrustedProxy [insert your load balancer’s IP address]
DenyAllButCloudFlare
/IfModule

Nginx

ngx_http_realip_module Nginx モジュール と、次の設定パラメーターを使います。

#example IP address
set_real_ip_from 192.0.2.1; 

#use any of the following two

real_ip_header CF-Connecting-IP;
#real_ip_header X-Forwarded-For;

このプレフィックス一覧は定期的な更新が必要です。完全な一覧は Cloudflare の IP アドレス で公開しています。

あわせて Cloudflare and 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 を自動で書き換えるには、次のいずれかの方法を使えます。

  1. lighttpd.conf を開き、server.modules リストに mod_extforward を追加します。アクセスログに実 IP を出すには、mod_accesslogあとに置く必要があります
  2. サーバーモジュール一覧のあと、lighttpd.conf の任意の場所に次のコードブロックを追加し、Lighttpd を再起動します
$HTTP["remoteip"] == "192.2.0.1 (example IP address)"
{
extforward.forwarder = ( "all" => "trust" )
extforward.headers = ("CF-Connecting-IP")
}

LiteSpeed サーバー

  1. LiteSpeed Web Admin Console を開きます。
  2. Configuration で Use Client IP in Header オプションを有効にします。
  3. 有効にすると、アクセスログに正しい IP アドレスが表示されます。PHP の $_SERVER['REMOTE_ADDR'] 変数にも、Cloudflare の IP アドレスではなくクライアントの実 IP アドレスが入ります。これで、WordPress や vBulletin など PHP を使うサイトで Cloudflare を有効にしたときに起きやすい問題の多くが解消します。

Microsoft IIS

IIS 7 - 8 の場合:

Microsoft Community の手順に従ってください。

IIS 8.5 - 10 の場合:

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

  1. IIS Manager で、対象サイトの Actions メニューにある Logging をダブルクリックします。

  2. 起動したら、形式として W3C を選び、Log File セクションの形式ドロップダウンの横にある Select Fields をクリックします。

  3. Add Field をクリックし、CF-Connecting-IP ヘッダーを追加します。

  4. Ok をクリックします。Custom Fields に新しい項目が表示されます。Logging 画面に戻ったら Apply をクリックします。

  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"/>

ログは次のようになります。

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

Magento

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

同様に、この Magento 拡張 は Cloudflare が作成したものではありませんが、役立つと感じているお客様もいます。

このプラグインは外部の方が作成したものです。プラグインに関する問題について、技術サポートは提供できません。

IPB(Invision Power Board)

Cloudflare 経由で Invision Power Board 3 を運用している場合に、正しい IP 照合を有効にする手順は次のとおりです。

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

  1. System をクリックします。
  2. Overview で Security をクリックします。
  3. Security Center で Security Settings をクリックします。Trust IP addresses provided by proxies? が緑色であることを確認します。

Trust IP addresses provided by proxies? の IPB4 での説明

ネットワーク環境によりリクエストがプロキシ経由になる場合(オフィスや大学のイントラネット、ロードバランサー構成のサーバークラスターなど)は、正しい IP アドレスを使うためにこの設定を有効にする必要があることがあります。ただし、有効にすると、悪意のあるユーザーが偽の IP アドレスを渡せるようになります。ほとんどの環境では、この設定はオフのままにしてください。

PHPBB

Apache サーバーを使っている場合は、ログに訪問者 IP を戻すために mod_remoteip のインストールを推奨します。

サーバーにアクセスして mod をインストールできない場合は、コアを変更 できることがあります。

MyBB フォーラム

比較的新しい MyBB には、Scrutinize User's IP address オプションがあります。

Admin CP > Configuration > Server and Optimization Options > Scrutinize User's IP address? > Yes

または、MyBB 1.6 向けの Cloudflare management plugin をインストールできます。

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 フォーラム

Vanilla チームのメンバーが、セルフホストサイトのログに元の訪問者 IP を戻す Cloudflare plugin for Vanilla を作成しています。

このプラグインは外部の方が作成したものです。プラグインに関する問題について、技術サポートは提供できません。

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 以前にだけ適用されます。新しいバージョンでは 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

外部の方が、元の訪問者 IP を復元する Cloudflare と PunBB 向けモジュール を作成しています。

このプラグインは外部の方が作成したものです。プラグインに関する問題について、技術サポートは提供できません。

Cherokee サーバー

  1. サーバーで cherokee-admin を起動します。
  2. Web ブラウザーで Cherokee Administration interface を開きます。
  3. Cloudflare で配信しているドメインの Virtual Server を選びます。
  4. 選んだ Virtual ServerLogging タブで、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. 次を見つけます。$ip_split = explode( ".", $_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 を戻す TYPO3 向け Cloudflare 拡張 を作成しています。この拡張では、Cloudflare キャッシュの削除もできます。

このプラグインは外部の方が作成したものです。プラグインに関する問題について、技術サポートは提供できません。

VestaCP

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

この Nginx プロキシがあるため、実訪問者 IP を返すには Nginx の設定手順に従う必要があります。一部のリクエストで Nginx を無効にする場合を除き、Apache 向けの mod_remoteip は不要です。Apache に mod_remoteip を追加しても、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 を取り出すには、カスタム CF-Connecting-IP ヘッダー を参照する Client Traffic Policy を設定します。

Client Traffic Policy の抜粋例txt
clientIPDetection:
    customHeader:
        name: CF-Connecting-IP
        failClosed: true

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

Caddy

Caddy の背後で X-Forwarded-For ヘッダーに依存するアプリケーションを動かしている場合、Cloudflare の CF-Connecting-IP ヘッダー でヘッダーを上書きするよう Caddy を設定できます。

あわせて、Cloudflare の IP アドレス からのトラフィックだけを受け付けることを推奨します。そうしないと、ヘッダーを偽装されるおそれがあります。そのため、2 つ目の例では Caddy の設定内でこの制限を行います。ファイアウォール側で処理することもでき、自動化しやすい場合が多いです。すでにファイアウォールなどで制限している場合、Caddyfile は次のようになります。

Caddyfiletxt
https://example.com {
    reverse_proxy localhost:8080 {
				# Sets X-Forwarded-For as the value Cloudflare gives us for CF-Connecting-IP.
				header_up X-Forwarded-For {http.request.header.CF-Connecting-IP}
		}
}

Cloudflare の IP アドレス からのトラフィックだけを Caddy で受け付ける場合は、次のような設定を使えます。

Caddyfiletxt
https://example.com {
    # Restrict access to Cloudflare IPs (https://www.cloudflare.com/ips/)
    @cloudflare {
        remote_ip 173.245.48.0/20 103.21.244.0/22 103.22.200.0/22 103.31.4.0/22 141.101.64.0/18 108.162.192.0/18 190.93.240.0/20 188.114.96.0/20 197.234.240.0/22 198.41.128.0/17 162.158.0.0/15 104.16.0.0/13 104.24.0.0/14 172.64.0.0/13 131.0.72.0/22 2400:cb00::/32 2606:4700::/32 2803:f800::/32 2405:b500::/32 2405:8100::/32 2a06:98c0::/29 2c0f:f248::/32
    }

    # Process requests from Cloudflare IPs
    handle @cloudflare {
        reverse_proxy localhost:8080 {
            # Sets X-Forwarded-For as the value Cloudflare gives us for CF-Connecting-IP.
            header_up X-Forwarded-For {http.request.header.CF-Connecting-IP}
        }
    }

    # Deny requests from non-Cloudflare IPs
    handle {
        respond "Access Denied" 403
    }
}

関連リソース

役に立ちましたか?