自动生成百度云加速 IP 白名单

百度云加速的ip段非常之多,官方给了一个帖子来列出这些ip,获取起来十分不便。
倍感痛苦的我,最终还是决定写个PHP脚本自动更新Nginxreal_ip规则。其他规则也可以参考修改。

<?php

$bdip4 = read_ipv4_list('baidu.txt');

$cfip4 = read_ipv4_list('https://www.cloudflare.com/ips-v4');
$cfip6 = read_ipv6_list('https://www.cloudflare.com/ips-v6');

$list = array_merge(
    ['# su-ipv4'],
    $bdip4,
    ['# cf-ipv4'],
    $cfip4,
    ['# cf-ipv6'],
    $cfip6
);

echo '写入配置文件: ';
make_nginx_waf_ip($list);
echo '...1';
make_nginx_real_ip_conf($list);
echo '...2';
make_nginx_geoip_proxy($list);
echo "...3...";

///////////////////////////////////////////////////////////

function make_nginx_waf_ip($list)
{
    $rets = [];
    foreach ($list as $ip) {
        if (preg_match('/^#/', $ip)) {
            $rets[] = $ip;
        } else {
            $rets[] = "allow {$ip};";
        }
    }
    $rets[] = '# default';
    $rets[] = 'deny all;';
    $text = implode("\n", $rets);
    file_put_contents('./dist/nginx_waf_ip.conf', $text);
}

function make_nginx_real_ip_conf($list)
{
    $rets = [];
    foreach ($list as $ip) {
        if (preg_match('/^#/', $ip)) {
            $rets[] = $ip;
        } else {
            $rets[] = "set_real_ip_from {$ip};";
        }
    }
    $text = implode("\n", $rets);
    file_put_contents('./dist/nginx_real_ip.conf', $text);
}

function make_nginx_geoip_proxy($list)
{
    $rets = [];
    foreach ($list as $ip) {
        if (preg_match('/^#/', $ip)) {
            $rets[] = $ip;
        } else {
            $rets[] = "geoip_proxy {$ip};";
        }
    }
    $rets[] = '# recursive';
    $rets[] = 'geoip_proxy_recursive on;';
    $text = implode("\n", $rets);
    file_put_contents('./dist/nginx_geoip_proxy.conf', $text);
}

///////////////////////////////////////////////////////////

function read_ipv4_list($site)
{
    echo "读取远程数据: {$site}\n";
    $html = file_get_contents($site);
    if (!preg_match_all('/\d+\.\d+\.\d+\.\d+\/\d+/', $html, $list)) {
        exit("读取数据失败: {$site}\n");
    }
    return sort_ipv4_list($list[0]);
}

function read_ipv6_list($site)
{
    echo "读取远程数据: {$site}\n";
    $html = file_get_contents($site);
    if (!preg_match_all('/[0-9:a-f]+\/\d+/', $html, $list)) {
        exit("读取数据失败: {$site}\n");
    }
    return $list[0];
}

function sort_ipv4_list($list)
{
    $rets = [];
    foreach (array_unique($list) as $val) {
        $ip = ip2long(explode('/', $val)[0]);
        $ip = sprintf('%u', floatval($ip));
        $rets[$ip] = $val;
    }
    ksort($rets);
    return array_values($rets);
}
文章作者: 若海; 原文链接: https://www.rehiy.com/post/122/; 转载需声明来自技术写真 - 若海

添加新评论