飘在云端

东西南北,海角天涯

· 未定义 · · 1414次浏览

Cloudflare百万IP自定义CDN节点线路

感觉cloudflare的百万IP+很快会被我们玩坏
测试环境:Centos7.7 x64 core 纯净环境(没安装web服务器/php/数据库之类的)
操作的目录环境本次是: /root,操作目录无特定要求,随便哪个目录下操作都行,本例中是/root

1.安装必要基础环境:

yum install wget cmake gmp-devel gengetopt libpcap-devel flex byacc json-c-devel libunistring-devel git gcc+ gcc-c++ -y

2.下载 zmap 扫描工具
git clone https://github.com/zmap/zmap

3.解决依赖问题,编译zmap前,原始纯净的Centos7缺少一个zmap的依赖,需要手动编译安装,否则缺少依赖会编译失败

wget ftp://ftp.gnu.org/gnu/gengetopt/gengetopt-2.22.6.tar.gz && tar -zvxf gengetopt-2.22.6.tar.gz && cd gengetopt-2.22.6 && ./configure && make install

4.编译zmap

cd zmap/
cmake .
make -j4
make install

注意,如果你是只有1核CPU,那么 make -j4就改成make,如果是多核CPU,那么make -多核数目,如本例中我是4核VPS,那么就make -j4,多核CPU也可以只用make,不加参数,只是编译慢一些而已。

5.安装php环境,这里看了下php过滤源码的要求,必须是php7.0及更高版本的php,我这里选择安装php7.1

rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
yum install php71w php71w-fpm php71w-cli php71w-common php71w-devel php71w-gd php71w-pdo php71w-mysql php71w-mbstring php71w-bcmath php71w-curl
service php-fpm start

6.去Cloudflare官网寻找公布的CDN节点的IP段,网址是:

https://www.cloudflare.com/ips/

这里简单复制粘贴下:

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
172.64.0.0/13
131.0.72.0/22

把上面的IPv4的IP段复制粘贴到一个文本,文件名为full.txt

接着准备一个PHP扫描过滤源码,用它过滤cloudflare的IP段,筛选出可用IP,php过滤源码网络随便找的,烂大街,出处难以查找(如有侵权请联系tg: @twldyy)。

新建一个名为cff.php的文件,打开后粘贴下面代码,或者直接下载成品:https://www.lanzouw.com/i6vpuob

<?PHP
ini_set('memory_limit', '-1');

function partition($list, $p)
{
    $listlen   = count($list);
    $partlen   = floor($listlen / $p);
    $partrem   = $listlen % $p;
    $partition = array();
    $mark      = 0;
    for ($px = 0; $px < $p; $px++) {
        $incr           = ($px < $partrem) ? $partlen + 1 : $partlen;
        $partition[$px] = array_slice($list, $mark, $incr);
        $mark += $incr;
    }
    return $partition;
}

if ($argc < 4) {
    echo "CloudFlare filter\nVersion: 0.4\n";
    echo "Usage: php {$argv[0]} <raw file> <Verification file> <threads> [verify domain] [verify path] [verify value]\n";
    echo "Power by Kagurazaka Shira\n";
    exit;
}

if (!file_exists("$argv[1]")) {
    exit("Invalid input file!\n");
}

if (file_exists("$argv[2]")) {
    unlink($argv[2]);
}

$array      = file($argv[1], FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); //列表
$childcount = $argv[3]; //线程数
$array      = array_unique($array);
$part       = array();
$part       = partition($array, $childcount); //列表分割
$vname      = $argv[2];
$domain     = empty($argv[4]) ? "cfv.virtualizor.com" : $argv[4];
$vpath      = empty($argv[5]) ? "/srk.css" : $argv[5];
$vvalue     = empty($argv[6]) ? "srk_verify" : $argv[6];

