高級
ASMap
了解 ASMap 如何使用自治系統映射來增強比特幣節點的對等連接多樣性。
10 分鐘
ASMap(Autonomous System Map)是 Bitcoin Core 的一項功能,使用自治系統號碼 來識別 IP 地址的網路歸屬,從而更好地分散對等連接,增強對日蝕攻擊的抵抗力。
為什麼需要 ASMap?
傳統方法的問題:
Bitcoin Core 默認使用 /16 網段來分散連接:
- 每個 /16 網段最多 2 個出站連接
- 假設: 不同 /16 屬於不同實體
問題:
1. 大型組織擁有多個 /16 網段
例: 某雲服務商可能擁有 50+ 個 /16
2. 多個小組織共享 /16
例: 小型 ISP 可能只有部分 /16
3. 攻擊者可以獲得多個 /16 的 IP
- 租用多個雲服務商
- 每個服務商不同 /16
- 但都由攻擊者控制
結果: /16 分散不能有效防止日蝕攻擊 自治系統 (AS)
什麼是自治系統?
AS (Autonomous System):
- 網際網路的路由單位
- 由單一組織管理的 IP 網段集合
- 由唯一的 ASN (AS Number) 識別
範例:
AS13335 - Cloudflare
AS15169 - Google
AS16509 - Amazon AWS
AS32934 - Facebook
AS 的特點:
- 一個 AS 可以包含多個不連續的 IP 範圍
- 反映真實的網路所有權
- 比 /16 更準確地識別「誰控制這些 IP」
// 使用 AS 進行連接分散更有效 ASMap 工作原理
ASMap 文件:
- 包含 IP 前綴到 ASN 的映射
- 壓縮的二進制格式
- 約 1-2 MB 大小
使用流程:
1. 節點載入 ASMap 文件
2. 對每個對等節點 IP,查詢其 ASN
3. 使用 ASN 而非 /16 來分散連接
4. 每個 AS 最多 2 個出站連接
連接選擇:
舊方法: bucket = hash(IP & 0xFFFF0000)
新方法: bucket = hash(ASN)
效果:
- 即使攻擊者有多個 /16
- 如果都在同一 AS,只能有 2 個連接
- 大幅增加日蝕攻擊難度 啟用 ASMap
# 1. 獲取 ASMap 文件
# Bitcoin Core 不包含 ASMap,需要自行獲取或生成
# 官方工具生成
cd bitcoin/contrib/asmap
python3 asmap-tool.py encode
# 或下載預生成的
# (需要驗證來源可信)
# 2. 配置 Bitcoin Core
# bitcoin.conf
asmap=/path/to/asmap.dat
# 或啟動參數
bitcoind -asmap=/path/to/asmap.dat
# 3. 驗證啟用
bitcoin-cli getnetworkinfo
{
...
"localaddresses": [...],
"asmap": "/path/to/asmap.dat" # 顯示已載入
}
# 4. 檢查對等連接的 AS 分佈
bitcoin-cli getpeerinfo | jq '.[].mapped_as' 生成 ASMap
# 從 RPKI/BGP 數據生成 ASMap
# 方法 1: 使用 Bitcoin Core 工具
cd bitcoin/contrib/asmap
# 下載 RIR 數據
./download_rir_data.sh
# 處理數據
python3 asmap-tool.py encode \
--input delegated-*.txt \
--output asmap.dat
# 方法 2: 使用 RIPE RIS 數據
# 更準確但更複雜
# 驗證 ASMap
python3 asmap-tool.py decode asmap.dat
python3 asmap-tool.py diff old.dat new.dat
# 文件格式
# 二進制壓縮的 trie 結構
# 包含 IP 前綴 -> ASN 映射 安全考量
ASMap 的信任問題:
1. 數據來源
- RIR (區域網際網路註冊機構) 數據
- BGP 路由表數據
- 需要信任數據提供者
2. 更新頻率
- AS 分配會變化
- 定期更新 ASMap 是好習慣
- 但過時的 ASMap 比沒有好
3. 驗證
- 自行生成最安全
- 下載時驗證簽名
- 可以比較不同來源
潛在攻擊:
- 惡意 ASMap 可能誤導連接選擇
- 但不能直接造成資金損失
- 最壞情況是日蝕攻擊 與 AddrMan 的整合
AddrMan 使用 ASMap:
地址管理器的桶分配:
Without ASMap:
bucket = hash(source_group, addr_group)
其中 group = IP & 0xFFFF0000 (即 /16)
With ASMap:
bucket = hash(source_as, addr_as)
其中 AS = asmap_lookup(IP)
優勢:
1. 地址存儲更分散
- 同一 AS 的地址在同一桶
- 不同 AS 的地址分散到不同桶
2. 出站連接選擇更好
- 優先連接不同 AS 的節點
- 增加網路拓撲多樣性
3. 更好的攻擊抵抗
- 攻擊者需要控制多個 AS
- 成本大幅增加 對日蝕攻擊的影響
日蝕攻擊成本對比:
Without ASMap:
- 攻擊者需要: 多個 /16 網段的 IP
- 成本: 租用多個雲服務商 VPS
- 難度: 中等
With ASMap:
- 攻擊者需要: 多個 AS 的 IP
- 成本: 需要在真正不同的網路獲得 IP
- 難度: 顯著增加
範例:
攻擊者在 AWS 租用 100 個 VPS:
- Without ASMap: 可能覆蓋 20+ 個 /16
- With ASMap: 全部只算 1 個 AS (Amazon)
// ASMap 使攻擊成本線性增加
// 攻擊者需要在真正獨立的網路佈署 限制與權衡
- 數據準確性:BGP 數據可能不完整或過時
- 更新需求:需要定期更新 ASMap
- 隱私考量:ASMap 需要外部數據源
- 大型 AS:某些 AS 非常大,可能仍有風險
- AS 劫持:BGP 劫持可能影響 ASMap 效果
實際效果
# 檢查連接的 AS 多樣性
bitcoin-cli getpeerinfo | jq '[.[].mapped_as] | unique | length'
# 顯示連接了多少個不同的 AS
# 詳細查看
bitcoin-cli getpeerinfo | jq '.[] | {addr: .addr, as: .mapped_as}'
# 理想情況:
# 10 個出站連接來自 10 個不同的 AS
# 而不是集中在少數幾個大型雲服務商
# 比較有無 ASMap 的差異
# 啟用前後運行上述命令
# 觀察 AS 多樣性變化 未來發展
可能的改進:
1. 內建 ASMap
- Bitcoin Core 包含預設 ASMap
- 定期隨軟體更新
2. 動態更新
- 節點自動獲取更新
- 需要解決信任問題
3. 分散式驗證
- 多節點比對 ASMap
- 檢測惡意修改
4. 更細粒度分類
- 考慮 AS 大小
- 動態調整連接限制
// 目前 ASMap 是可選功能
// 但推薦運行全節點的用戶啟用 相關資源
相關概念
- Eclipse Attack:日蝕攻擊
- AddrMan:地址管理器
- Peer Management:對等節點管理
- Sybil Attack:女巫攻擊
已複製連結