TunnelSatsと同様のことを自前で再現する

TunnelSatsと同様のことを自前で再現する

【追記】rust-rpxyをいじってるとHTTP/HTTPSに特化してることがわかったので、この記事よりも出来のよいikuradonさんの「お手軽自家製TunnelSats」をおすすめします。

【追記2】もしrust-rpxyを使ってセルフホストしてるウェブサイトにつなぐ傍らライトニングノードにもドメインを割り振りたい場合などには、iptablesを使った簡易な方法もあります。ライトニングノードからの発信はプロキシしないので実際のIPアドレスの秘匿にはなりません。

# /etc/sysctl.config を編集して net.ipv4.ip_forward=1 を有効化
# ポート転送の設定
iptables -t nat -A PREROUTING -p tcp -d <リバースプロキシのグローバルIP> --dport <受け付けるポート番号> -j DNAT --to-destination <ノードのVPN上のローカルIP>:<ポート番号>
# マスカレードの設定
iptables -t nat -A POSTROUTING ! -s 127.0.0.1 -j MASQUERADE

---

Torのレスポンスが絶望的に悪いので、UmbrelのライトニングノードのLNへの接続をクリアネットにしたいなと思い立ちました。(モバイル上のウォレット等からの接続はVPN経由でよし。なおlnd.confにtlsextraipでVPN上のローカルIPを記入すべし)

Herokuのデータベース有料化や無料dyno消滅により細かなサービスのコストが嵩んでたのでオンプレ化するついでというのもあります。Blocksat Readerとかに至ってはオンプレにして数倍シンプルになりました。

ついに先週実行したので覚え書き。ちょっと抜けてる部分もあるかもしれません。

TunnelSatsとは

TunnelSatsとはライトニング払いで自分のライトニングノードにクラウド上のIPアドレスを割り当ててくれるサービスで、特にUmbrelなどのユーザーが自宅のIPアドレスを公表せずにクリアネットのみのノードからの通信を受け付けるのに利用しています。

具体的にはリバースプロキシという技術を使って、TunnelSatsの運営するサーバーの特定のポートが受信する通信を自宅などにあるライトニングノードへと転送してくれます。

TunnelSatsが管理するサーバーを利用させてもらうのもいいですが、自分が契約したVPSで同じことをしてみました。TunnelSatsのプライシングは絶妙で、月400円くらいと自前でVPSを契約する半額くらいです。値段が安い上にビットコイン払いできるので、こだわりや他の用途がなければ特におすすめはしません。

必要なもの

VPS

国内にあるノードと通信する場合や、日本のユーザーを相手にするサービスをセルフホストするのに転用する場合などにおすすめなのは国内のクラウドサーバーですが、どこのVPSを利用しても問題ありません。過去にBTCPay Serverのホスティング先として紹介したTime4VPSや、国内だとKagoyaクラウドのLinux・2コアメモリ2GBプランが月660円と安いです。

ライトニングノード

TunnelSatsでピンと来た人は持っているかもしれませんが、言わずもがなです。単体で運用していてもUmbrelを使っていても手順は同じです。

VPN

VPSとライトニングノードを接続するのにVPNを使います。Umbrelに同梱のものでいえばTailscaleが便利ですが、自分で設定できるなら何でもいいです。

Netflixとかでおま国回避のために使うやつではなく、追加したデバイス同士の通信に使えるタイプのものが必要です。

rust-rpxy

リバースプロキシといえばNginxなどが一般的ですが、オーバーヘッドが大きかったり設定項目が多かったりと面倒です。rust-rpxyはシンプルかつ軽量で、パフォーマンスもNginxの1.5倍出るらしいのでサーバー代をケチるのに心強いです。

最近Rustの勉強をしてるので、お手本にしたいです。なお開発者本人はまだWIPだから本番環境に使うのはおすすめしない(が稼働実績あり)とおっしゃってるので自己責任でお願いします。

手順

Umbrelの設定①

Tailscaleの導入と認証鍵の有効期限の無効化

Tailscaleについてはずいずいさんの記事を読んで下さい。Umbrelに導入後、ウェブGUIから認証鍵の有効期限を無効化してください。

