Files
netbird-selfhosted/ssh-access.md
timmy a80b254a4d docs: rename StrongHotpink-VM peer to virmach-lax
VirMach-assigned OS hostname wasn't very identifiable. Renamed the
NetBird peer (and NB_HOSTNAME env) to virmach-lax — vendor + airport
code convention that scales if more VirMach VPSes in other regions
get added later (virmach-nrt, virmach-fra, etc).

New FQDN: virmach-lax.netbird.selfhosted
Operations reference: ssh root@virmach-lax.netbird.selfhosted

OS-level hostname left as StrongHotpink-VM (provider default).
2026-04-18 23:09:09 +08:00

145 lines
5.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# SSH via NetBird兩種 SSH 不要搞混
NetBird 使用者看到 Dashboard 上的 "SSH Access" 功能時常困惑 — 明明我可以 SSH 到 peer為何 Dashboard 說 "SSH Access is disabled"
答案:**Dashboard 的 "SSH Access" 跟你 terminal 打的 `ssh` 指令是兩個不同的東西**。
## 對照表
| | 一般 SSH | NetBird 內建 SSH |
|---|---|---|
| 服務來源 | peer 上跑的 OpenSSH (通常 port 22) | NetBird client daemon 內建 SSH server |
| 觸發方式 | `ssh user@<ip-or-fqdn>` | Dashboard 的 Connect → SSH 按鈕<br>或 CLI `netbird ssh <peer-fqdn>` |
| 認證 | SSH key / 密碼(目標機器管理的) | NetBird mesh 身份peer 之間 trust |
| 網路 | 走 NetBird 隧道,但封包內容是標準 SSH | NetBird 自己的通道,不用 port 22 |
| Dashboard policy | 不管(只要 peer 間互通、port 22 可達) | 需要,且要啟用 `SSH Enabled` on peer + SSH policy |
| 預設是否可用 | 是peer 裝好 OpenSSH 且允許登入就行) | 否(預設 disabled |
## 實例:從 Mac SSH 到 CT124
```
% ssh 192.168.42.124
Welcome to Ubuntu 24.04.2 LTS (GNU/Linux 6.8.12-16-pve x86_64)
root@CT124:~#
```
這條連線的路徑:
```
Mac ──(NetBird overlay)──▶ CT100 (subnet router)
│ masquerade
192.168.42.124:22 ←── CT124 原生 OpenSSH
```
走的是 CT124 **本機的 sshd**(由 CT124 管理的 `/etc/ssh/sshd_config``~/.ssh/authorized_keys`)。這跟 Dashboard 的 "SSH Access" 功能**完全無關**。
即使 Dashboard 顯示 "SSH Access is disabled"`ssh 192.168.42.124` 依然能用。
## 什麼時候需要啟用 NetBird 內建 SSH
只有在這些情境有用:
1. **Dashboard 網頁端直接開 terminal** — 手機 Dashboard 上按 Connect → SSH瀏覽器內直接操作
2. **不想管 target 機器的 SSH key 分發** — 信任 NetBird peer 身份就好
3. **目標機器的 OpenSSH 有問題**(但這種時候 CT 通常更多事)
4. **想走 gRPC 通道而非 port 22**(少見,特殊合規需求)
家用自架環境**多半不需要**。已經有:
- Peer 上正常的 OpenSSH
- `~/.ssh/authorized_keys` 裡的 key
- 直接 `ssh``ssh <peer-fqdn>.netbird.selfhosted` 就行
## 如果真的要啟用
### 在 peer 上
編輯 `/etc/netbird/config.json` 或啟動時加 `--enable-ssh`,然後重啟 daemon。對 Docker 部署的客戶端,可以在 `docker-compose.yml` 加 env var `NB_ENABLE_SSH=true`,然後 `docker compose up -d` 重建。
### 在 Dashboard
1. 點 Peer 那一列的 ... → Edit → 打開 **SSH**
2. Access Control → Policies → **Add Policy**
- Name: `ssh-access`
- Source: `personal`(允許誰 SSH
- Destination: 目標 group`servers`
- Protocol: **SSH** (或 TCP + port 22取決於 NetBird SSH server 監聽的 port — 內建 SSH server 跑在固定 port `44338`)
- Enabled
### 驗證
```bash
netbird ssh ct100.netbird.selfhosted
# 或 Dashboard 上 Peer 旁邊的 Connect → SSH 按鈕變亮
```
## 小結
- **Dashboard "SSH Access" disabled 跟你 SSH 得不得進去沒關係** — 前者是 NetBird 自己的通道功能,後者是你一般用的 SSH
- 家用環境通常**不需要啟用** NetBird SSH用原生 OpenSSH 就夠
- 有需要再開,兩種不衝突,可以並存
## 實務應用:用 NetBird 取代 SSH 源 IP 白名單
### 情境
遠端 VM 的 SSH (port 22) 被 iptables 白名單限制只有特定源 IP 能進:
```
ACCEPT tailscale0 * 0.0.0.0/0 tcp dpt:22 /* via Tailscale */
ACCEPT * * 211.23.141.206 tcp dpt:22 /* specific IP */
ACCEPT * * 125.229.110.50 tcp dpt:22 /* HiNet WAN */
DROP * * 0.0.0.0/0 tcp dpt:22 /* drop everything else */
```
你的 Mac 從咖啡店連不到,因為當下 ISP 出口 IP 不在白名單。
### 兩個解法對比
**A. 暫時跳板**(不改遠端 VM
```
ssh -J root@<whitelisted-peer>.netbird.selfhosted root@141.11.93.252
```
Mac → NetBird → 家裡有白名單的 peer → 借它的公網 IP → VM。原生 OpenSSH 的 `ProxyJump`,跟 NetBird 的 SSH Access 功能無關。
**B. 把 VM 加進 NetBird mesh**(長期治本):
1. 在 VM 部署 NetBird client 容器(見 `peer-deployment-ops.md`
2. 在 VM 的 iptables 加一條鏡像 tailscale0 的規則:
```
iptables -I INPUT <位置> -i wt0 -p tcp --dport 22 -j ACCEPT \
-m comment --comment "Allow SSH from NetBird interface"
```
插入點在「DROP all other SSH」那條之前
3. 之後 Mac / iPhone / 任何 NetBird peer 都能直接 SSH 到 VM**不用再跳板**
### 本部署的實例(`virmach-lax`2026-04-18
`141.11.93.252`VirMach VPSLos Angeles原本 SSH port 22 只認 `tailscale0` + `211.23.141.206` + HiNet。Mac 從另一個 ISP 連不到。採用方案 B
- NetBird IP `100.71.121.88`FQDN `virmach-lax.netbird.selfhosted`
- 加 `iptables -I INPUT <位置> -i wt0 -p tcp --dport 22 -j ACCEPT`
- 踩到同一個 **Tailscale kernel-mode iptables-legacy 衝突**(見 `peer-deployment-ops.md`),加 systemd oneshot 解決
- `auto_groups=[servers]` 直接進正確 grouppolicy 自動套用
結果Mac 直接 `ssh root@virmach-lax.netbird.selfhosted` 即可進入RTT ~175ms走 Relay跨區 P2P 不易打通但不影響 SSH
### 配置策略建議
遠端 VM 的 SSH 白名單**保留 NetBird interface 這條**、**砍掉固定 IP 白名單**
```diff
ACCEPT tailscale0 * tcp dpt:22
+ ACCEPT wt0 * tcp dpt:22
- ACCEPT * * 211.23.141.206 tcp dpt:22 ← 砍掉
- ACCEPT * * 125.229.110.50 tcp dpt:22 ← 砍掉
DROP * * 0.0.0.0/0 tcp dpt:22
```
好處:
- 不用再維護公網 IP 白名單HiNet 動態 IP 變了就斷線)
- SSH 強制走 overlay 網路,減少暴露面
- 新加入的 NetBird peer增加新裝置自動取得存取權不用改防火牆