了解如何配置 mod_cloudflare,以根据您的源站 Web 服务器类型(包括 Apache、nginx 和 Microsoft IIS 等)记录访问者的原始 IP 地址。
概述
Cloudflare 将原始访问者 IP 地址包含在 X-Forwarded-For 和 CF-Connecting-IP 标头中。
- 这些标头可以恢复访问者的原始 IP 或将它们包含在您的日志中。
- 不过,配置过程视您使用的 Web 服务器类型而异。
请参阅恢复原始访问者 IP:选项 1,以了解有关安装 mod_cloudflare 的更多信息。
按照 Web 服务器类型恢复访问者 IP
参见如下有关如何配置 mod_cloudflare 的说明,以根据您的 Web 服务器类型记录原始访问者 IP:
Red Hat/Fedora:
sudo yum install httpd-devel libtool gitDebian/Ubuntu:
sudo 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/Debain/Ubuntu:
apxs -a -i -c mod_cloudflare.
4.重启并验证模块是否处于活动状态:
Red Hat/Fedora:
service 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_moduleCloudFlareRemoteIPHeader X-Forwarded-ForCloudFlareRemoteIPTrustedProxy [insert your load balancer’s IP address]DenyAllButCloudFlare/IfModule
1.使用以下 Nginx 模块和下列配置参数:
set_real_ip_from 103.21.244.0/22;set_real_ip_from 103.22.200.0/22;set_real_ip_from 103.31.4.0/22;set_real_ip_from 104.16.0.0/12;set_real_ip_from 108.162.192.0/18;set_real_ip_from 131.0.72.0/22;set_real_ip_from 141.101.64.0/18;set_real_ip_from 162.158.0.0/15;set_real_ip_from 172.64.0.0/13;set_real_ip_from 173.245.48.0/20;set_real_ip_from 188.114.96.0/20;set_real_ip_from 190.93.240.0/20;set_real_ip_from 197.234.240.0/22;set_real_ip_from 198.41.128.0/17;set_real_ip_from 2400:cb00::/32;set_real_ip_from 2606:4700::/32;set_real_ip_from 2803:f800::/32;set_real_ip_from 2405:b500::/32;set_real_ip_from 2405:8100::/32;set_real_ip_from 2c0f:f248::/32;set_real_ip_from 2a06:98c0::/29;
使用以下两项之一
real_ip_header CF-Connecting-IP;#real_ip_header X-Forwarded-For;
该前缀列表需要定期更新,我们在 Cloudflare IP 地址中发布了完整列表。
2.要在您的日志中包含原始访问者 IP,请将变量 $http_cf_connecting_ip 和 $http_x_forwarded_for
添加到 log_format
指令中。
另请参阅: Cloudflare 和 Nginx
1.运行以下脚本,将 mod_cloudflare 安装为 EasyApache 的一部分:
bash <
(curl -s https://raw.githubusercontent.com/cloudflare/mod_cloudflare/master/EasyApache/installer.sh)
2.安装时,您需要使用新的 mod_cloudflare 插件重新编译您的 Apache。
在使用 Railgun(或其他反向代理软件,如 Varnish)时,用户的请求将来自 Railgun 服务器,而不是 Cloudflare。由于请求不直接来自 Cloudflare,因此默认情况下 mod_cloudflare 不会恢复访问者 IP 地址。
1.要解决此问题,请打开您的 Apache 配置。这通常可在 /etc/apache2/apache2.conf
、/etc/httpd/httpd.conf
、/usr/local/apache/conf/httpd.conf
或其他位置找到,具体取决于您的配置。如果不确定,请咨询您的主机提供商。
2.在末尾处添加:
CloudflareRemoteIPTrustedProxy railgun_address
因此,如果您的 Railgun 服务器位于 127.0.0.1,则如下所示:
CloudflareRemoteIPTrustedProxy 127.0.0.1
3.如果您要将多台服务器添加到受信任代理列表中,可以将它们添加到末尾:
CloudflareRemoteIPTrustedProxy 127.0.0.1 127.0.0.2
要使 Lighttpd 自动为访问日志和应用程序重写服务器 IP,您可从以下两个解决访问方案中选用一个。
如果源站仅通过 IPv4 连接到互联网:
1.打开 lighttpd.conf
文件,再将 mod_extforward
添加到 server.modules
列表。它必须在 mod_accesslog
之后,才能在访问日志中显示实际 IP(如 http://cl.ly/9fRX
)。
2.将以下代码块添加到 lighttpd.conf
文件中服务器模块列表后面的任意位置。
$HTTP["remoteip"] == "199.27.128.0/21" {extforward.forwarder = ( "all" => "trust" )extforward.headers = ("CF-Connecting-IP")}$HTTP["remoteip"] == "173.245.48.0/20" {extforward.forwarder = ( "all" => "trust" )extforward.headers = ("CF-Connecting-IP")}$HTTP["remoteip"] == "103.21.244.0/22" {extforward.forwarder = ( "all" => "trust" )extforward.headers = ("CF-Connecting-IP")}$HTTP["remoteip"] == "103.22.200.0/22" {extforward.forwarder = ( "all" => "trust" )extforward.headers = ("CF-Connecting-IP")}$HTTP["remoteip"] == "103.31.4.0/22" {extforward.forwarder = ( "all" => "trust" )extforward.headers = ("CF-Connecting-IP")}$HTTP["remoteip"] == "141.101.64.0/18" {extforward.forwarder = ( "all" => "trust" )extforward.headers = ("CF-Connecting-IP")}$HTTP["remoteip"] == "108.162.192.0/18" {extforward.forwarder = ( "all" => "trust" )>extforward.headers = ("CF-Connecting-IP")}$HTTP["remoteip"] == "190.93.240.0/20" {extforward.forwarder = ( "all" => "trust" )extforward.headers = ("CF-Connecting-IP")}$HTTP["remoteip"] == "188.114.96.0/20" {extforward.forwarder = ( "all" => "trust" )extforward.headers = ("CF-Connecting-IP")}$HTTP["remoteip"] == "197.234.240.0/22" {extforward.forwarder = ( "all" => "trust" )extforward.headers = ("CF-Connecting-IP")}$HTTP["remoteip"] == "198.41.128.0/17" {extforward.forwarder = ( "all" => "trust" )extforward.headers = ("CF-Connecting-IP")}$HTTP["remoteip"] == "162.158.0.0/15" {extforward.forwarder = ( "all" => "trust" )extforward.headers = ("CF-Connecting-IP")}$HTTP["remoteip"] == "104.16.0.0/12" {extforward.forwarder = ( "all" => "trust" )extforward.headers = ("CF-Connecting-IP")}$HTTP["remoteip"] == "172.64.0.0/13" {extforward.forwarder = ( "all" => "trust" )extforward.headers = ("CF-Connecting-IP")}
3.重启 Lighttpd。
如果源站通过 IPv6 连接到互联网:
根据 Lighttpd 文档所述,启用了 IPv6 时,匹配远程 IP 范围所需的 $HTTP["remoteip"]
字段将不起作用。尝试转发 IP 范围时,使用上述方法不能凑效。
下文介绍了使用 Lighttpd 转发原始 IPv6 地址的一种替代解决方案,即信任所有代理(不受 Lighttpd 推荐)。操作方式如下:
1.在 server.modules list
中,将 mod_accesslog 设置在 mod_extforward 的前面
2.将以下几行添加到 lighttpd.conf
中:
extforward.forwarder = ( "all" => "trust" )extforward.headers = ("CF-Connecting-IP")
3.重启 Lighttpd。
1.前往 LiteSpeed Web 管理员控制台。
2.在 Configuration 中,启用 Use Client IP in Header 选项。
3.启用之后,您的访问日志就会显示正确的 IP 地址,甚至 PHP 的 $_SERVER['REMOTE_ADDR']
变量也会包含客户端的实际 IP 地址,而非 Cloudflare IP 地址,其本身就能解决您在支持 PHP 的网站(如 WordPress 或 vBulletin 安装)上启用 Cloudflare 时遇到的大多数问题。
IIS 7 - 8:
按照此处的说明操作。
IIS 8.5 - 10:
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;如果更改没有立即生效,则重启整个实例。
要使 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。
同样,Cloudflare 并未编写此 Magento 扩展,但我们的部分客户认为它很有帮助。
要在通过 Cloudflare 运行 Invision Power Board 3 安装时正确匹配 IP,请按如下说明操作:
登录 IPB 安装的 ACP。
1.单击 System。
2.在 Overview 下,单击 Security。
3.在 Security Center 下,单击 Security Settings。
4. 检查 Trust IP addresses provided by proxies? 是否为绿色。
IPB4 对 Trust IP addresses provided by proxies? 的说明
如果您的网络环境中通过代理处理请求(例如,在办公室或大学等内网环境中,或者设有负载均衡的服务器集群中),您可能需要启用此项设置,以便能使用正确的 IP 地址。但在启用后,恶意用户可通过不当使用系统来提供虚假的 IP 地址。在大多数环境中,此设置应不予使用。
如需通过 Simple Machines(SMF)恢复原始访问者 IP 的信息,请访问 Simple Machines 论坛。
如果您使用 Apache 服务器,我们建议您通过安装 mod_cloudflare 将访问者 IP 恢复到您的日志中。
如果您因为没有服务器访问权限而无法安装 mod_cloudflare 等模块,您可以通过此处的说明来修改代码。
最新版本的 MyBB 包含一个 Scrutinize User's IP address 选项。
Admin CP > Configuration > Server and Optimization Options > Scrutinize User's IP address? > Yes
此外,您也可以安装适用于 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 团队的一名成员编写了适用于 Vanilla 的 Cloudflare 插件,可为自托管站点恢复原始访问者 IP 到日志文件。
1.打开 includes/GlobalFunctions.php
。 在大约第 370 行,将:
$forward = "\t(proxiedvia {$_SERVER['REMOTE_ADDR']}{$forward})";
更改为
$forward = "\t(proxiedvia {$_SERVER['HTTP_CF_CONNECTING_IP']}{$forward})";
2.打开 includes/ProxyTools.php
。在大约第 79 行,找到:
if ( isset( $_SERVER['REMOTE_ADDR'] ) ){
并替换为:
if ( isset( $_SERVER['HTTP_CF_CONNECTING_IP'] ) ){
3.在大约第 80 行,找到:
$ipchain = array( IP::canonicalize($_SERVER['REMOTE_ADDR']) );
并替换为:
$ipchain = array( IP::canonicalize($_SERVER['HTTP_CF_CONNECTING_IP']) );
4.保存并上传到您的源站 Web 服务器。
对于 1.27.1 相近版本:
1.找到 GlobalFunctions.php
中的第 1232 行,将 REMOTE_ADDR
更改为 HTTP_CF_CONNECTING_IP
。
2.接下来,找到 WebRequest.php
中的第 1151 到 1159 行,将 REMOTE_ADDR 更改为 HTTP_CF_CONNECTING_IP。
某位 Xenforo 用户创建了适用于 Cloudflare 的插件。
其他选项:
1.打开 library/config.php
。
2.在末尾处,添加:
if (isset($_SERVER['HTTP_CF_CONNECTING_IP'])){ $_SERVER['REMOTE_ADDR']= $_SERVER['HTTP_CF_CONNECTING_IP'];}
3.上传并覆盖。
某第三方创建了适用于 Cloudflare 和 PunBB 的模块,可以恢复原始访问者 IP。
1.在服务器上启动 cherokee-admin
。
2.在 Web 浏览器中,导航到 Cherokee 管理界面。
3.针对由 Cloudflare 服务的域,选择 Virtual Server。
4.在所选虚拟服务器的 Logging 选项卡中,启用 Accept Forwarded IPs。
5.在 Accept from Hosts 框中,输入 Cloudflare 的 IP 地址。
您可以通过将 Livezilla 服务器配置中 PHP IP Server Param
字段更改为 HTTP_CF_CONNECTING_IP
来修正 IP 地址。
将访问者 IP 恢复到 DataLife Engine:
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.打开:
/engine/modules/functions.php
找到:
$_IP = $_SERVER['REMOTE_ADDR'];
更改为:
$_IP = $_SERVER['HTTP_CF_CONNECTING_IP'];
5.找到:
$db_ip_split = explode( ".", $_SERVER['REMOTE_ADDR'] );
更改为:
$db_ip_split = explode( ".", $_SERVER['HTTP_CF_CONNECTING_IP'] );
6.找到:
$ip_split = explode( ".", $_SERVER['REMOTE_ADDR'] );
更改为:
$ip_split = explode( ".", $_SERVER['HTTP_CF_CONNECTING_IP'] );
某第三方创建了适用于 TYPO3 的 Cloudflare 扩展,可以将原始访问者 IP 恢复到您的日志中。此扩展也提供清理 Cloudflare 缓存的功能。
如果您使用托管控制平面 VestaCP,那么您的服务器上将同时运行 Nginx 和 Apache。请求先通过 Nginx 代理,再传到 Apache。
由于存在此 Nginx 代理,您实际上需要按照说明配置 Nginx,从而返回实际的访问者 IP 地址。不需要适用于 Apache 的 mod_cloudflare,除非您对部分请求禁用了 Nginx 服务器。添加 mod_cloudflare 到 Apache 不会与 Nginx 服务器配置产生冲突。
某外部开发者创建了一个名为 node_cloudflare 的模块,可用来恢复访问者 IP。