SSHトンネルでリモート接続
LNDのニュートリノモードはビットコインフルノードなしに手軽にライトニングを始めるには便利です。しかしニュートリノだと欲しいデータ、具体的にはlncli describegraph
によるネットワーク上の全てのチャンネルやノード情報が取得できません。そこで、今回はVPSサービスのbitcloudsでbitcoindのインスタンスを購入し、LNDからbitcoindへリモート接続することで、ニュートリノモードからフルノードモードへ切り替えてみました。フルノードモードでLNDを稼動することで、上記のネットワーク情報がすべて取得できるようになります。
bitcoindへリモート接続する場合、RPCポートを公開すればリモート接続が可能ですが、そのままでは暗号化されておらず安全性にかけます。また今回接続するbitcoindはVPS内のローカルエリアにあるため、ちょっとした工夫が必要です。
そこで今回はSSHトンネル(ローカルポートフォワード)でLNDからVPS上のbitcoindへリモート接続してブロックデータなどを取得してみました。以下は簡単な環境図です
SSHトンネル接続
まずはbitcloudsでbitcoindインスタンスを購入し、SSHでログインします。インスタンス購入からSSHログインまではこちらの記事を参照してください。SSHログインできたら、$ bitcoin-cli stop
でデーモンを停止します。停止したら、bitcoin.confを以下のように修正して、再度$ bitcoind
で起動します。rpcconnectはデフォルトでIPが指定されているので、そのままで。ユーザー名・パスワードもデフォルト値のままで大丈夫です。
mainnet=1
server=1
daemon=1
rpcconnect=192.168.3.7 // local ip address
rpcuser=hogehoge // username
rpcpassword=gehogeho // password
[main]
rpcallowip=0.0.0.0/0
rpcbind=0.0.0.0
その後、ログアウトして、LNDのマシン上からSSHトンネルのコマンドを以下のようにして実行します。-Lはローカルへの通信をリモートにバインドするためのオプションです。8332:192.168.3.7:8332
はローカルのポート番号8332をリモートの192.168.3.7:8332へポートフォワードすることを意味します。bitcoindのRPCポート、ZMQによるブロック・トランザクションデータを受け取るためのポートを指定します。
(-N: リモートでコマンドを実行しない -f: バックグラウンドで実行)
$ ssh -i ssh.key root@135.125.129.128 -Nf -L 8332:192.168.3.7:8332 -L 29000:192.168.3.7:29000 -L 29001:192.168.3.7:29001
上記のコマンド実行するとSSHトンネルの完成です。以下のコマンドをLNDのマシン上で実行して、ポートがバインドできているか確認してみましょう。
$ netstat -tulpn
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:29000 0.0.0.0:* LISTEN 24291/ssh
tcp 0 0 127.0.0.1:29001 0.0.0.0:* LISTEN 24291/ssh
tcp 0 0 127.0.0.1:8332 0.0.0.0:* LISTEN 24291/ssh
LNDからSSHトンネルでbitcoind接続
次に、SSHトンネル先のbitcoind接続情報をlnd.confに設定します。[Bitcoind]の4行を追加してください。ユーザー名・パスワードは上記のbitcoin.confで設定したものを指定します。
[Bitcoin]
bitcoin.active=1
bitcoin.mainnet=1
bitcoin.node=bitcoind
[Bitcoind]
bitcoind.rpcuser=hogehoge
bitcoind.rpcpass=gehogeho
bitcoind.zmqpubrawblock=tcp://127.0.0.1:29000
bitcoind.zmqpubrawtx=tcp://127.0.0.1:29001
ここまで設定ができたら、あとはLNDを起動するだけです。これでLNDはVPS上のbitcoindへ接続してブロックデータなどを取得できるようになります。
SSHトンネルの切断
以下のコマンドでプロセスIDを取得し、Killコマンドで切断します。
$ lsof -t -i tcp:8332
24921
$ kill -9 24921
SSHトンネルが突然切断されると、LNDがbitcoindからブロック情報などを取得できなくなるので、定期的にSSHトンネルが開通しているか確認するのがよさそうです。シェルスクリプトはこちらが参考になると思います。
以上、LNDからbitcoindへリモート接続する方法でした。