Full-Node

閃電網路需要訪問遠端比特幣節點

  • April 29, 2021

我在靜態 IP 上執行一個完整節點,我可以打開與該節點通信所需的任何埠。

我需要弄清楚如何與該完整節點進行遠端通信。我想執行閃電的實現,但不知道最好使用什麼,LND、C-lightning、Eclair 等。

我將在旅行中將我的閃電放在 USB 記憶棒上,然後想與我的遠端完整節點通信。

這甚至可能嗎?

我不會完全向整個網際網路開放 RPC 埠,而是會做一些完全不同的事情。在這裡,您依賴於您的 RPC 身份驗證憑據的強度和沒有錯誤的實現。Bitcoind 本身強烈不鼓勵做其他答案中建議的事情:

 -rpcbind=<addr>[:port]
  Bind to given address to listen for JSON-RPC connections. Do not expose
  the RPC server to untrusted networks such as the public internet!
  This option is ignored unless -rpcallowip is also passed. Port is
  optional and overrides -rpcport. Use [host]:port notation for
  IPv6. This option can be specified multiple times (default:
  127.0.0.1 and ::1 i.e., localhost)

我在網路級別解決了這個問題:因為無論如何我都打開了 SSH 埠(儘管在一個非通用埠上只是為了在明顯不依賴於模糊的安全性之上額外的一點點模糊),我選擇了 SSH 隧道。

LN 節點

基本上我在 LN 節點上有一個 systemd 服務,它在啟動後啟動並創建到我的比特幣節點的 SSH 連接。通過該隧道,它可以訪問節點的 RPC 埠 18332(testnet)。該埠不會以這種方式直接暴露在網際網路上,而是只能通過 SSH 訪問。

該服務主要是從https://avizard.blogspot.com/2021/01/aggressive-yet-sane-persistent-ssh-with.html竊取的。

$ cat /etc/systemd/system/autossh_systemd_unit.service
[Unit]
Description=AutoSSH service to remotely access RPC of Bitcoin node
#After=network-online.target
# Use this instead if autossh will interact with the local SSH server
After=network-online.target sshd.service

[Service]
User=[NONPRIV_USER]
Environment="AUTOSSH_GATETIME=30"
Environment="AUTOSSH_POLL=30"
Environment="AUTOSSH_FIRST_POLL=30"

ExecStart=/usr/bin/autossh -M 0 -N -q \
-o "ServerAliveInterval 10" \
-o "ServerAliveCountMax 3" \
-o "ExitOnForwardFailure yes" \
-p [SSH_PORT] -l [USER] [HOST] \
-i [SSH_KEY] \
-L 18332:127.0.0.1:18332 #sleep 10
# We set 'sleep 10' to make ssh exit in case no TCP connections are forwarded in 10 seconds.
# Useful to get remote shell exit codes.

ExecStop=/usr/bin/kill $MAINPID
ExecReload=/usr/bin/kill -HUP $MAINPID

Restart=always
# On Linux TCP_TIMEWAIT_LEN is not tunable and set to (60*HZ), about 60 seconds. TCP_FIN_TIMEOUT also defauls to 60 seconds.
RestartSec=60

# See systemd.kill(5)
KillMode=process

[Install]
WantedBy=default.target

比特幣節點

此外,我的比特幣節點上的 ufw 防火牆只允許來自 2 個特定 IP 的 SSH 訪問,這些 IP 是我的 Lightning 節點執行的一個,另一個是我管理我的東西的 IP。

$ sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
8333                       ALLOW       Anywhere                   # Bitcoin Mainnet
18333                      ALLOW       Anywhere                   # Bitcoin Testnet
[SSH_PORT]/tcp             ALLOW       [LN_NODE_IP]               # SSH 
[SSH_PORT]/tcp             ALLOW       [MGMT_IP]                  # SSH 
8333 (v6)                  ALLOW       Anywhere (v6)              # Bitcoin Mainnet
18333 (v6)                 ALLOW       Anywhere (v6)              # Bitcoin Testnet

最後,所有使用者只能使用授權的 SSH 密鑰登錄,並且 LN 節點不持有超級使用者帳戶的密鑰,機器(伺服器)始終可以訪問的唯一使用者是非特權使用者。這意味著如果 LN 節點被控制,我的比特幣節點仍然可以。

$ cat /etc/ssh/sshd_config
[...]
Port [SSH_PORT]
[...]
PubkeyAuthentication yes
[...]
PasswordAuthentication no
[...]

此外,建議在兩台機器上都使用 IDS,但其設置超出了此問題的範圍。

我很想听聽人們使用的其他選項!

使用C-lightning,您可以將您的閃電節點連接到遠端完整節點:

~/.lightning/配置

bitcoin-rpcconnect=<remote-ip>
bitcoin-rpcport=<rpc-port>
bitcoin-rpcuser=<rpc-user>
bitcoin-rpcpassword=<rpc-password>
alias=<alias>
network=bitcoin

然後啟動閃電應用:

$ lightningd --daemon

請注意,這將需要在完整節點上啟用 RPC 伺服器 ( server=1in ) 並配置身份驗證。bitcoin.conf

$ bitcoind --help
...
-rpcauth=<userpw>
Username and hashed password for JSON-RPC connections. The field
<userpw> comes in the format: <USERNAME>:<SALT>$<HASH>. A
canonical python script is included in share/rpcuser. The client
then connects normally using the
rpcuser=<USERNAME>/rpcpassword=<PASSWORD> pair of arguments. This
option can be specified multiple times
...

引用自:https://bitcoin.stackexchange.com/questions/79342