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を起動すればいい。