一号优惠经验分享网
51福利网的各种薅羊毛福利经验笔记

一份定时拉取 谷歌搜索引擎,必应搜索引擎,百度搜索引擎,yandex搜索引擎,字节搜索引擎ip名单、自动更新 Nginx geo 网段的 Shell 脚本

先直接给结果

一、自动同步爬虫 IP 生成 Nginx Geo 脚本 sync_search_bot_ip.sh

包含:

51福利网
  1. 定时拉取 Google / Bing / 百度 / Yandex / 字节爬虫 IP,自动生成 Nginx geo 白名单文件
  2. 宝塔定时任务配置、Nginx 配置片段、自动重载不报错逻辑
#!/bin/bash
# 宝塔Nginx 搜索引擎爬虫IP自动同步脚本 Google/Bing/百度/Yandex/字节
# 存放路径:/www/server/nginx/conf/bot_geo/sync_search_bot_ip.sh
# 授权 chmod +x /www/server/nginx/conf/bot_geo/sync_search_bot_ip.sh

# 配置变量
NGINX_CONF_DIR="/www/server/nginx/conf"
GEO_DIR="${NGINX_CONF_DIR}/bot_geo"
TMP_JSON="/tmp/bot_ip_tmp.json"
TMP_YANDEX="/tmp/yandex_ip.tmp"
TMP_GOOG="/tmp/goog_ip.json"
LOG_FILE="/www/server/nginx/logs/sync_bot_ip.log"
BACKUP_NUM=3
BACKUP_BASE="${NGINX_CONF_DIR}/backup/bot_geo"
UA="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"

# 目录创建
mkdir -p "${GEO_DIR}"
mkdir -p "${BACKUP_BASE}"

# 日志输出
log(){
    echo "[$(date +'%Y-%m-%d %H:%M:%S')] $1" >> "${LOG_FILE}"
}

# 备份清理
backup_geo(){
    local new_back="${BACKUP_BASE}/geo_$(date +%Y%m%d_%H%M)"
    cp -r "${GEO_DIR}" "${new_back}"
    local back_list
    back_list=$(ls -dt "${BACKUP_BASE}"/geo_* 2>/dev/null)
    if [ -n "${back_list}" ]; then
        local count
        count=$(echo "${back_list}" | wc -l)
        if [ "${count}" -gt "${BACKUP_NUM}" ]; then
            echo "${back_list}" | tail -n +$((BACKUP_NUM + 1)) | xargs rm -rf
        fi
    fi
}

# 初始化geo文件头部
init_geo_file(){
    local FILE="$1"
    local NAME="$2"
    echo "# Auto generate by sync_search_bot_ip.sh, DO NOT EDIT MANUALLY" > "${FILE}"
    echo "# Source: ${NAME} official ip list" >> "${FILE}"
    echo "geo \$is_${NAME} {" >> "${FILE}"
    echo "    default 0;" >> "${FILE}"
}

# 1. Bingbot 必应
sync_bing(){
    log "Start fetch Bingbot IP"
    curl -A "${UA}" -s -m 10 https://www.bing.com/toolbox/bingbot.json > "${TMP_JSON}"
    GEO_FILE="${GEO_DIR}/bingbot.conf"
    init_geo_file "${GEO_FILE}" bingbot

    if [ -s "${TMP_JSON}" ] && jq -e '.prefixes' "${TMP_JSON}" >/dev/null 2>&1; then
        jq -r '.prefixes[].ipv4Prefix' "${TMP_JSON}" | grep -v null | sort | uniq | while read -r cidr || break;do
            [ -z "${cidr}" ] && continue
            echo "    ${cidr} 1;" >> "${GEO_FILE}"
        done
        log "Bingbot IP 拉取成功"
    else
        log "警告:Bing接口返回数据异常,本次不更新BingIP"
    fi
    echo "}" >> "${GEO_FILE}"
}

