摘要:本文由比特币核心贡献者和研究者 Gleb Naumenko 撰写。 Gleb 是 100x Group 比特币开发者资助计划的受资助者。 Gleb 在本文中介绍了 Bitcoin Core 如何连接到网络上的其他节点。他首先介绍了 Bitcoin Core 0.20.0 中最新默认连接策略的背景知识,然后解释了为什么当前系统可能存在弱点,这可能会使恶意行为者更容易发起日食攻击(eclipse attack)。 Gleb 接著讨论一种名为“ asmap”的潜在更强大的实验性 peer 选择方法。最后,Gleb 提供了测试此新功能的说明。测试将有助于确保安全性最佳实践变得更加可能。
Bitcoin Core 新的 peer 选择方法图示
行动呼吁 :测试和改善 asmap
现在,能使网络 peer 多样化的新 asmap 功能在 Bitcoin Core 0.20. 中已经可用。其甚至获得了一些媒体报道,但是该功能是实验性的,选择性启用(默认情况下未启用),并且目前针对高阶用户。
本文旨在帮助节点操作员使用/测试 asmap。除了少数核心开发人员之外,也非常需要借由节点操作员的使用以测试该功能,并为成为 Bitcoin Core 未来版本中 peer 选择的默认模式铺路。成为第一批使用比特币核心节点新安全功能的人,帮助它们变得安全和易于使用,并为比特币相关实用程序做出贡献!
我们首先介绍背景知识和基础知识,但是如果您已经了解边界网关协议(BGP)和 asmap 背后的思想,则可以跳至 call to action 段落。
背景知识:连接,日食攻击(eclipse attack)和间谍活动
如今在默认情况下,每个 Bitcoin Core 节点建立 10 个连接( 8 个完整连接和 2 个block-relay-only 连接)。这些连接用于发送和接收交易、区块和其他次要消息。
Bitcoin Core 0.20.0 默认连接策略
一个节点创建 10 个出站连接,以确保单个(或数个)恶意 peer 无法单枪匹马地控制其对网络的访问通道。其他节点也有到该节点的入站连接。由于它们是由网络中的随机节点发起的,并且可能属于单一个体,因此它们在节点安全性方面相对较差。
与诚实节点隔离的威胁被称为“日食攻击(eclipse attack)”。它使攻击者可以窃取资金[1、2],监视交易,并降低受害者的挖矿效率。 日食攻击是女巫攻击(Sybil Attack)的一种形式,因为攻击者通过运行更多的恶意节点来提高其成功率。
即使 10 个受害者的出站连接中只有 7 个是由攻击者所控制的,这仍是不好的, 因为这使得将交易链接到受害者的 IP 地址变得更加容易。
为了增加这些攻击的成本,Bitcoin Core 开始通过所谓的 netgroup bucketing 来使节点连接多样化。例如,如果您使用一个简单的 IP 地址 “ 172.16.254.1”,Bitcoin Core 则顶多连接到一个看起来像“ 172.16.任何数.任何数” 的 IP(如果可能的话)。
该假设的前提是攻击者在不同的网络群组中创建假节点是更加困难的。这是基于网络群组大致对应区域和互联网供应商的预期,因此运行假节点将需要与许多参与者进行协商,而使批量交易变得不那么有用。
明确而言,对于当前可到达节点的网络,我们正在谈论的是攻击者至少要运行 1000 个假节点来取得一些进行间谍活动的机会,且可能至少要运行 10000 个假节点来进行日食攻击。这就是多样化之所以很重要的原因;在这种规模下,从一个供应商租用一个 IP 区间与收集一组多样化的 IP 之间存在巨大的差异。
不幸的是,有关网络群组对应于区域和互联网供应商的假设不再成立。在过去的几年中,从某种意义上而言,IPv4 地址由于在实体之间进行交易,流动性变得更高,并且导致在许多情况下所产生的映射几乎是随机的。例如亚马逊现在控制了许多 IP 区间。
新解决方案:asmap
为了实现更好的 peer 多样性,我们需要使用比网络群组更稀缺,流动性更小的属性。近期的研究建议我们改用自治系统号(ASN)来实现多样化。一个 ASN 通常代表几个较小的 ISP,确实是目前互联网节点相对稀缺的属性,至少与过去的网络群组一样稀缺。
幸运的是,获取 ASN 数据并不困难。按照目前 BGP 协议的运行方式,每个路由器(包括您家中的路由器)都可以通过跳转 ASN hops 来导出通往特定 IP 的路径。
为了确保筛选器更有效,我们不仅查看拥有特定 IP 地址的最终 ASN,并且还考量了到达目标前ASN hops 的整个路径。
我们称一个自治系统(AS)为 mapped,如果它是第一个作为通往目标的多条路径的网关的自治系统,该特性赋予了其单枪匹马控制目标节点接接收和发送的能力(未经认证的情形,目前 Bitcoin Core 就属于这种情况)在某些文档中,我们称其为 bottleneck。
此流程的结果是,我们获得一个 IP-to-ASN 映射的列表 — 一个自治系统映射。因此,我们将该项目称为 asmap。
依 AS 进行多样化所需的 asmap 软件现已发布。其包括:
- Bitcoin-asmap 实用程序:用于将 IP <-> ASN 映射压缩为更小的 asmap 文件(从200 Mb降至 1 Mb)的代码,以使其更易于分散映射并在受限制的设备上使用
- asmap-rs:用于使用开源边界网关协议(BGP)数据生成 IP <-> ASN 映射的函式库,而不是在本地计算路径
这些工具对于确保安全简单的 asmap 体验是不可或缺的。
您也可以查看在评论中讨论到的 asmap 和 Bitcoin Core 的整合。
行动呼吁
最好的帮助方法是开始使用 asmap!步骤如下:
步骤 | 说明 |
0 | 确保您了解使用 asmap 的相关风险:该功能仍然是实验性的,所以有可能由于一个 bug,使得使用 asmap 的节点更容易被攻击(例如,日食攻击)。使用时请自担风险,最好在非生产案例中使用。 |
1 | 最基本的体验只需安装 Bitcoin Core 0.20,并在这里下载一个 asmap 样本文件。进行第三步骤。 |
2 | 如果想进行进阶体验(此对我们更加有帮助),请采取以下步骤: -安装 rust -到 asmap-rs repo,按照 README 文档中的说明下载开源 BGP 数据并生成 AS 映射文件。您可能需要安装额外的 rust dependencies,请参见日志。 -从源头构建这个 Bitcoin Core 分支 -藉由将其输入bitcoin-asmap 实用程序压缩映射文件(由步骤 2b 产生),如这里所述(您需要`encode`功能)。 -有意识地测试 bitcoin-asmap 的其他功能。`decode` 和 `lookup`。 |
3 | 用指向您的压缩 asmap 文件位置的 `-asmap=<filepath>` 配置选项来启动您的 Bitcoin Core 测试节点。您可以從您的 Bitcoin Core 存儲庫的根目录运行`./src/bitcoind -help | grep -A4 asmap`以查看帮助文档。 |
4 | 查看您节点的 debug 日志,看看 asmap 是否正常工作(例如 grep `asmap`, `mapped`,并与您预期的 asmap 逻辑进行比较)。 |
5 | 您可以通过 `getpeerinfo` RPC 中的新 `mapped_as` 字段,或在 GUI “Peers ” 窗口中点击一个 peer 并查看位于 peer 详细信息右侧底部的 “Mapped AS ” 字段,查看 per-peer AS 映射。 |
6 | (选择性)保持一个节点运行,并通过 grep `mapped`, `asmap`和 `bucket`或使用脚本在一段时间内监控 debug 日志(可能每周数次)。 |
请不要犹豫尝试其他选项/配置(例如,仅从某些特定的 RIPE RIS 端下载数据,如 asmap-rs 说明中所述)。
然后,在 GitHub 上提交问题,分享反馈,在 bitcoin-asmap PR 中将您的评论发给 Bitcoin Core!我的电子邮箱是 naumenko dot gs at gmail dot com。
更多建议
Asmap 工具也需要一些乐于贡献的开发者的爱!
您可以:
- 在测试时发现一个 bug(请参阅上一节)并提出一个问题 (或许同时发起一个 PR 来修复该问题)
- 处理问题清单中的问题
- 审查源代码和待办的 PR
- 尝试用格式错误的输入数据来破坏某些东西
- 提高效率,日志,用户体验等。
代码本身简短,但是要研究其实现需要下列一些知识:
- 互联网协议、BGP 和 rust(用于 asmap-rs)。
- 演算法和压缩(用于 bitcoin-asmap)
您也可以从头开始重新实现整个过程,但在此刻我认为我们不应该将注意力分散在多个冗余实现上。
最高阶的用户可能希望将 asmap 数据从自己的路由器发送到 bitcoin-asmap 压缩器。由于bitcoin-asmap 仅适用特定输入,因此可能需要进行一些预格式化。如果成功了,请在 PR 评论或其他地方分享您的经验(最好是一个完整的周期,而不仅仅是压缩)。
致谢
感谢 Jon Atack,Greg Sanders 和 Michael Ford(fanquake)审阅本文。
Gleb Naumenko,比特币核心开发人员