运维

配合宝塔Nginx Waf防御CC攻击、NGINX、PHP获取Cloudflare CDN传递的真实访客IP防止伪造IP日志

MarginNote 3 - Mac端PDF阅读批注工具 激活码价格:¥69.00
赤友 NTFS for Mac 助手 -  磁盘硬盘格式读写软件注册激活码价格:¥35.00
虫洞 -  iPhone安卓投屏操控 电脑手机多屏协同,价格:¥45.00
namesilo全网最便宜域名注册商,输入折扣码:nsilo20立减1美元!

Cloudflare CDN获取真实IP目的

使用Cloudflare获取访客真实IP,获取Cloudflare传递的真实访客IP后再结合我们的cdn.example.com的批量提交IPCloudflare的防火墙的功能来实现抵御CC攻击的功能,将CC攻击者的连接IP给封杀在CDN阶段,此时传递就到不了我们服务器且消耗不了我们的服务器资源!配合宝塔Nginx Waf防御CC攻击、NGINX、PHP获取Cloudflare CDN传递的真实访客IP防止伪造IP日志
如何获取通过CDN访问的真实IP方法

问题我们是如何获取CC攻击者的真实IP(也就是这些CC攻击者连接到CloudflareCDNIP)信息呢?
其实很方法简单,Cloudflare有将通过他们的CDN访问你网站的访客的真实IP通过HEADER发送到你服务器来,标头是HTTP_CF_CONNECTING_IP。我们用NGINXPHP获取Cloudflare发送的真实访客IP可用于Nginx Waf防御CC攻击防伪造IP日志记录真实IP显示访客真实IP.
查看Cloudflare CDN HEADER信息

使用如下代码创建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和PHP分别如何获取这个IP

需要修改Nginx的配置文件,宝塔的Nginx配置文件存放位置与一般手动安装的Nginx不一样,
宝塔Nginx的配置文件位置:/www/server/nginx/conf/nginx.conf
一般Nginx的配置文件位置:/usr/local/nginx/conf/nginx.conf
如下找到:

http
……
    {
#在此位置添加如下配置信息
}
……

以上添加如下配置信息:配合宝塔Nginx Waf防御CC攻击、NGINX、PHP获取Cloudflare CDN传递的真实访客IP防止伪造IP日志
第一种配置:

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;

配合宝塔Nginx Waf防御CC攻击、NGINX、PHP获取Cloudflare CDN传递的真实访客IP防止伪造IP日志

使用如下代码创建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次。配合宝塔Nginx Waf防御CC攻击、NGINX、PHP获取Cloudflare CDN传递的真实访客IP防止伪造IP日志然后设置下真实访客IP的获取方式:配合宝塔Nginx Waf防御CC攻击、NGINX、PHP获取Cloudflare CDN传递的真实访客IP防止伪造IP日志添加HEADER,把cf_connecting_ip加进去,原来的x-forwarded-forx-real-ip都删掉。配合宝塔Nginx Waf防御CC攻击、NGINX、PHP获取Cloudflare CDN传递的真实访客IP防止伪造IP日志通过以上设置完毕,这样宝塔的防火墙就能利用Cloudflare传递过来的真实访客IP对攻击者进行封禁。

(0)

本文由 podipod软库网 作者:DevOps 发表,转载请注明来源!

关键词:, , , , , , ,
ToDesk - 安全好用流畅远程控制软件 替代TeamViewer,价格:¥108.00
Eagle - 图片收集管理必备软件 激活码价格:¥119.00
PDF Expert 2 - Mac上优秀的PDF阅读编辑工具,价格:¥119.00

热评文章

发表评论