Develop with pleasure!

福岡でCloudとかBlockchainとか。

ASMapファイルを作成してみる

Bitcoin Coreはv0.20.0からASMapを利用したアウトバウンドピアの選択をサポートしている↓

Bitcoin Core 0.20.0でASマップを使ったピア選択を有効にする - Develop with pleasure!

このASMapを作成して配布するプロセスについて最近投稿されていたので↓

delvingbitcoin.org

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が作られてる↓

github.com

PRにある、asmap.pyasmap-tool.pyを使えば、テキストファイルとバイナリファイルの変換をそれぞれ行える。

# テキスト形式からバイナリ形式に変換
$ python3 asmap-tool.py encode <ASMapのテキストファイルのパス> <変換先のファイルパス>

# バイナリ形式からテキスト形式に変換
$ python3 asmap-tool.py decode <ASMapのバイナリファイルのパス> <変換先のファイルパス>

バイナリ形式に変換できたら、以前の記事↑のように、-asmapでASMapを指定してBitcoin Coreを起動すればいい。