# 2. Googlebot 新版:拉取 https://www.gstatic.com/ipranges/goog.json 筛选Googlebot网段
sync_google(){
    log "Fetch Googlebot from https://www.gstatic.com/ipranges/goog.json"
    curl -A "${UA}" -s -m 10 https://www.gstatic.com/ipranges/goog.json > "${TMP_GOOG}"
    GEO_FILE="${GEO_DIR}/googlebot.conf"
    init_geo_file "${GEO_FILE}" googlebot
    local has_data=0

    if [ -s "${TMP_GOOG}" ] && jq -e '.prefixes' "${TMP_GOOG}" >/dev/null 2>&1; then
        # 筛选 service=Googlebot 的IPv4段
        jq -r '.prefixes[] | select(.service=="Googlebot") | .ipv4Prefix' "${TMP_GOOG}" | grep -v null | sort | uniq | while read -r cidr || break;do
            [ -z "${cidr}" ] && continue
            echo "    ${cidr} 1;" >> "${GEO_FILE}"
            has_data=1
        done
    fi

    # 抓取失败写入静态兜底网段
    if [ "${has_data}" -eq 0 ];then
        log "Google json获取失败,加载静态CIDR兜底"
cat >> "${GEO_FILE}" <<EOCIDR
    34.64.0.0/10 1;
    34.128.0.0/10 1;
    35.184.0.0/16 1;
    35.192.0.0/14 1;
    64.18.0.0/16 1;
    64.233.160.0/19 1;
    66.249.64.0/19 1;
    72.14.192.0/18 1;
    74.125.0.0/16 1;
    104.132.0.0/14 1;
    108.177.64.0/18 1;
    130.211.0.0/16 1;
    142.250.0.0/16 1;
    192.178.0.0/16 1;
    208.67.224.0/24 1;
    209.85.128.0/17 1;
    216.239.32.0/19 1;
EOCIDR
    fi
    log "Googlebot IP 处理完成"
    echo "}" >> "${GEO_FILE}"
}

# 3. 百度Spider 静态网段
sync_baidu(){
    log "Write BaiduSpider static CIDR list"
    GEO_FILE="${GEO_DIR}/baiduspider.conf"
    init_geo_file "${GEO_FILE}" baiduspider
cat >> "${GEO_FILE}" <<EOCIDR
    180.76.0.0/14 1;
    220.181.0.0/16 1;
    106.11.0.0/16 1;
    61.135.168.0/24 1;
    61.135.169.0/24 1;
    119.63.192.0/18 1;
EOCIDR
    echo "}" >> "${GEO_FILE}"
}

# 4. Yandexbot 新版:抓取 https://yandex.ru/ips/index 提取全部官方IPv4
sync_yandex(){
    log "Fetch Yandex IP from https://yandex.ru/ips/index"
    GEO_FILE="${GEO_DIR}/yandexbot.conf"
    init_geo_file "${GEO_FILE}" yandexbot
    > "${TMP_YANDEX}"

    curl -A "${UA}" -s -m 10 https://yandex.ru/ips/index > "${TMP_YANDEX}"
    local has_data=0
    if [ -s "${TMP_YANDEX}" ];then
        # 提取页面内所有 CIDR 格式IPv4
        grep -oE '([0-9]{1,3}\.){3}[0-9]{1,3}/[0-9]{1,2}' "${TMP_YANDEX}" | sort | uniq | while read -r cidr || break;do
            [ -z "${cidr}" ] && continue
            [[ "${cidr}" =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/[0-9]+$ ]] && {
                echo "    ${cidr} 1;" >> "${GEO_FILE}"
                has_data=1
            }
        done
    fi

    # 页面抓取空白,写入官方完整静态IPv4兜底
    if [ "${has_data}" -eq 0 ];then
        log "Yandex ips/index 抓取空白,加载官方静态IPv4兜底"
cat >> "${GEO_FILE}" <<STATIC_YA
    5.45.192.0/18 1;
    5.255.192.0/18 1;
    37.9.64.0/18 1;
    37.140.128.0/18 1;
    77.88.0.0/18 1;
    84.252.160.0/19 1;
    87.250.224.0/19 1;
    90.156.176.0/20 1;
    92.255.112.0/20 1;
    93.158.128.0/18 1;
    95.108.128.0/17 1;
    141.8.128.0/18 1;
    178.154.128.0/18 1;
    185.32.187.0/24 1;
    213.180.192.0/19 1;
STATIC_YA
    fi
    log "Yandexbot IP 处理完成"
    echo "}" >> "${GEO_FILE}"
}

