NGINX,PHP獲取Cloudflare傳遞的真實訪客IP 配合寶塔面板防禦CC攻擊 防偽造IP 日誌記
from: https://www.bnxb.com/php/27592.html
Cloudflare獲取訪客真實IP,獲取cf傳遞的真實訪客ip,再結合我們的cdn.bnxb.com的批量提交IP給CF的防火牆的功能,可以實現抵禦CC攻擊的功能,將CC攻擊者的連線IP給封殺在CDN階段,就到不了我們伺服器,消耗不了我們的伺服器資源
那怎麼獲取CC攻擊者的真實IP資訊呢(也就是這些CC攻擊者連線到CF CDN的IP),其實很簡單,CF有將通過他們的CDN訪問你網站的訪客的真實IP通過HEADER傳送到你伺服器來,標頭是HTTP_CF_CONNECTING_IP
NGINX,PHP獲取Cloudflare傳送的真實訪客IP 可用於防禦CC攻擊 防偽造IP 日誌記錄真實IP 顯示訪客真實IP
先看看我們通過PHP 得到的CF返回來的HEADER資訊
<span style="color:#333333"><?php
print_r($_SERVER);
?></span>
讀取到結果如下:
<span style="color:#333333">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 )</span>
其中HTTP_CF_CONNECTING_IP標頭就是我們要的訪客真實IP資訊了。
接下來說一下NGINX和PHP分別如何獲取這個IP
1、NGINX配置獲取CloudFlare 下的訪客真實IP並記錄到日誌
需要修改NGINX的配置檔案
寶塔的nginx配置檔案存放位置與一般nginx不一樣,寶塔存放nginx配置檔案位置:/www/server/nginx/conf/nginx.conf;一般nginx的配置檔案位置:/usr/local/nginx/conf/nginx.conf。
在
http
{
}
部分增加
<span style="color:#333333">map $HTTP_CF_CONNECTING_IP $clientRealIp {
"" $remote_addr;
~^(?P<firstAddr>[0-9.]+),?.*$ $firstAddr;
}
log_format main '$clientRealIp [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'$http_user_agent $remote_addr $request_time';</span>
主要是為了通用性,如果關閉了CDN,可以不需要修改獲取IP的方式,所以才這麼修改,不然直接用$HTTP_CF_CONNECTING_IP就行了(這個時候就不需要在日誌格式裡使用$clientRealIp)
然後在網站記錄的日誌定義使用main這個日誌格式
比如
access_log /www/wwwlogs/www.bnxb.com.log main;
可以參考https://www.bnxb.com/nginx/27513.html
2、PHP獲取使用CloudFlare CDN環境下的訪客真實IP
<?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功能