CloudFlare DNS / прямой IP-идентификатор
Мы начали использовать cloudflare в моей работе, и я хочу понять, как cloudflare знает, что я помещаю имя DNS в своем браузере, а не прямой IP.
Я имею в виду - откуда они знают, если я добавлю www.mysite.com, а НЕ 123.34.45.45 в качестве URL в моем браузере.
Есть ли флаг в заголовке HTTP GET или любой другой идентификатор?
Большое спасибо.
2 ответа
Есть способ сделать это.
Внутри apache вместо публичного корневого каталога используйте VHosts, вместо этого они будут отвечать только на запрошенный vhost. Хотя это лучше, чем ничего, оно все же может быть отображено множеством способов. CloudFlare выпустила модуль mod_cloudflare
для apache модуль будет регистрировать и отображать фактические IP-адреса посетителей, а не те, к которым обратился cloudflare! https://www.cloudflare.com/resources-downloads (Ответ: olimortimer)
Я рекомендую вам сделать это на PHP: ips Cloudflare хранятся публично, так что вы можете просмотреть их здесь и проверить, является ли ip из cloudflare (это позволит нам получить реальный ip из заголовка http HTTP_CF_CONNECTING_IP
).
Если вы используете это, чтобы отключить все не-cf-соединения или наоборот, я рекомендую вам иметь один файл сценария php, который вызывается перед каждым другим сценарием, таким как common.php или pagestart.php и т. Д.
function ip_in_range($ip, $range) {
if (strpos($range, '/') == false)
$range .= '/32';
// $range is in IP/CIDR format eg 127.0.0.1/24
list($range, $netmask) = explode('/', $range, 2);
$range_decimal = ip2long($range);
$ip_decimal = ip2long($ip);
$wildcard_decimal = pow(2, (32 - $netmask)) - 1;
$netmask_decimal = ~ $wildcard_decimal;
return (($ip_decimal & $netmask_decimal) == ($range_decimal & $netmask_decimal));
}
function _cloudflare_CheckIP($ip) {
$cf_ips = array(
'199.27.128.0/21',
'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/12',
);
$is_cf_ip = false;
foreach ($cf_ips as $cf_ip) {
if (ip_in_range($ip, $cf_ip)) {
$is_cf_ip = true;
break;
}
} return $is_cf_ip;
}
function _cloudflare_Requests_Check() {
$flag = true;
if(!isset($_SERVER['HTTP_CF_CONNECTING_IP'])) $flag = false;
if(!isset($_SERVER['HTTP_CF_IPCOUNTRY'])) $flag = false;
if(!isset($_SERVER['HTTP_CF_RAY'])) $flag = false;
if(!isset($_SERVER['HTTP_CF_VISITOR'])) $flag = false;
return $flag;
}
function isCloudflare() {
$ipCheck = _cloudflare_CheckIP($_SERVER['REMOTE_ADDR']);
$requestCheck = _cloudflare_Requests_Check();
return ($ipCheck && $requestCheck);
}
// Use when handling ip's
function getRequestIP() {
$check = isCloudflare();
if($check) {
return $_SERVER['HTTP_CF_CONNECTING_IP'];
} else {
return $_SERVER['REMOTE_ADDR'];
}
}
Использовать скрипт довольно просто:
$ip = getRequestIP();
$cf = isCloudflare();
if($cf) echo "Cloudflare :D<br>";
else echo "Not cloudflare o_0";
echo "Your actual ip address is: ". $ip;
Этот скрипт должен помочь вам проверить, был ли запрос от CF, а не напрямую через IP-адрес.
Вот как работает DNS.
"Система доменных имен распределяет ответственность за назначение доменных имен и сопоставление этих имен с IP-адресами путем назначения авторитетных серверов имен для каждого домена".