如何基于GCP DNS复刻Cloudflare风格访客分析(无需迁移域名)
仅用GCP DNS复刻访客分析功能的实现指引
1. 开启Cloud DNS查询日志
前提是你的域名已托管在GCP Cloud DNS,接下来开启日志记录:
- 进入GCP控制台的Cloud DNS页面,选中目标托管区域
- 编辑区域的日志配置,启用查询日志,将日志发送至Cloud Logging
2. 导出DNS日志到BigQuery
Cloud Logging的日志无法直接完成复杂聚合分析,需导入BigQuery:
- 打开Cloud Logging的日志浏览器,筛选
resource.type="dns_query"类型的日志 - 创建导出sink,目标选择BigQuery数据集,设置自动同步频率(比如每小时)
- 确保BigQuery数据集具备Cloud Logging的写入权限
3. 分析日志获取核心维度
3.1 统计月度独立访客
用DNS日志中的client_ip标识访客,但需排除公共DNS、缓存服务器的IP:
- 先整理公共DNS的IP段列表(如8.8.8.0/24、1.1.1.0/24等)存入BigQuery表
- 执行BigQuery查询计算月度独立访客:
SELECT DATE_TRUNC(DATE(timestamp), MONTH) AS month, COUNT(DISTINCT client_ip) AS monthly_unique_visitors FROM `你的项目ID.你的数据集ID.dns日志表` WHERE NOT client_ip IN (SELECT ip FROM `你的项目ID.你的数据集ID.公共DNS_IP表`) -- 替换为你的实际域名,统计相关查询 REGEXP_CONTAINS(name, r'^.*\.your-domain\.com\.?$') GROUP BY month ORDER BY month DESC
3.2 按国家统计访客
将客户端IP映射到国家,需关联GeoIP数据集:
- 在BigQuery导入免费版MaxMind GeoIP2数据集
- 关联日志与GeoIP数据的查询示例:
SELECT DATE_TRUNC(DATE(timestamp), MONTH) AS month, geo.country_name AS country, COUNT(DISTINCT client_ip) AS unique_visitors_by_country FROM `你的项目ID.你的数据集ID.dns日志表` LEFT JOIN `你的项目ID.你的数据集ID.geoip2_city` AS geo ON NET.SAFE_IP_FROM_STRING(client_ip) BETWEEN geo.network_start_ip AND geo.network_end_ip WHERE NOT client_ip IN (SELECT ip FROM `你的项目ID.你的数据集ID.公共DNS_IP表`) REGEXP_CONTAINS(name, r'^.*\.your-domain\.com\.?$') GROUP BY month, country ORDER BY month DESC, unique_visitors_by_country DESC
关键注意事项
- DNS日志仅记录域名解析请求,无法确认用户是否实际访问网站,数据会比真实访客数偏高
- ISP、路由器的缓存会导致大量用户查询无法到达你的Cloud DNS,数据会偏低,可结合缓存命中率估算修正
- 必须严格过滤公共DNS、企业缓存服务器IP,否则会将这类服务器误统计为独立访客,导致数据失真
- 控制成本:BigQuery的存储与查询费用随日志量增长,建议设置日志保留期限,用分区表优化查询效率
内容的提问来源于stack exchange,提问作者ndp
相关产品推荐
相关产品推荐