for ($i = 0; $i < $childcount; $i++) {
    $pid = pcntl_fork();
    if ($pid == -1) {
        echo "Forking failed on loop $i\n";
        exit;
    } else if ($pid) {
        continue;
    } else {
        foreach ($part[$i] as $ip) {

            $url = "http://{$ip}/cdn-cgi/trace";
            $ch  = curl_init($url);
            curl_setopt_array($ch, [
                CURLOPT_RETURNTRANSFER => true,
                CURLOPT_FOLLOWLOCATION => true,
                CURLOPT_SSL_VERIFYHOST => false,
                CURLOPT_SSL_VERIFYPEER => false,
                // CURLOPT_PROXYTYPE      => CURLPROXY_SOCKS5,
                // CURLOPT_PROXY          => $ip,
                CURLOPT_TIMEOUT        => 10,
                CURLOPT_HTTPHEADER     => [
                    "Host: {$domain}",
                    "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36",
                ],
                // CURLOPT_USERAGENT      => "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36",
            ]);
            $return = curl_exec($ch);
            if (empty($return)) {
                echo "{$ip} down\n";
                curl_close($ch);
                continue;
            }
            // var_dump($return);
            if (strpos($return, "h={$domain}")) {
                curl_setopt($ch, CURLOPT_URL, "http://{$ip}" . $vpath);
                $return = curl_exec($ch);
                // var_dump($return);
                if (strpos($return, $vvalue) !== false) {
                    echo "{$ip} success\n";
                    file_put_contents($vname, $ip . "\n", FILE_APPEND | LOCK_EX);
                    curl_close($ch);
                    continue;
                }
            }
            echo "{$ip} bad\n";

            curl_close($ch);
        }

        exit;
    }
}
for ($j = 0; $j < $childcount; $j++) {
    $pid = pcntl_wait($status);
}

$v_arr = file($vname, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); //列表
$v_arr = array_unique($v_arr);

foreach ($v_arr as &$v) {
    $v = ip2long($v);
}
sort($v_arr);
foreach ($v_arr as &$v) {
    $v = long2ip($v);
}

file_put_contents($vname, implode("\n", $v_arr));
?>

然后保存
接着执行扫描:

php cff.php cdn_ip.txt v.txt 300

整个扫描筛选过程大概需要5分钟+,耐心等待一下,这里解释下,这行命令组成,php是部署php环境后就有的php主程序,用来执行php文件,cff.php是PHP 文件,文件内容就是那个过滤CloudFlare可用IP的代码,cdn_ip.txt是 CloudFlare公布的CDN节点IP段,v.txt是筛选之后的实际可用IP,以上的文件名都可以随便改,你喜欢就好,只要你知道它是干什么的。
接着目录下可以看到 一个 v.txt 的文件,整个文件大概有几十万行IP

然后那个v.txt的IP都是 cloudflare的可用IP,随便挑几个IP出来,追踪IP路由,哪个最近,不绕路,就用哪个IP,百万IP随意皮,没错,这几十上百万的IP都是可以用的,当成自己的服务器节点的IP,直接指定美滋滋。

具体怎么用呢,稍微说一下,v2的链接配置有关于主机地址配置地方是2个,一个是服务器地址,一个是http域名伪装地址,http域名伪装地址填写你的CloudFlare的代理的域名,服务器地址就是那几十万行IP了,随意换,http域名伪装地址必须填对,且是你的你的CloudFlare的代理的域名。连接时,CF连接过程是这样的,先连接到你填写的CDN服务器地址节点,因为你填写的域名是CF代理的流量,且你手动指定了入口CDN的节点,就会按照设定的IP来作为第一个路由,如果你不指定CDN节点IP,就按就近原则使用最近的CDN节点来作为路由入口,问题是CF的就近原则的判断基本都是绕圈的....,不是直连的!!可以说基本不准确。

本次更新时间:2020-4-7 17:49:33,增加一些细节说明
历史更新时间:
1>.2019-10-20 23:04:06
2>2019-10-21 21:20:41

评论 (2条)
  1. shilei

    请问一下博主,文件放在哪个文件夹里,而且执行命令会提示Invalid input file!

    回复
    1. 量子涨落 博主
      @shilei

      随便选择一个目录,然后之后的所有操作都在你之前选择的那个目录下进行

      回复