自动生成百度云加速 IP 白名单
百度云加速的ip段非常之多,官方给了一个帖子来列出这些ip,获取起来十分不便。
倍感痛苦的我,最终还是决定写个PHP
脚本自动更新Nginx
的real_ip
规则。其他规则也可以参考修改。
- 最新源码参看:https://github.com/rehiy/baidu-yunjiasu-ip
baidu.txt
复制自百度云加速官方文档
<?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);
}