【Umbrel対応】LndでTorバニティアドレスを使用する方法
ライトニングノードをTor経由で公開できることをご存知でしょうか。実際にUmbrelのライトニングノードは家庭のネットワークからの運用を簡単にするため、IPアドレスは秘匿した状態でTorを通して公開されています。
(Torは通信元や通信先および通信内容を秘匿することができるネットワークで、ダークウェブや犯罪のイメージが強い方もいるかもしれませんが、プライバシーやセキュリティ面でのメリットが大きい技術です。)
今回は、Torアドレスの先頭部分の数文字が任意の文字になる「バニティアドレス」を生成し、ライトニングノード(Umbrelもしくは素のLnd) でそのバニティアドレスを利用する方法を解説します。
この記事で紹介する手順はすべてVM上のUbuntuでやっていますが、通常のUbuntuやRaspberry Pi OSではそのまま、Mac OSでも大体同じ手順でいけると思います。バニティアドレスの生成自体は非力なラズパイではおすすめしません。ちゃんとしたパソコンでやったほうが速いし、機材への負担が少ないです。
Torのバニティアドレスとは
TorにはV2、V3という2種類のアドレスがあります。両方とも末尾は「~.onion」ですが、V3はV2よりかなり長く、セキュリティ面で有利という特徴があります。LndはV2、V3の両方に対応していたはずですが、今回は時代の流れに逆らうことなくV3を使用することにします。
まずはライトニングノードのTorアドレス(onionアドレス) を確認してみましょう。
UmbrelならGUIから「ライトニングアドレス」として見ることができます。形式は「ノード公開鍵 @ Torアドレス : ポート番号」です。
かなり長いので、スクロールするか別のところにコピペしないとノード公開鍵の一部しか見えませんね。
通常のLndなら、以下のコマンドで調べることができます。
まずlncli getinfo
で"identity_pubkey"欄から自身のノード公開鍵を確認し、
次にlncli getnodeinfo ノード公開鍵
で"addresses"欄以下の"addr"にonionアドレスが記載されているはずです。
上記のスクショだと既にバニティアドレス (bitcoinarmjp[...]d.onion)になっていることがわかりますね。確率的に初期値はほぼ確実にランダムなOnionアドレスだと思います。
mkp224oでバニティアドレスを生成する
さて、バニティアドレスの生成方法は簡単で、大量にアドレスを生成してその中から先頭部分が目標値と合致するものを保存するだけです。手動でやることもできますが、著しく効率が悪いのでmkp224oというオープンソースのツールを使います。
インストール方法については上記のリンクから確認していただければと思いますが、通常のPCならgit clone https://github.com/cathugger/mkp224o
してきて、./autogen.sh
で設定用ファイルを生成し、./configure.sh
で自動的に最適化の設定を行います。最後にmake
で実行用ファイルをコンパイルします。
バニティアドレスの探索を始める前に、どの文字列を求めているのかを指定する必要があります。filterfileというファイルを作り、開きましょう。nano filterfile
filterfileには、改行で区切った先頭文字指定を羅列できます。例えば以下のようなファイルを作ると、それぞれの単語についてマッチしたかを確かめてくれます。増えるほど探索のペースが遅くなるので、ある程度絞るのがおすすめです。(自分は10個ほど)
Tor V3アドレスは2-7、a-zの32文字でできているので、数字の0, 1, 8, 9は使えません。指定しても意味がありません。
また、もう1つ注意点として、文字数が短すぎると爆発的に見つかって後が大変なので、最低でも5~6文字は指定することをおすすめします。
さて、フィルターを作成したので次は実際にバニティアドレスを探してもらいましょう。おすすめのオプションを加えた、以下のコマンドを実行します。
./mkp224o -f ./filterfile -S 3600 -d onions
-S 3600は3600秒ごとに以下のような状況をコマンドラインに表示してくれます。
1秒ごとの試行数、1秒ごとの発見数、総経過時間などが表示されます。
-d onionsは、mkp224oのフォルダ配下のonionsというディレクトリに結果を保存してくれます。
しばらく放置していると、onionsフォルダ内に先頭部分がフィルターのいずれかに合致するたくさんのアドレスが溜まっているはずです。
~余談~
ちなみにこの記事内の最初のスクショで用意したバニティアドレス"bitcoinarmjp...d.onion"は恐るべき先頭12文字に意味がありそうですが、実際はbitcoinの7文字を指定したら偶然短い単語が2つ続きました。これに似せたアドレスを作るには相当のPoWが必要です。
参考までに、第9世代のCore i7のうち4つのコア(半分)でバニティアドレスを生成していて、毎秒1800万回程度の試行が行われている結果、およそ以下のペースで見つかっています。
先頭7文字…1時間に2つ
先頭8文字…1日に1~2つ
先頭9文字…ほぼ見つかっていない
Torアドレスはbase32といって32種類の文字を使うため、指定部分が1文字長くなるごとに所要時間がざっくり32倍されると考えておけば良さそうです。bitcoinarmjpの12文字を指定すると、この機材ではおよそ2700年に1つか2つ見つかると予想できますね。
~閑話休題~
バニティアドレスに対応する秘密鍵をLndが読み込める形式に変更
さて、各onionアドレスに対応したフォルダには"hostname" "hs_ed25519_public_key" "hs_ed25519_secret_key"という3つのファイルがあります。今回興味があるのは秘密鍵であるhs_ed25519_secret_keyです。
まず、hs_ed25519_secret_keyの形式を知るために中身を覗いてみましょう。
秘密鍵のあるフォルダからhexdump -C hs_ed25519_secret_key
を実行します。
今回の例はbitcoin7a...d.onionというアドレスに対応した秘密鍵です。
一番左側がバイト数表記の見出し、中央左側がファイルの中身のバイト表記(16進数2文字で1バイト)、右側がファイルの中身のテキスト表記です。最初の32バイト("== ed25519v1-secret: type0 =="+最後の3バイトはnull) がヘッダー、そしてその次の64バイトが秘密鍵の生データのようです。文字コードに対応していないので、右側の表示が文字化けしていますね。
次に、Torで公開されているUmbrelまたはLndの設定ファイルがある.lndフォルダ内のv3_onion_private_keyの形式を確認しましょう。
こちらは"ED25519-V3:"という文字に続いてbase64エンコードされた秘密鍵があるようです。
mkp224oからLndへと秘密鍵をインポートするには、Lndの形式に合わせてやらないといけません。Torの秘密鍵があるフォルダから、以下のコマンドで秘密鍵の生データをbase64に変換しましょう。
tail -c+33 hs_ed25519_secret_key | base64 -w 0 >> base64_secret
このコマンドは、hs_ed_secret_keyの33バイト目から先をbase64エンコードして、base64_secretというファイルに出力しています。
次に、base64_secretというファイルの先頭にED25519-V3:
という文字列を挿入します。
コマンドsed -i 's/^/ED25519-V3:/' base64_secret
を実行しましょう。
ここで注意なのですが、エディタなどで秘密鍵のファイルを開くと末尾に0a
というバイトが追加されることがあります。(hexdump -C ファイル名
で確認可能)
デスクトップPCなどで生成した鍵をラズパイなどに移す際、scp
コマンドなどを使うのが難しい方はエディタに直打ちするのも簡単なのでおすすめですが、この改行文字が残っていると正常にbase64エンコードしたり、正常に読み込むことができません。最後の1バイトが0a
になっている場合のみ、以下のコマンドでファイルの末尾1バイトを消してやりましょう。
truncate -s -1 base64_secret
※ファイルの末尾に0aというバイトがhexdump -C base64_secret
で確認できる場合のみ実行すること!
Lndに反映させる
ここからは、先程作ったファイルをLndに読み込ませていきます。
まず、Lndを一旦停止します。Umbrelの場合は、Umbrelフォルダからsudo ./scripts/stop
を実行しましょう。
次に、作ったbase64_secretファイルをlnd.confが入っているフォルダに移し、既に存在するv3_onion_private_keyファイルを削除し、base64_secretをv3_onion_private_keyと名付けましょう。次回起動時にはLndが自動的にバニティアドレスを使用しているはずです。最後にUmbrelフォルダからsudo ./scripts/start
でUmbrelを起動しましょう。
おめでとうございます!ライトニングノードにTorのバニティアドレスが設定できました!
ちなみにUmbrelのUIのTorアドレスはまた別なので、この手順では変わりません。それも変えたい方向けに、有料部分におまけとしてヒントが書いてあります。
【追記】念のため追記しておきますが、チャネルのある状態でTorのアドレスを変更しても既存のチャネルに影響はありません。