# 5. 字节爬虫 ByteSpider
sync_byte(){
    log "Write ByteSpider static CIDR list"
    GEO_FILE="${GEO_DIR}/bytespider.conf"
    init_geo_file "${GEO_FILE}" bytespider
cat >> "${GEO_FILE}" <<EOCIDR
    116.236.128.0/17 1;
    116.236.160.0/19 1;
    116.236.192.0/18 1;
    180.163.240.0/20 1;
    180.163.224.0/21 1;
EOCIDR
    echo "}" >> "${GEO_FILE}"
}

# 合并总规则文件
merge_all_bot_geo(){
    log "Merge all bot geo to total_bot.conf"
    TOTAL_GEO="${GEO_DIR}/total_bot.conf"
    > "${TOTAL_GEO}"
    echo "# Combine all search engine bot geo rules" >> "${TOTAL_GEO}"
    echo "include ${GEO_DIR}/bingbot.conf;" >> "${TOTAL_GEO}"
    echo "include ${GEO_DIR}/googlebot.conf;" >> "${TOTAL_GEO}"
    echo "include ${GEO_DIR}/baiduspider.conf;" >> "${TOTAL_GEO}"
    echo "include ${GEO_DIR}/yandexbot.conf;" >> "${TOTAL_GEO}"
    echo "include ${GEO_DIR}/bytespider.conf;" >> "${TOTAL_GEO}"
cat >> "${TOTAL_GEO}" <<EOF
map \$is_bingbot\$is_googlebot\$is_baiduspider\$is_yandexbot\$is_bytespider \$is_valid_search_bot {
    default 0;
    ~1 1;
}
EOF
}

# 主执行入口
log "==================== Start Sync All Bot IP ===================="
backup_geo
sync_bing
sync_google
sync_baidu
sync_yandex
sync_byte
merge_all_bot_geo

# Nginx配置校验重载
log "Test Nginx config"
/www/server/nginx/sbin/nginx -t
if [ $? -eq 0 ];then
    /www/server/nginx/sbin/nginx -s reload
    log "Nginx reload success"
else
    log "Nginx config error, skip reload, last backup reserved"
fi

# 清理全部临时文件
rm -f "${TMP_JSON}" "${TMP_YANDEX}" "${TMP_GOOG}"
log "==================== Sync Finished ====================\n"

二.宝塔定时任务配置(面板 → 计划任务)

  • 任务类型:Shell 脚本
  • 执行周期:每周 1 凌晨 3 点(爬虫 IP 变更不频繁,每周同步足够)
  • 脚本内容:bash /www/server/nginx/sync_search_bot_ip.sh

网站较小就不要双向校验了,只判断是不是在官方ip范围内的搜索引擎。不是直接返回444,如果是就放行吧 直接配置到网站配置吧。

修改全局 nginx.conf(按你现有完整配置改)

打开 /www/server/nginx/conf/nginx.conf,在 http { ... } 内部最顶部、include mime.types; 上方插入爬虫 geo 引入与 map 规则,修改后完整 http 段如下:

http
    {
        # ============新增开始 搜索引擎爬虫Geo白名单============
        # 加载搜索引擎IP网段
include /www/server/nginx/conf/bot_geo/total_bot.conf;

map $http_user_agent $bot_ua {
    default "";
    ~*Googlebot        "1";
    ~*Bingbot|msnbot   "1";
    ~*Baiduspider      "1";
    ~*YandexBot        "1";
    ~*ByteSpider|ToutiaoSpider "1";
}

map "$is_baiduspider,$is_googlebot,$is_bingbot,$is_yandexbot,$is_bytespider" $bot_ip_flag {
    default "";
    ~1,     "1";
    ~,1     "1";
}

map "$bot_ip_flag:$bot_ua" $allow_legitimate_bot {
    default "";
    "1:1" "ok";
}

map $http_user_agent $is_malicious_crawler {
    default "";
    ~*bot|crawl|spider|scraper|curl|wget|python|java|scrapy|okhttp "yes";
}

        # ============新增结束============

        include       mime.types;
		#include luawaf.conf;

		include proxy.conf;

        default_type  application/octet-stream;

        server_names_hash_bucket_size 512;
        client_header_buffer_size 32k;
        large_client_header_buffers 4 32k;
        client_max_body_size 50m;

        sendfile   on;
        tcp_nopush on;

        keepalive_timeout 60;

        tcp_nodelay on;

        fastcgi_connect_timeout 300;
        fastcgi_send_timeout 300;
        fastcgi_read_timeout 300;
        fastcgi_buffer_size 64k;
        fastcgi_buffers 4 64k;
        fastcgi_busy_buffers_size 128k;
        fastcgi_temp_file_write_size 256k;
		fastcgi_intercept_errors on;

        gzip on;
        gzip_min_length  1k;
        gzip_buffers     4 16k;
        gzip_http_version 1.1;
        gzip_comp_level 2;
        gzip_types     text/plain application/javascript application/x-javascript text/javascript text/css application/xml;
        gzip_vary on;
        gzip_proxied   expired no-cache no-store private auth;
        gzip_disable   "MSIE [1-6]\.";

        limit_conn_zone $binary_remote_addr zone=perip:10m;
		limit_conn_zone $server_name zone=perserver:10m;

        server_tokens off;
        access_log off;

server
    {
        listen 888;
        server_name phpmyadmin;
        index index.html index.htm index.php;
        root  /www/server/phpmyadmin;
            location ~ /tmp/ {
                return 403;
            }

        #error_page   404   /404.html;
        include enable-php.conf;

        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
        {
            expires      30d;
        }

        location ~ .*\.(js|css)?$
        {
            expires      12h;
        }

        location ~ /\.
        {
            deny all;
        }

        access_log  /www/wwwlogs/access.log;
    }
include /www/server/panel/vhost/nginx/*.conf;
}

网站站点配置简化(删掉所有 geo、IP 正则代码,只保留一行拦截判断)

你的网站配置只加这一段,其余原有 SSL、安全规则全部不动:

 # ========== 修复后合法爬虫/恶意爬虫判断,无语法错误 ==========
# 恶意爬虫拦截逻辑
set $need_block 0;
if ($is_malicious_crawler ~ "^yes$") {
    set $need_block 1;
}
if ($allow_legitimate_bot = "ok") {
    set $need_block 0;
}
if ($need_block = 1) {
    return 444;
}

工作流程说明

  1. 全局 http 块加载所有搜索引擎官方 IP 网段(geo)+ UA 匹配 map;
  2. 每个网站开头 if ($allow_search_bot != 1) return 444;
    • 普通用户 / 扫描器 / 伪造爬虫:直接断开 444,不会往下走任何规则;
    • IP 在官方爬虫 CIDR + UA 匹配谷歌 / 必应 / 百度 / 字节 / Yandex:放行,执行你下面的时段、分页拦截等自定义爬虫限制;
  3. 定时任务每周执行同步脚本,自动更新各大搜索引擎新增 IP 段,无需手动改配置。

七、宝塔注意点

  1. 后续如果在宝塔面板「Nginx 配置」里点重置主配置,手动添加的 geo include 会丢失,需要重新补上;
  2. 只当前站点生效拦截,phpmyadmin 面板 888 端口不受这条 444 规则影响,可以正常访问后台。


中途遇到的问题:

1.添加到计划任务出现错误提示:

/www/server/nginx/conf/bot_geo/sync_search_bot_ip.sh: line 45: jq: command not found
/www/server/nginx/conf/bot_geo/sync_search_bot_ip.sh: line 57: jq: command not found
nginx: the configuration file /www/server/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /www/server/nginx/conf/nginx.conf test is successful
----------------------------------------------------------------------------
★[2026-07-05 07:24:48] Successful

报错原因

脚本里使用了 jq JSON 解析工具,但服务器未安装 jq,所以执行到调用 jq 的 45、57 行直接抛 jq: command not found

只是 nginx 配置语法没问题,不影响 nginx 检测,但同步搜索引擎 IP 的脚本功能失效,无法拉取、解析机器人 IP 列表。

解决方案(宝塔 Linux 服务器通用)

安装 jq (注意一定要关闭宝塔面板的固件防护,否则安装不成功

CentOS / RHEL / 阿里云 ECS

yum install jq -y

Debian / Ubuntu

apt update && apt install jq -y

验证安装是否成功

jq --version

输出版本号即安装完成。

2.各个搜索平台获取方式不同

Bing 能拉取必应爬虫 IP,

谷歌 googlebot.json 接口有严格反爬风控:

Yandex 是俄罗斯站点,跨境网络两层限制:

Yandex 自带地域风控:非俄罗斯本地 IP 访问机器人 IP 文档,直接返回空白页面 / 截断内容;

1. Google 谷歌爬虫(2026 最新有效 JSON 地址,)

新官方爬虫 IP JSON(通用 Googlebot)

https://developers.google.com/static/crawling/ipranges/common-crawlers.json

补充谷歌公网总 IP 段(goog.json,包含所有谷歌服务)

https://www.gstatic.com/ipranges/goog.json

问题说明:香港服务器 curl 直接访问大概率返回空 / 403,谷歌会拦截纯命令行无 UA 请求,浏览器打开偶尔能加载。

2. Yandex 雅搜索两个官方地址

① 爬虫说明页面(原脚本抓取页面)

https://yandex.ru/support/webmaster/robot-workings/check-yandex-robots.txt

② Yandex 全企业 IP 总列表(完整 CIDR,推荐手动复制)

https://yandex.ru/ips/index

Google 拉取 googs.json、Yandex 拉取 /ips/index 完整页面解析

“ipv4Prefix”: “157.55.39.0/24”
}, 这是把157.55.39下面所有ip都占用了吗,会不会又其他黑客用到其中的域名伪装成搜索引擎,比如157.55.39.7

一、先回答两个核心问题

1. 157.55.39.0/24 代表什么?

  • /24 = 子网掩码 255.255.255.0,覆盖 157.55.39.0 ~ 157.55.39.255 全部 256 个 IP,整段网段归属微软 Microsoft(AS8075),是微软公开的 Bingbot 爬虫专用网段之一。
  • 不是 “全部都被爬虫占用”:这个大段是微软 Azure / 爬虫服务器共用网段,里面分两类 IP:
    1. 正规 Bing 爬虫 IP:反向 DNS 为 msnbot-xx-xx-xx-xx.search.msn.com
    2. 微软其他业务虚拟机、云服务器、测试机(同样在 157.55.39.x 段,但没有search.msn.com反向解析)。

2. 黑客能不能拿 157.55.39.7 伪装成 Bingbot 扫描?

结论:可以拿到这个段内 IP,但无法通过官方爬虫校验,会被标准防护直接拦截

  1. 网段所有权是微软,普通黑客不能随便租用该段 IP,但存在两种风险场景:
    • 场景 A:黑客注册微软 Azure,拿到同段 157.55.39.x 云主机 IP;
    • 场景 B:黑产盗用微软内部闲置虚拟机。
  2. 关键防线:仅 IP 在微软网段 ≠ 合法 Bingbot,微软官方规定了强制双向 DNS 校验标准,只靠 IP 白名单放行会被绕过。

大厂标准三层校验方案(彻底杜绝同网段伪造爬虫)

三层同时满足,才豁免 CC / 验证码 / 扫描拦截,任意一层不满足一律按恶意 IP 处理:

第一层:UA 匹配(基础过滤,第一道筛)

请求 UA 必须包含 Bingbot / msnbot,无匹配直接拦截。

第二层:IP 归属校验(官方 CIDR 白名单)

IP 落在微软公开 bingbot.json 所有 IPv4 前缀内(定时拉取更新网段)。

第三层:双向 DNS 校验(核心防伪,最关键)

程序自动对访问 IP 执行反向 + 正向 DNS 校验,域名必须是 *.search.msn.com 且 IP 回源一致。

收到请求 → UA不是Bingbot → 普通访客/恶意爬虫,执行限流拦截
        → UA是Bingbot
            → IP不在微软官方爬虫CIDR → 伪造UA,拦截
            → IP在CIDR内
                → 反查DNS不以search.msn.com结尾 → 同段Azure黑客主机,拦截
                → 正向解析域名≠原IP → DNS篡改,拦截
                → 三层全部通过 → 确认真实Bingbot,豁免所有安全规则

五、Nginx 可直接落地的完整校验逻辑(解决同网段伪造问题)

1. 预加载微软官方 IP 段(geo 模块匹配 157.55.39.0/24 等)

http {
    geo $is_bing_cidr {
        default 0;
        157.55.39.0/24 1;
        # 其他所有bingbot官方网段自动同步填入
    }
    map $http_user_agent $ua_bing {
        default 0;
        ~*bingbot 1;
        ~*msnbot 1;
    }
}

server 业务逻辑(三层联合判断,DNS 校验放后端代码执行)

Nginx 只做 UA+IP 段过滤,DNS 双向校验交给 PHP/Python 业务层

server {
    # 标记疑似必应爬虫,传给后端做DNS深度核验
    set $suspect_bot 0;
    if ($ua_bing = 1 && $is_bing_cidr = 1) {
        set $suspect_bot 1;
    }

    # 非疑似爬虫:正常执行限流、扫描拦截
    if ($suspect_bot != 1) {
        limit_req zone=global burst=8;
        # 拦截扫描器UA、高频访问
    }

    # 疑似爬虫放行到后端,由代码执行DNS双向校验
    location / {
        proxy_set_header X-Suspect-Bot $suspect_bot;
        proxy_pass http://backend;
    }
}

PHP 后端 DNS 校验伪代码(业务层最终放行权)

if ($_SERVER['HTTP_X_SUSPECT_BOT'] === '1') {
    $ip = $_SERVER['REMOTE_ADDR'];
    // 1.反向DNS查询
    $ptr = gethostbyaddr($ip);
    if (!str_ends_with($ptr, '.search.msn.com')) {
        http_response_code(403);exit; //同段非爬虫IP,拦截
    }
    // 2.正向回校
    $check_ip = gethostbyname($ptr);
    if ($check_ip !== $ip) {
        http_response_code(403);exit;
    }
    // 三层全部通过,不记录限流、不触发验证码
    define('IS_TRUE_BINGBOT', true);
}

六、补充谷歌 Googlebot 同逻辑防伪说明

谷歌爬虫 IP 段同理,同样存在 Google 云同网段非爬虫 IP,防伪标准:

  1. 反向 DNS 必须结尾 googlebot.com / google.com
  2. 正向解析回校 IP 一致;
  3. 三层校验:UA + 谷歌官方 IP 段 + 双向 DNS,缺一不可。

七、落地避坑总结

  1. 绝对不能仅靠 IP 段白名单放行搜索引擎,Azure/GCP 同网段黑客主机可轻松绕过;
  2. DNS 校验是官方唯一防伪标准,微软、谷歌文档都明确要求反向 + 正向双查;
  3. 自动化同步 bingbot.json/googlebot.json 网段,防止新增爬虫 IP 被误拦;
  4. 限流、WAF 拦截规则只对未通过三层校验的 IP 生效,真实爬虫完全豁免,不影响收录。

一号优惠 · 51福利网薅羊毛福利具有时效性,如已失效,请留言
文章名称:《一份定时拉取 谷歌搜索引擎,必应搜索引擎,百度搜索引擎,yandex搜索引擎,字节搜索引擎ip名单、自动更新 Nginx geo 网段的 Shell 脚本》-一号优惠 · 51福利网
免责申明:本站所有活动信息均来自网络,如有失效、违规、不实或侵权,请联系我们删除。谢谢

评论 抢沙发

一号优惠经验分享网最新最全薅羊毛,现金红包线报网

一号优惠经验分享网提供每日最新内部优惠,薅羊毛活动,现金红包领取,免费福利和网赚福利手机赚钱线报,打造中国最受欢迎的网赚信息发布平台!51福利网

51联盟线报群

登录

找回密码

注册