CloudFlare DNS /直接IP标识符

时间:2014-05-08 09:27:04

标签: cloudflare

我们开始在工作中使用cloudflare,我想了解cloudflare是如何知道我将dns名称放在浏览器上而不是直接IP。

我的意思是 - 他们如何知道我是否将www.mysite.com而不是123.34.45.45作为我的浏览器上的URL。

HTTP GET标头或任何其他标识符是否有任何标志?

非常感谢。

2 个答案:

答案 0 :(得分:0)

那是how DNS works

"域名系统通过为每个域指定权威名称服务器来分配域名并将这些名称映射到IP地址的责任"

答案 1 :(得分:0)

有一种方法可以做到这一点。

在apache内部而不是做公共根目录,使用VHosts代替他们只会响应所请求的vhost。虽然它总比没有好,但它仍然可以通过多种方式显示出来。 CloudFlare为apache发布了一个模块mod_cloudflare,该模块将记录并显示实际的访客IP地址,而不是cloudflare访问的地址! https://www.cloudflare.com/resources-downloads#mod_cloudflare(回答:olimortimer

我建议你用PHP来实现:Cloudflare的ips存储在公共场所,你可以查看它们here然后检查ip是否来自cloudflare(这将允许我们从http头获取真正的ip 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地址。