ウェブサイトのトラフィックが Cloudflare ネットワーク経由でルーティングされる と、Cloudflare はリバースプロキシとして動作します。パケットをより効率よく振り分け、静的リソース(画像、JavaScript、CSS など)をキャッシュすることで、ページの読み込みを速くできます。その結果、オリジンサーバーがリクエストに応答してログに残す IP は、Cloudflare の IP アドレス ↗ になります。
たとえば、元の訪問者の受信 IP アドレスに依存するアプリケーションを入れている場合、既定では Cloudflare の IP アドレスが記録されます。元の訪問者 IP アドレスは、追加される HTTP ヘッダー CF-Connecting-IP に入ります。Web サーバーの手順 に従うと、オリジンサーバーで元の訪問者 IP アドレスを記録できます。リクエストがオリジンサーバーに届いたときにこの HTTP ヘッダーがない場合は、Transform Rules と Managed Transforms の設定を確認してください。
次の図は、Cloudflare を使う場合と使わない場合で、IP アドレスの扱いがどう異なるかを示します。
Cloudflare は mod_cloudflare の更新とサポートを終了しています。ただし、Ubuntu Server 18.04 や Debian 9 Stretch などの OS で Apache Web サーバーを使っている場合は、mod_remoteip で訪問者の元の IP アドレスを記録できます。
このモジュールは外部の方が作成したものです。プラグインに関する問題について、技術サポートは提供できません。
Apache Web サーバーに mod_remoteip をインストールするには、次の手順を実行します。
- 次のコマンドで mod_remoteip を有効にします。
sudo a2enmod remoteip- サイト設定に 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 combinedapache.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- 信頼するプロキシアドレスを定義するため、次のコードと 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/)- Apache の設定を有効にします。
sudo a2enconf remoteipEnabling conf remoteip.
To activate the new configuration, you need to run:
service apache2 reload- Apache の設定をテストします。
sudo apache2ctl configtestSyntax OK- Apache を再起動します。
sudo systemctl restart apache2mod_cloudflare のインストール方法は 2 つあります。GitHub から Apache 拡張をダウンロードするか、オリジン Web サーバーにコードを追加します。
Apache Web サーバーを使っている場合は、GitHub ↗ から mod_cloudflare をダウンロードできます。
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 アドレスを必要とするスクリプトに渡すだけです。実際のサーバーログには保存しません。
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 は不要です。代わりに ngx_http_realip_module NGINX モジュール ↗ と、Web サーバーの手順 ↗ に記載の設定パラメーターを使います。
Web サーバーの種類に応じて、元の訪問者 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
- 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
/IfModulengx_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 の一部として 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 を自動で書き換えるには、次のいずれかの方法を使えます。
- lighttpd.conf を開き、server.modules リストに mod_extforward を追加します。アクセスログに実 IP を出すには、mod_accesslog のあとに置く必要があります
- サーバーモジュール一覧のあと、lighttpd.conf の任意の場所に次のコードブロックを追加し、Lighttpd を再起動します
$HTTP["remoteip"] == "192.2.0.1 (example IP address)"
{
extforward.forwarder = ( "all" => "trust" )
extforward.headers = ("CF-Connecting-IP")
}- LiteSpeed Web Admin Console を開きます。
- Configuration で Use Client IP in Header オプションを有効にします。
- 有効にすると、アクセスログに正しい IP アドレスが表示されます。PHP の
$_SERVER['REMOTE_ADDR']変数にも、Cloudflare の IP アドレスではなくクライアントの実 IP アドレスが入ります。これで、WordPress や vBulletin など PHP を使うサイトで Cloudflare を有効にしたときに起きやすい問題の多くが解消します。
Microsoft Community ↗ の手順に従ってください。
IIS 8.5 以降では、カスタムログは組み込みオプションです。IIS Enhanced Logging ↗ を参照してください。
-
IIS Manager で、対象サイトの Actions メニューにある Logging をダブルクリックします。
-
起動したら、形式として W3C を選び、Log File セクションの形式ドロップダウンの横にある Select Fields をクリックします。
-
Add Field をクリックし、CF-Connecting-IP ヘッダーを追加します。
-
Ok をクリックします。Custom Fields に新しい項目が表示されます。Logging 画面に戻ったら Apply をクリックします。
-
成功すると、ログファイル名にアンダースコアが付きます。フィールドにも変更が表示されます。
-
変更がすぐ反映されない場合は、サイト、続いて 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"/>ログは次のようになります。
Visitor IP - Cloudflare IP - [04/Dec/2014:23:18:15 -0500] - "GET / HTTP/1.1" - 200 - 1895 - 193d704b85200296-SJC
Magento と Cloudflare ↗ で元の訪問者 IP を復元するサードパーティのチュートリアルを参照してください。
同様に、この Magento 拡張 ↗ は Cloudflare が作成したものではありませんが、役立つと感じているお客様もいます。
このプラグインは外部の方が作成したものです。プラグインに関する問題について、技術サポートは提供できません。
Cloudflare 経由で Invision Power Board 3 を運用している場合に、正しい IP 照合を有効にする手順は次のとおりです。
IPB インストールの ACP にログインします。
- System をクリックします。
- Overview で Security をクリックします。
- Security Center で Security Settings をクリックします。Trust IP addresses provided by proxies? が緑色であることを確認します。
ネットワーク環境によりリクエストがプロキシ経由になる場合(オフィスや大学のイントラネット、ロードバランサー構成のサーバークラスターなど)は、正しい IP アドレスを使うためにこの設定を有効にする必要があることがあります。ただし、有効にすると、悪意のあるユーザーが偽の IP アドレスを渡せるようになります。ほとんどの環境では、この設定はオフのままにしてください。
Apache サーバーを使っている場合は、ログに訪問者 IP を戻すために mod_remoteip ↗ のインストールを推奨します。
サーバーにアクセスして mod をインストールできない場合は、コアを変更 ↗ できることがあります。
比較的新しい 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 ↗ をインストールできます。
./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 plugin for Vanilla ↗ を作成しています。
このプラグインは外部の方が作成したものです。プラグインに関する問題について、技術サポートは提供できません。
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 以前にだけ適用されます。新しいバージョンでは 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'];} - アップロードして上書きします。
外部の方が、元の訪問者 IP を復元する Cloudflare と PunBB 向けモジュール ↗ を作成しています。
このプラグインは外部の方が作成したものです。プラグインに関する問題について、技術サポートは提供できません。
- サーバーで
cherokee-adminを起動します。 - Web ブラウザーで Cherokee Administration interface を開きます。
- Cloudflare で配信しているドメインの Virtual Server を選びます。
- 選んだ Virtual Server の Logging タブで、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'] ); - 次を見つけます。
$ip_split = explode( ".", $_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 を戻す TYPO3 向け Cloudflare 拡張 ↗ を作成しています。この拡張では、Cloudflare キャッシュの削除もできます。
このプラグインは外部の方が作成したものです。プラグインに関する問題について、技術サポートは提供できません。
ホスティングコントロールパネル VestaCP を使っている場合、サーバーでは Nginx と Apache の両方が動いています。リクエストは Apache に届く前に Nginx でプロキシされます。
この Nginx プロキシがあるため、実訪問者 IP を返すには Nginx の設定手順に従う必要があります。一部のリクエストで Nginx を無効にする場合を除き、Apache 向けの mod_remoteip ↗ は不要です。Apache に mod_remoteip ↗ を追加しても、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.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_hdrEnvoy Gateway で元のクライアント IP を取り出すには、カスタム CF-Connecting-IP ヘッダー を参照する Client Traffic Policy ↗ を設定します。
clientIPDetection:
customHeader:
name: CF-Connecting-IP
failClosed: true詳細は カスタムヘッダーによる元 IP 検出拡張 ↗ を参照してください。
Caddy ↗ の背後で X-Forwarded-For ヘッダーに依存するアプリケーションを動かしている場合、Cloudflare の CF-Connecting-IP ヘッダー でヘッダーを上書きするよう Caddy を設定できます。
あわせて、Cloudflare の IP アドレス ↗ からのトラフィックだけを受け付けることを推奨します。そうしないと、ヘッダーを偽装されるおそれがあります。そのため、2 つ目の例では Caddy の設定内でこの制限を行います。ファイアウォール側で処理することもでき、自動化しやすい場合が多いです。すでにファイアウォールなどで制限している場合、Caddyfile は次のようになります。
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 で受け付ける場合は、次のような設定を使えます。
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
}
}