系列導言
這是「從零開始的比特幣全節點」系列教程的第四篇。本篇將深入探討如何保護你的節點安全,以及日常維護的最佳實踐。
系列文章:
- 為什麼要運行全節點?
- 硬體選擇與環境準備
- Bitcoin Core 安裝與配置
- 節點安全與日常維護(本篇)
- 進階功能與生態整合
一、系統安全基礎
1.1 系統更新
1
2
3
4
5
6
7
8
9
| # 定期更新系統
sudo apt update && sudo apt upgrade -y
# 啟用自動安全更新
sudo apt install unattended-upgrades
sudo dpkg-reconfigure -plow unattended-upgrades
# 設定自動更新配置
sudo nano /etc/apt/apt.conf.d/50unattended-upgrades
|
1
2
3
4
5
6
7
8
9
10
| // 只自動安裝安全更新
Unattended-Upgrade::Allowed-Origins {
"${distro_id}:${distro_codename}-security";
};
// 自動移除不需要的套件
Unattended-Upgrade::Remove-Unused-Dependencies "true";
// 自動重啟(如需要)
Unattended-Upgrade::Automatic-Reboot "false";
|
1.2 用戶安全
1
2
3
4
5
6
7
8
9
10
11
| # 建立專用用戶(如尚未建立)
sudo useradd -r -m -s /bin/bash bitcoin
# 設定強密碼
sudo passwd bitcoin
# 限制 root 登入
sudo passwd -l root
# 將管理員加入 sudo 群組
sudo usermod -aG sudo yourusername
|
1.3 SSH 安全強化
1
2
| # 編輯 SSH 配置
sudo nano /etc/ssh/sshd_config
|
建議設定:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| # 禁用 root 登入
PermitRootLogin no
# 禁用密碼認證(使用金鑰)
PasswordAuthentication no
# 只允許特定用戶
AllowUsers yourusername
# 更改預設端口(可選)
Port 2222
# 登入嘗試限制
MaxAuthTries 3
# 空閒超時
ClientAliveInterval 300
ClientAliveCountMax 2
|
設定 SSH 金鑰認證:
1
2
3
4
5
6
7
8
| # 在本機生成金鑰對
ssh-keygen -t ed25519 -C "your_email@example.com"
# 複製公鑰到節點
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@node-ip
# 重啟 SSH 服務
sudo systemctl restart sshd
|
二、防火牆配置
2.1 UFW 基本設定
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
| # 安裝 UFW
sudo apt install ufw
# 預設拒絕入站
sudo ufw default deny incoming
# 預設允許出站
sudo ufw default allow outgoing
# 允許 SSH(重要!在啟用前先設定)
sudo ufw allow 22/tcp
# 或者自定義端口
sudo ufw allow 2222/tcp
# 允許比特幣 P2P 連接
sudo ufw allow 8333/tcp
# 允許 Tor(如使用)
sudo ufw allow 9050/tcp
# 啟用防火牆
sudo ufw enable
# 查看狀態
sudo ufw status verbose
|
2.2 進階防火牆規則
1
2
3
4
5
6
7
8
| # 限制特定 IP 範圍的連接
sudo ufw allow from 192.168.1.0/24 to any port 22
# 限制 RPC 只能本機訪問
# (預設 bitcoin.conf 已設定 rpcbind=127.0.0.1)
# 限制連接速率(防止 DDoS)
sudo ufw limit 8333/tcp
|
2.3 iptables 進階規則(可選)
1
2
3
4
5
6
7
8
9
| # 限制每 IP 的連接數
sudo iptables -A INPUT -p tcp --dport 8333 -m connlimit --connlimit-above 10 -j REJECT
# 限制新連接速率
sudo iptables -A INPUT -p tcp --dport 8333 -m state --state NEW -m limit --limit 10/minute --limit-burst 20 -j ACCEPT
# 保存規則
sudo apt install iptables-persistent
sudo netfilter-persistent save
|
三、Tor 整合
3.1 為什麼使用 Tor?
1
2
3
4
5
6
7
8
9
10
11
12
13
| Tor 提供的保護:
1. IP 隱私
└── 其他節點不知道你的真實 IP
2. 審查規避
└── ISP 無法看到你在運行比特幣節點
3. 匿名接收
└── 可以接受入站連接而不暴露位置
4. Sybil 攻擊防護
└── 更難被惡意節點包圍
|
3.2 基本 Tor 設定
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| # 安裝 Tor
sudo apt install tor
# 編輯 Tor 配置
sudo nano /etc/tor/torrc
# 添加以下內容:
ControlPort 9051
CookieAuthentication 1
CookieAuthFileGroupReadable 1
# 將 bitcoin 用戶加入 tor 群組
sudo usermod -a -G debian-tor bitcoin
# 重啟 Tor
sudo systemctl restart tor
sudo systemctl enable tor
|
3.3 配置 Bitcoin Core 使用 Tor
bitcoin.conf 設定:
1
2
3
4
5
6
7
8
9
10
11
12
| # 通過 Tor 代理連接
proxy=127.0.0.1:9050
# 啟用洋蔥服務(允許入站連接)
listenonion=1
# 只通過 Tor 連接(最高隱私)
onlynet=onion
# 或同時使用 clearnet 和 Tor
# 不要設定 onlynet,註解掉
# onlynet=onion
|
3.4 Tor 隱藏服務設定
1
2
3
4
5
6
7
8
9
10
11
12
13
| # 編輯 Tor 配置
sudo nano /etc/tor/torrc
# 添加隱藏服務:
HiddenServiceDir /var/lib/tor/bitcoin-service/
HiddenServicePort 8333 127.0.0.1:8333
# 重啟 Tor
sudo systemctl restart tor
# 獲取你的 .onion 地址
sudo cat /var/lib/tor/bitcoin-service/hostname
# 輸出類似:abc123...xyz.onion
|
3.5 驗證 Tor 連接
1
2
3
4
5
6
7
8
9
10
11
12
13
| # 檢查 Tor 連接
bitcoin-cli getnetworkinfo | grep -A 10 '"networks"'
# 應該看到:
# "onion": {
# "reachable": true,
# ...
# }
# 查看連接的節點類型
bitcoin-cli getpeerinfo | grep "addr"
# .onion 結尾的就是 Tor 連接
|
四、備份策略
4.1 需要備份什麼?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| 重要性排序:
必要備份(丟失 = 無法恢復):
├── wallet.dat - 錢包文件(如使用內建錢包)
└── 私鑰/種子詞 - 最重要!
建議備份(丟失 = 需要重新配置):
├── bitcoin.conf - 配置文件
├── peers.dat - 已知節點列表
└── banlist.dat - 封禁列表
不需要備份(可重新下載):
├── blocks/ - 區塊數據
├── chainstate/ - UTXO 數據庫
└── indexes/ - 索引數據
|
4.2 錢包備份
1
2
3
4
5
6
7
8
9
10
| # 方法 1:使用 bitcoin-cli
bitcoin-cli backupwallet /path/to/backup/wallet.dat.backup
# 方法 2:直接複製(需要停止節點)
sudo systemctl stop bitcoind
cp ~/.bitcoin/wallets/*/wallet.dat /path/to/backup/
sudo systemctl start bitcoind
# 方法 3:導出私鑰/描述符
bitcoin-cli listdescriptors true > descriptors_backup.json
|
4.3 配置備份腳本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
| #!/bin/bash
# 儲存為 /home/bitcoin/backup-node.sh
BACKUP_DIR="/mnt/backup/bitcoin-node"
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_PATH="$BACKUP_DIR/$DATE"
mkdir -p "$BACKUP_PATH"
# 備份配置文件
cp ~/.bitcoin/bitcoin.conf "$BACKUP_PATH/"
# 備份錢包(如果存在)
if [ -d ~/.bitcoin/wallets ]; then
bitcoin-cli backupwallet "$BACKUP_PATH/wallet.dat"
fi
# 備份 peers.dat
cp ~/.bitcoin/peers.dat "$BACKUP_PATH/" 2>/dev/null
# 壓縮
tar -czf "$BACKUP_DIR/backup_$DATE.tar.gz" -C "$BACKUP_PATH" .
rm -rf "$BACKUP_PATH"
# 保留最近 7 個備份
ls -t "$BACKUP_DIR"/backup_*.tar.gz | tail -n +8 | xargs rm -f
echo "備份完成: $BACKUP_DIR/backup_$DATE.tar.gz"
|
4.4 自動備份排程
1
2
3
4
5
| # 編輯 crontab
crontab -e
# 每天凌晨 3 點執行備份
0 3 * * * /home/bitcoin/backup-node.sh >> /var/log/bitcoin-backup.log 2>&1
|
4.5 備份驗證
1
2
3
| # 定期測試備份恢復
tar -tzf backup_YYYYMMDD.tar.gz # 列出內容
tar -xzf backup_YYYYMMDD.tar.gz -C /tmp/test-restore/ # 測試解壓
|
五、日常維護
5.1 監控腳本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
| #!/bin/bash
# 儲存為 /home/bitcoin/node-status.sh
echo "=== Bitcoin Node 狀態報告 ==="
echo "時間: $(date)"
echo ""
# 節點運行狀態
if systemctl is-active --quiet bitcoind; then
echo "服務狀態: 運行中 ✓"
else
echo "服務狀態: 已停止 ✗"
exit 1
fi
# 區塊鏈同步狀態
INFO=$(bitcoin-cli getblockchaininfo 2>/dev/null)
if [ $? -eq 0 ]; then
BLOCKS=$(echo $INFO | jq -r '.blocks')
HEADERS=$(echo $INFO | jq -r '.headers')
PROGRESS=$(echo $INFO | jq -r '.verificationprogress * 100' | xargs printf "%.4f")
SIZE=$(echo $INFO | jq -r '.size_on_disk / 1073741824' | xargs printf "%.2f")
echo "區塊高度: $BLOCKS / $HEADERS"
echo "同步進度: $PROGRESS%"
echo "磁碟使用: ${SIZE} GB"
fi
# 連接狀態
PEERS=$(bitcoin-cli getconnectioncount 2>/dev/null)
echo "連接節點: $PEERS"
# 記憶體池
MEMPOOL=$(bitcoin-cli getmempoolinfo 2>/dev/null)
if [ $? -eq 0 ]; then
TX_COUNT=$(echo $MEMPOOL | jq -r '.size')
MEMPOOL_SIZE=$(echo $MEMPOOL | jq -r '.bytes / 1048576' | xargs printf "%.2f")
echo "記憶體池: $TX_COUNT 筆交易 (${MEMPOOL_SIZE} MB)"
fi
# 系統資源
echo ""
echo "=== 系統資源 ==="
echo "CPU 負載: $(uptime | awk -F'load average:' '{print $2}')"
echo "記憶體: $(free -h | awk '/^Mem:/ {print $3 "/" $2}')"
echo "磁碟: $(df -h /mnt/bitcoin | awk 'NR==2 {print $3 "/" $2 " (" $5 ")"}')"
# Tor 狀態
if systemctl is-active --quiet tor; then
echo "Tor 狀態: 運行中 ✓"
else
echo "Tor 狀態: 已停止 ✗"
fi
echo ""
|
5.2 日誌輪替
1
2
| # 建立 logrotate 配置
sudo nano /etc/logrotate.d/bitcoind
|
1
2
3
4
5
6
7
8
9
10
11
12
| /mnt/bitcoin/bitcoind/debug.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
create 0640 bitcoin bitcoin
postrotate
killall -HUP bitcoind 2>/dev/null || true
endscript
}
|
5.3 軟體更新程序
更新 Bitcoin Core:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
| # 1. 下載新版本
cd ~/bitcoin-core
VERSION=27.1
wget https://bitcoincore.org/bin/bitcoin-core-${VERSION}/bitcoin-${VERSION}-x86_64-linux-gnu.tar.gz
wget https://bitcoincore.org/bin/bitcoin-core-${VERSION}/SHA256SUMS
wget https://bitcoincore.org/bin/bitcoin-core-${VERSION}/SHA256SUMS.asc
# 2. 驗證
sha256sum --ignore-missing --check SHA256SUMS
gpg --verify SHA256SUMS.asc SHA256SUMS
# 3. 停止服務
sudo systemctl stop bitcoind
# 4. 備份舊版本
sudo mv /usr/local/bin/bitcoin* /tmp/bitcoin-backup/
# 5. 安裝新版本
tar -xzf bitcoin-${VERSION}-*.tar.gz
sudo install -m 0755 -o root -g root -t /usr/local/bin bitcoin-${VERSION}/bin/*
# 6. 重啟服務
sudo systemctl start bitcoind
# 7. 驗證版本
bitcoin-cli --version
|
5.4 健康檢查清單
每日檢查:
1
2
3
4
| [ ] 節點是否在運行?
[ ] 同步是否正常?(不應該落後太多)
[ ] 磁碟空間是否充足?(>20% 可用)
[ ] 連接數是否正常?(8-40 個)
|
每週檢查:
1
2
3
4
| [ ] 系統更新是否有安全補丁?
[ ] 日誌是否有異常錯誤?
[ ] 備份是否正常執行?
[ ] Tor 連接是否正常?
|
每月檢查:
1
2
3
4
| [ ] Bitcoin Core 是否有新版本?
[ ] 測試備份恢復
[ ] 檢查防火牆規則
[ ] 審查 SSH 登入記錄
|
六、監控和警報
6.1 設定 Email 警報
1
2
3
4
5
| # 安裝 mailutils
sudo apt install mailutils ssmtp
# 配置 SMTP(以 Gmail 為例)
sudo nano /etc/ssmtp/ssmtp.conf
|
1
2
3
4
5
6
| root=your-email@gmail.com
mailhub=smtp.gmail.com:587
AuthUser=your-email@gmail.com
AuthPass=your-app-password
UseTLS=YES
UseSTARTTLS=YES
|
警報腳本:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
| #!/bin/bash
# 儲存為 /home/bitcoin/alert-check.sh
EMAIL="your-email@example.com"
# 檢查節點是否運行
if ! systemctl is-active --quiet bitcoind; then
echo "Bitcoin 節點已停止!" | mail -s "⚠️ Bitcoin 節點警報" $EMAIL
fi
# 檢查同步狀態
BLOCKS=$(bitcoin-cli getblockcount 2>/dev/null)
HEADERS=$(bitcoin-cli getblockchaininfo 2>/dev/null | jq -r '.headers')
if [ ! -z "$BLOCKS" ] && [ ! -z "$HEADERS" ]; then
BEHIND=$((HEADERS - BLOCKS))
if [ $BEHIND -gt 10 ]; then
echo "節點落後 $BEHIND 個區塊!" | mail -s "⚠️ Bitcoin 同步警報" $EMAIL
fi
fi
# 檢查磁碟空間
USAGE=$(df /mnt/bitcoin | awk 'NR==2 {print $5}' | tr -d '%')
if [ $USAGE -gt 85 ]; then
echo "磁碟使用率: $USAGE%!" | mail -s "⚠️ Bitcoin 磁碟警報" $EMAIL
fi
|
1
2
3
4
5
| # 添加到 crontab
crontab -e
# 每 15 分鐘檢查一次
*/15 * * * * /home/bitcoin/alert-check.sh
|
6.2 Prometheus + Grafana(進階)
1
2
3
4
5
| # 這是進階監控方案,需要更多設定
# 可以使用 bitcoin-prometheus-exporter
# 基本概念:
# Bitcoin Core → Exporter → Prometheus → Grafana
|
七、安全事件響應
7.1 如果懷疑被入侵
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| # 1. 立即斷開網路(如果嚴重)
sudo ifconfig eth0 down
# 2. 檢查異常登入
last -20
grep "Failed password" /var/log/auth.log
# 3. 檢查異常進程
ps aux | grep -v "^\[" | head -20
netstat -tulpn
# 4. 檢查異常文件修改
find /home -mtime -1 -type f
find /etc -mtime -1 -type f
# 5. 檢查 crontab
crontab -l
sudo crontab -l
cat /etc/crontab
# 6. 如果錢包在節點上,立即轉移資金到安全地址
|
7.2 錢包安全最佳實踐
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| 建議:
1. 不要在節點上存放大量資金
└── 節點主要用於驗證,不是儲存
2. 使用硬體錢包
└── Coldcard, Trezor, Ledger
3. 如果必須使用內建錢包
├── 啟用錢包加密
├── 定期備份
└── 考慮使用描述符錢包
4. 多重簽名
└── 重要資金使用多簽
|
加密錢包:
1
2
3
4
5
6
7
8
| # 加密錢包
bitcoin-cli encryptwallet "your-strong-passphrase"
# 解鎖錢包(需要時)
bitcoin-cli walletpassphrase "your-passphrase" 60
# 鎖定錢包
bitcoin-cli walletlock
|
八、常見安全問題 Q&A
Q1:運行全節點會被追蹤嗎?
1
2
3
4
5
6
7
8
9
| 不使用 Tor:
- 其他節點知道你的 IP
- ISP 可以看到比特幣流量
- 但不知道具體交易內容
使用 Tor:
- 高度匿名
- ISP 只看到 Tor 流量
- 推薦使用
|
Q2:節點被攻擊怎麼辦?
1
2
3
4
5
6
7
8
9
10
| 攻擊類型和防護:
1. DDoS 攻擊
└── 防護:防火牆限制連接數、使用 Tor
2. Eclipse 攻擊(被惡意節點包圍)
└── 防護:使用多個出站連接、添加可信節點
3. 系統入侵
└── 防護:SSH 金鑰認證、系統更新、防火牆
|
Q3:需要定期更換 Tor 地址嗎?
1
2
3
| 通常不需要。
.onion 地址可以長期使用。
如果有隱私顧慮,可以刪除 HiddenServiceDir 目錄並重啟 Tor。
|
下一步
恭喜!你的節點現在已經有了基本的安全防護。在本系列的最後一篇文章中,我們將探討:
- 閃電網路整合
- 區塊瀏覽器(mempool)
- Electrum 伺服器
- BTCPay Server
- 其他應用整合
參考資料