セキュリティのために期間経過とともに再認証が必要になる仕組みですが、リバースプロキシを使う性質上常時接続したいので無効にしましょう。もちろん、VPSのセキュリティには気をつけましょう。

VPSの契約、必要なソフトのインストール

次はVPSを手に入れるところからです。固定のグローバルIPアドレスが1つもらえれば十分です。OSは特にこだわりがなければUbuntu LTSの最新版とかにしておきましょう。スペックは大して必要ないんじゃないかと思いますが、もし通信量が多そうなら無制限か多量に料金に含まれているものを選ぶと良さそうです。

SSH接続用の鍵を入手するか、ウェブGUIのコンソールから以下の作業を進めましょう。特にUmbrelユーザーはVPN内への侵入を許すとUmbrelへのアクセスを試される恐れがあるため、SSH鍵の流出や不正アクセス対策はしましょう。

# まずはパッケージ一覧を更新・インストール
sudo apt update
sudo apt upgrade
# ufw, fail2banの設定 (とりあえずレベル。こだわりたい人はもっと)
sudo ufw allow 22
sudo ufw allow 9735
sudo ufw enable
sudo apt install fail2ban
# Cコンパイラ等のインストール
apt install build-essential
# Tailscaleのインストールとログイン (簡易な方法)
# ログイン後はGUIから認証鍵の有効期限を無効化を忘れずに。
curl -fsSL https://tailscale.com/install.sh | sh
tailscale up
# Rust, Cargoのインストール (簡易な方法)
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
# rust-rpxyのダウンロード
git clone https://github.com/junkurihara/rust-rpxy
cd rust-rpxy
# Submoduleのアップデート方法をSSHからHTTPSに変更
# ファイルが開いたらurl = git@github.com:~の行を
# url = https://github.com/~ に変更し、ctrl-Xで保存
nano .git/config/.gitmodules
# rust-rpxyのインストール
git submodule update --init
cargo build --release

足りないものがあると警告されたらそれも入れて下さい。

設定ファイルは最低限このようなものを作ります:

nano config.toml

# config.tomlに記述する内容
listen_port = 9735
default_application = "lightning_node"
[app.lightning_node]
server_name = "ip.addr.of.vps"
reverse_proxy = [{ location = 'tailscale.ip.of.node:9735' }]

最後に起動します

screen ./target/release/rpxy --config config.toml
# ctrl+A ctrl+Dで離脱
# screen以外にもプロセスを持続させる方法は色々あるのでお好みで。

これで、VPSのIPアドレス宛にきた通信がTailscale経由でライトニングノードに転送されます。

Umbrelの設定②

lnd.confの設定をしてから、UmbrelごとLndを再起動しましょう。

nano Umbrel/app-data/lightning/data/lnd/lnd.conf
# 上の方にtlsextraip=ip.addr.for.vps を追加
# 上の方にexternalip=ip.addr.for.vps を追加
# 編集したらctrl-Xで保存
sudo Umbrel/scripts/stop
sudo Umbrel/scripts/start

外部から<identity pubkey>@<VPS IP address>:9735宛にlncli connectできれば成功です!再起動時にノードがIPをアナウンスしたはずなので、Ambossや1MLなどでも確認できると思います。

ちなみに自分はBlocksat Readerなども移設したので、Certbotを導入してTLS証明書を取得したり、config.tomlをそこそこいじりましたが、そのへんはrust-rpxyのREADMEを見てやってみてください。

追記:今回のリバースプロキシだとあくまでクリアネットからの受信を待ち受けることができるだけで、発信はUmbrelがあるネットワークのグローバルIPから行われます。VPSをTailscaleのExit nodeに設定すると同一Tailnet上からの発信もすべてVPSからできると思われますが、Tailnetにいろんなデバイスを追加してると通信量が増えて怒られるかもしれません。

Remaining : 0 characters / 0 images
500

Sign up / Continue after login

Related stories

Writer

ビットコインが好きです。ビットコイン研究所に寄稿したり、トラストレスサービス株式会社という会社で実験的なサービス開発をしています。

Share

Popular stories

11年ぶりに動いたビットコインはサトシのものか?

7202

MicroStrategy社はなぜビットコインを440億円分買ったのか【インタビュー要点和訳】

5552

【和訳】New York Times 『プログラマーと独裁者』

3513