Bitcoin Coreはv0.20.0からASMapを利用したアウトバウンドピアの選択をサポートしている↓
Bitcoin Core 0.20.0でASマップを使ったピア選択を有効にする - Develop with pleasure!
このASMapを作成して配布するプロセスについて最近投稿されていたので↓
Fabian Jahrが作成したツール↓を使ってASMapファイルを作成してみた。
https://github.com/fjahr/kartograf
Kartograf
セットアップに必要なので、パッケージマネージャーNixをインストールして、~/.config/nix/nix.conf
に以下を設定して、Nix flakesを有効にしておく。
experimental-features = nix-command flakes
↑のリポジトリをcloneして、
$ nix develop
を実行する。
ASMapの作成
RPKIを使用して、ASNへのIPプレフィックスのマップを作成する。RPKI(Resource Public Key Infrastructure)は、IPアドレスやAS番号などの資源が分配された際にその所有を証明する認証基盤。JPNICのブログで詳しく解説されてる。
$ ./run map
このmap
コマンドを実行すると、まず最初に. 5箇所の地域インターネットレジストリ(RIR)からTAL(Trust Anchor Locator)ファイルを取得する。取得したファイルは<cloneしたリポジトリのパス>/data/<実行時のタイムスタンプ>/rpki/tals/
ディレクトリ以下にある。
各TALファイルにはルート認証局(各RIR)の公開鍵と証明書のURLが記載されている。例えばAPNICのTALファイルは↓
https://tal.apnic.net/tal-archive/apnic-rfc7730-https.tal
https://rpki.apnic.net/repository/apnic-rpki-root-iana-origin.cer rsync://rpki.apnic.net/repository/apnic-rpki-root-iana-origin.cer MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx9RWSL61YAAYumEiU8z8 qH2ETVIL01ilxZlzIL9JYSORMN5Cmtf8V2JblIealSqgOTGjvSjEsiV73s67zYQI 7C/iSOb96uf3/s86NqbxDiFQGN8qG7RNcdgVuUlAidl8WxvLNI8VhqbAB5uSg/Mr LeSOvXRja041VptAxIhcGzDMvlAJRwkrYK/Mo8P4E2rSQgwqCgae0ebY1CsJ3Cjf i67C1nw7oXqJJovvXJ4apGmEv8az23OLC6Ki54Ul/E6xk227BFttqFV3YMtKx42H cCcDVZZy01n7JjzvO8ccaXmHIgR7utnqhBRNNq5Xc5ZhbkrUsNtiJmrZzVlgU6Ou 0wIDAQAB
最初のURLが、ルート証明書のURLで、最後のBase64エンコードされた文字列がルート認証局の公開鍵。
次に、ダウンロードしたTALファイルを指定してrpki-client
が実行され、RPKIデータの検証が行われる。この時、ルート証明書から証明書チェーンを辿り、各認証局が発行した証明書やROA(Route Origin Authorization)ファイルが<cloneしたリポジトリのパス>/data/<実行時のタイムスタンプ>/rpki/cache/
ディレクトリ以下にダウンロードされる(現状約1.7GB)。
ROAの検証が終わるとIPアドレスとAS番号のマッピングファイルが、<cloneしたリポジトリのパス>/out/<実行時のタイムスタンプ>/rpki/rpki_final.txt
として出力される。
-irrオプション
-irr
オプションを付けてmap
コマンドを実行すると、上記に加えて、インターネット上の経路に関するデータベースであるIRR(Internet Routing Registry)のデータも使用される。Kartografのデータの取得先はこちら。
-rvオプション
-rv
オプションを付けてmap
コマンドを実行すると、上記に加えて、世界中から集められたBGP経路情報を提供するオレゴン大学のRouteViewsプロジェクトのデータも使用される。
AMD® Ryzen 9 5950x 16-core、メモリ64GBの環境で -irr
と-rv
オプション付けて実行すると約4時間かかった(そしてマシンリソースがっつり持ってかれる)。
最終的にマージされたASMapファイルが<cloneしたリポジトリのパス>/out/<実行時のタイムスタンプ>/final_result.txt
というファイルに出力される。約30MB。
バイナリ変換
↑で生成したASMapはテキスト形式でIPアドレスとAS番号がマッピングされたデータになるけど、Bitcoin Coreに-asmap
オプションで渡す場合にはバイナリデータに変換する必要がある。
この変換を行うツールをBitcoin Coreに導入するためのPRが作られてる↓
PRにある、asmap.py
とasmap-tool.py
を使えば、テキストファイルとバイナリファイルの変換をそれぞれ行える。
# テキスト形式からバイナリ形式に変換 $ python3 asmap-tool.py encode <ASMapのテキストファイルのパス> <変換先のファイルパス> # バイナリ形式からテキスト形式に変換 $ python3 asmap-tool.py decode <ASMapのバイナリファイルのパス> <変換先のファイルパス>
バイナリ形式に変換できたら、以前の記事↑のように、-asmap
でASMapを指定してBitcoin Coreを起動すればいい。