Cloudflare
获取访客真实IP
,获取Cloudflare
传递的真实访客IP
后再结合我们的cdn.example.com的批量提交IP
给Cloudflare
的防火墙的功能来实现抵御CC
攻击的功能,将CC
攻击者的连接IP
给封杀在CDN
阶段,此时传递就到不了我们服务器且消耗不了我们的服务器资源!CC
攻击者的真实IP
(也就是这些CC
攻击者连接到Cloudflare
CDN
的IP
)信息呢?Cloudflare
有将通过他们的CDN
访问你网站的访客的真实IP
通过HEADER
发送到你服务器来,标头是HTTP_CF_CONNECTING_IP
。我们用NGINX
、PHP
获取Cloudflare
发送的真实访客IP
可用于Nginx
Waf
防御CC
攻击防伪造IP
日志记录真实IP
显示访客真实IP
.php
文件放在网站上访问查看HEADER
信息
<!--?php print_r($_SERVER); ?-->
通过访问以上php
获得信息通过PHP
得到的Cloudflare
返回来的HEADER
信息如下:
Array ( [USER] => www [HOME] => /home/www [HTTP_CF_CONNECTING_IP] => 122.114.6.211 [HTTP_COOKIE] => __cfduid=*****; PHPSESSID=******; PHPSESSID=*****; Hm_lvt_***=****; Hm_lpvt_*****=1536121476 [HTTP_ACCEPT_LANGUAGE] => zh-CN,zh;q=0.9 [HTTP_ACCEPT] => text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 [HTTP_USER_AGENT] => Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36 [HTTP_UPGRADE_INSECURE_REQUESTS] => 1 [HTTP_CF_VISITOR] => {"scheme":"https"} [HTTP_X_FORWARDED_PROTO] => https [HTTP_CF_RAY] => 455d1c72ed0e963d-SJC [HTTP_X_FORWARDED_FOR] => 122.114.6.211 [HTTP_CF_IPCOUNTRY] => CN [HTTP_ACCEPT_ENCODING] => gzip [HTTP_CONNECTION] => Keep-Alive [HTTP_HOST] => cdn.bnxb.com [PATH_INFO] => [REDIRECT_STATUS] => 200 [SERVER_NAME] => cdn.bnxb.com [SERVER_PORT] => 443 [SERVER_ADDR] => * [REMOTE_PORT] => 12554 [REMOTE_ADDR] => 172.68.132.93 [SERVER_SOFTWARE] => nginx/1.14.0 [GATEWAY_INTERFACE] => CGI/1.1 [HTTPS] => on [REQUEST_SCHEME] => https [SERVER_PROTOCOL] => HTTP/1.1 [DOCUMENT_ROOT] => / [DOCUMENT_URI] => /ip.php [REQUEST_URI] => /ip.php [SCRIPT_NAME] => /ip.php [CONTENT_LENGTH] => [CONTENT_TYPE] => [REQUEST_METHOD] => GET [QUERY_STRING] => [SCRIPT_FILENAME] => /ip.php [FCGI_ROLE] => RESPONDER [PHP_SELF] => /ip.php [REQUEST_TIME_FLOAT] => 1536196806.1434 [REQUEST_TIME] => 1536196806 )
如上HEADER
信息中HTTP_CF_CONNECTING_IP
标头就是我们需要要的访客真实IP信息。
需要修改Nginx
的配置文件,宝塔的Nginx
配置文件存放位置与一般手动安装的Nginx
不一样,
宝塔Nginx的配置文件位置:/www/server/nginx/conf/nginx.conf
一般Nginx的配置文件位置:/usr/local/nginx/conf/nginx.conf
如下找到:
http …… { #在此位置添加如下配置信息 } ……
以上添加如下配置信息:
第一种配置:
map $HTTP_CF_CONNECTING_IP $clientRealIp { "" $remote_addr; ~^(?P[0-9.]+),?.*$ $firstAddr; } log_format main '$clientRealIp [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '$http_user_agent $remote_addr $request_time';
第二种配置:
log_format main '"$http_x_forwarded_for"-$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"';
参数对照表
参数 | 说明 | 示例 |
$remote_addr | 客户端地址 | 211.28.65.253 |
$remote_user | 客户端用户名称 | -- |
$time_local | 访问时间和时区 | 18/Jul/2012:17:00:01 +0800 |
$request | 请求的URI和HTTP协议 | "GET /article-10000.html HTTP/1.1" |
$http_host | 请求地址,即浏览器中你输入的地址(IP或域名) | www.xxxx.com 192.168.100.10 |
$status | HTTP请求状态 | 200 |
$upstream_status | upstream状态 | 200 |
$body_bytes_sent | 发送给客户端文件内容大小 | 1547 |
$http_referer | url跳转来源 | https://cdn.xxxx.com/ |
$http_user_agent | 用户终端浏览器等信息 | "Mozilla/4.0 (compatible;MSIE 8.0; Windows NT 5.1; Trident/4.0; SV1; GTB7.0; .NET4.0C; |
$ssl_protocol | SSL协议版本 | TLSv1 |
$ssl_cipher | 交换数据中的算法 | RC4-SHA |
$upstream_addr | 后台upstream的地址,即真正提供服务的主机地址 | 10.10.10.100:80 |
$request_time | 整个请求的总时间 | 0.205 |
$upstream_response_time | 请求过程中,upstream响应时间 | 0.002 |
主要是为了Nginx
是否使用CDN
均不影响的通用性,例如:如果关闭了CDN
,可以不需要修改获取IP
的方式,因此才这么修改,不然在总是用CDN
直接用$HTTP_CF_CONNECTING_IP
就行了(这个时候就不需要在日志格式里使用$clientRealIp
)。
添加完Nginx
配置文件后再到网站站点配置文件或者配置中设置记录的日志定义使用main
这个日志格式如www.example.com.log+main配置内容如下:
access_log /www/wwwlogs/www.example.com.log main;
使用如下代码创建php
文件放在网站上访问再次查看HEADER
信息:
<!--?php $realip =$_SERVER['HTTP_CF_CONNECTING_IP']; echo $realip; //也可以用下面这个 $clientIP = isset($_SERVER['HTTP_CF_CONNECTING_IP']) ? $_SERVER['HTTP_CF_CONNECTING_IP'] : $_SERVER['REMOTE_ADDR']; echo $clientIP; ?-->
以上就是获取Cloudflare
环境下真实IP
功能。
宝塔的防火墙(waf
)可以打开CDN
选项,这样就能获取到CDN
后面的真实访客IP
,但是需要自定义HEADER
信息,先设置一下防御的力度,我们设置30秒60次。然后设置下真实访客IP
的获取方式:添加HEADER
,把cf_connecting_ip
加进去,原来的x-forwarded-for
和x-real-ip
都删掉。通过以上设置完毕,这样宝塔的防火墙就能利用Cloudflare
传递过来的真实访客IP
对攻击者进行封禁。
本文由 podipod软库网 作者:DevOps 发表,转载请注明来源!