十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

绘制比特币节点全球地图:Bitnodes GeoIP解析与反向DNS查询完全指南

绘制比特币节点全球地图:Bitnodes GeoIP解析与反向DNS查询完全指南 绘制比特币节点全球地图Bitnodes GeoIP解析与反向DNS查询完全指南【免费下载链接】bitnodesBitnodes estimates the size of the Bitcoin peer-to-peer network by finding all of its reachable and unreachable nodes.项目地址: https://gitcode.com/gh_mirrors/bi/bitnodesBitnodes 是一个开源的比特币 P2P 网络测量工具它能爬取比特币网络中所有可达节点并通过GeoIP 解析与反向 DNS 查询为每个节点画出地理位置与身份信息最终绘制出比特币节点的全球分布地图。本文面向新手带你完整理解 Bitnodes 的 GeoIP 定位原理、反向 DNS 查询机制以及如何快速搭建自己的节点地图解析器。Bitnodes 是什么如何估算比特币网络规模 比特币是一个去中心化的点对点P2P网络没有任何中心目录记录网络里到底有多少节点。Bitnodes 的解决思路很直接从种子节点出发通过 DNS 种子seeders获取一批初始节点递归发送 getaddr 消息连接每个节点询问它认识的其它节点不断扩展判定可达与不可达能完成 P2P 握手的即为可达节点统计得出网络规模。整个系统由几个协作的 Python 模块组成通过 start.sh 一键编排启动模块职责crawl.py爬虫递归发送 getaddr发现新节点并生成网络快照ping.py探针与所有可达节点保持长连接周期性发布快照消息resolve.py解析器对快照中每个节点做 GeoIP 解析与反向 DNS 查询export.py导出器将 Redis 中的数据导出为 JSON 供展示seeder.py播种器把可达节点导出为 DNS zone 文件成为新一代 DNS 种子其中resolve.py就是本文的主角——它负责把一个个枯燥的 IP 地址变成地图上的一个个点。GeoIP 解析原理三个 MaxMind 数据库如何定位节点三个本地数据库文件Bitnodes 基于 MaxMind 的 GeoLite2 系列数据库做离线GeoIP 查询不依赖外部 API速度快、可批量处理。三个.mmdb数据库文件位于geoip/目录geoip/GeoLite2-City.mmdb—— 城市与经纬度geoip/GeoLite2-Country.mmdb—— 国家geoip/GeoLite2-ASN.mmdb—— 自治系统ASN与运营商封装它们的GeoIp类定义在utils.py中提供city()、country()、asn()三个查询方法。数据库会定期更新更新脚本geoip/update.sh需要先在geoip/下放置.maxmind_license_key文件内容为你的 MaxMind 许可证密钥而且GeoIp初始化时带有重试逻辑确保更新数据库的瞬间不会导致解析失败。每个节点解析出的 7 项数据resolve.py中的raw_geoip()方法对每个地址查询上述三个数据库返回一个 7 元组字段含义来源city城市名City 库country国家 ISO 代码Country 库lat / lng纬度 / 经度精确到 0.0001City 库timezone时区City 库asn自治系统编号如AS13335ASN 库org运营商组织名如CLOUDFLARENETASN 库例如 Cloudflare 的1.1.1.1会被解析为AS13335 / CLOUDFLARENET见tests/test_resolve.py中的断言示例。有了经纬度前端就能把节点钉在世界地图上有了 ASN就能分析哪些云厂商与运营商托管了比特币节点。.onion 节点的特别处理 比特币网络中有相当一部分节点通过 Tor 网络暴露为.onion地址。这类地址没有公网 IP无法查询地理位置因此raw_geoip()对它们做了特殊约定跳过所有数据库查询直接标记asn TOR、org Tor network。反向 DNS 查询同样会跳过.onion地址。反向 DNS 查询详解从 IP 地址到主机名正向 DNS 把域名解析为 IP反向 DNSPTR 记录则做相反的事从 IP 地址查回主机名。Bitnodes 用它来判断节点运行在什么设备上——比如解析出one.one.one.one1.1.1.1 的 PTR 记录能告诉你那是 Cloudflare 的 DNS 服务。resolve.py中的raw_hostname()方法核心只有一行hostname socket.gethostbyaddr(address)[0]围绕这个简单调用Bitnodes 做了三件工程化的事并发用 gevent 协程池并行查询几百个地址的查询耗时被压缩到秒级超时保护每个查询包裹在 60 秒的gevent.Timeout中DNS 卡死不会拖垮整个解析器智能缓存解析结果写入 Redis 键resolve:address的哈希字段hostname默认 TTL 为 86400 秒1 天。下一轮只对剩余 TTL 不足初始值 10%的地址重新查询避免无谓的 DNS 流量。GeoIP 数据则全量刷新写入同一键的geoip字段JSON 序列化的 7 元组。快速上手搭建你的节点地图解析器以下是从零跑起完整数据管线的步骤以比特币主网为例1️⃣ 获取代码并安装依赖git clone https://gitcode.com/gh_mirrors/bi/bitnodes cd bitnodes python -m venv venv source venv/bin/activate pip install -r requirements.txt pytestrequirements.txt中关键的两个依赖是geoip2MaxMind 数据库读取器与gevent高并发查询pytest跑通即可说明环境就绪。2️⃣ 准备 GeoIP 数据库将你的 MaxMind 许可证密钥写入geoip/.maxmind_license_key然后执行bash geoip/update.sh脚本会下载并替换geoip/下的三个.mmdb文件。3️⃣ 准备配置文件复制conf/resolve.conf.default为conf/resolve.f9beb4d9.conff9beb4d9是比特币主网的魔法数字各模块靠它在 Redis 中区分网络。配置项很少日志路径、魔法数字、Redis 库号、调试开关与缓存 TTL。4️⃣ 启动整套系统bash start.shstart.sh会用低优先级nice -n 19后台启动 crawl master/slave、ping master/slave、resolve、export 与 seeder 等全部进程。日志统一写入log/目录。5️⃣ 观察解析过程resolve.py的日志会按轮输出GeoIP: 58000 Hostname: 210 GeoIP: 57980 resolved Hostname: 210 resolved每完成一轮快照解析Redis 中就多了一批带经纬度和主机名的节点记录——你的比特币节点全球地图数据就此生成。解析结果去哪里了数据流向一览理解数据流向才能看懂地图背后的故事ping.py的 master 进程发现data/目录出现新的快照 JSON 文件如1663113591.json内容为[[地址, 端口, 服务位, 区块高度], ...]后向 Redis 频道snapshot:f9beb4d9发布快照消息resolve.py订阅该频道从 Redis 的opendata集合取出全部节点地址后台并发完成 GeoIP 与反向 DNS 解析写入resolve:address键再向resolve:f9beb4d9频道发布完成信号export.py周期性把 Redis 数据导出为 JSON前端据此渲染全球节点地图、ASN 健康度图表与排行榜seeder.py则把节点列表按服务位分组基于zone.tmpl生成 A/AAAA 记录的 DNS zone 文件反哺网络成为新的 DNS 种子——测量结果又变成了网络基础设施。总结Bitnodes 用爬取 GeoIP 反向 DNS三板斧回答了比特币网络有多大、节点在哪里、由谁运营这三个问题GeoIP 解析本地 MaxMind 数据库离线查询7 项数据城市、国家、经纬度、时区、ASN、运营商一次拿全.onion节点单独标记为 Tor 网络反向 DNS 查询gevent 并发 超时保护 TTL 缓存低成本还原节点主机名Redis 消息驱动快照发布/订阅机制让爬取、解析、导出各模块松耦合协作。对于想研究比特币网络结构、P2P 爬虫设计或大规模 GeoIP 批量查询的开发者来说resolve.py、utils.py与conf/resolve.conf.default是最值得精读的三份文件——代码简洁却处处是工程细节。【免费下载链接】bitnodesBitnodes estimates the size of the Bitcoin peer-to-peer network by finding all of its reachable and unreachable nodes.项目地址: https://gitcode.com/gh_mirrors/bi/bitnodes创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表