Add mc FRP
This commit is contained in:
2
.gitignore
vendored
2
.gitignore
vendored
@@ -1,4 +1,4 @@
|
|||||||
karylab-complex/example-server/
|
karylab-complex/example-server/
|
||||||
karylab-complex/others/
|
karylab-complex/others/
|
||||||
|
karylab-entrance/others/exchange.md
|
||||||
vs-code-server/
|
vs-code-server/
|
||||||
karylab-vps/
|
|
||||||
@@ -10,6 +10,9 @@ services:
|
|||||||
- TZ=Asia/Taipei
|
- TZ=Asia/Taipei
|
||||||
ports:
|
ports:
|
||||||
- "8000:8443" # 管理介面
|
- "8000:8443" # 管理介面
|
||||||
|
- "1110:1110"
|
||||||
|
- "1120:1120"
|
||||||
|
- "11100:11100"
|
||||||
volumes:
|
volumes:
|
||||||
- /docker/minecraft/crafty/backups:/crafty/backups
|
- /docker/minecraft/crafty/backups:/crafty/backups
|
||||||
- /docker/minecraft/crafty/logs:/crafty/logs
|
- /docker/minecraft/crafty/logs:/crafty/logs
|
||||||
@@ -78,7 +81,7 @@ services:
|
|||||||
- DOZZLE_TAILSIZE=500 # 日誌顯示行數
|
- DOZZLE_TAILSIZE=500 # 日誌顯示行數
|
||||||
- DOZZLE_FILTER=name=crafty*|name=minecraft* # 只顯示 MC 相關容器
|
- DOZZLE_FILTER=name=crafty*|name=minecraft* # 只顯示 MC 相關容器
|
||||||
ports:
|
ports:
|
||||||
- "8020:8080" # 訪問即可看到所有容器日誌
|
- "8020:8080" # 訪問 http://localhost:8020 即可看到所有容器日誌
|
||||||
volumes:
|
volumes:
|
||||||
- /var/run/docker.sock:/var/run/docker.sock:ro
|
- /var/run/docker.sock:/var/run/docker.sock:ro
|
||||||
networks:
|
networks:
|
||||||
@@ -88,39 +91,17 @@ services:
|
|||||||
limits:
|
limits:
|
||||||
memory: 256M
|
memory: 256M
|
||||||
|
|
||||||
# 4. GoEdge 管理後台 + API 節點 + MySQL
|
# 4. FRP 客戶端 (負責打通內網)
|
||||||
# 官方建議使用 goedgelabs/goedge-admin 映像,內建 MariaDB
|
# frpc:
|
||||||
goedge-admin:
|
# image: snowdreamtech/frpc:latest
|
||||||
image: goedgelabs/goedge-admin:latest
|
# container_name: frpc_tunnel
|
||||||
container_name: goedge_admin
|
# restart: unless-stopped
|
||||||
restart: unless-stopped
|
# 使用 host 模式,讓 frpc 能直接抓到 Crafty 開出的所有子伺服器 port
|
||||||
environment:
|
# network_mode: "host"
|
||||||
- TZ=Asia/Taipei
|
# volumes:
|
||||||
volumes:
|
# - /docker/minecraft/frpc/frpc.toml:/etc/frp/frpc.toml
|
||||||
- goedge_admin_mysql:/var/lib/mysql # MySQL 資料庫
|
|
||||||
- goedge_admin_data:/usr/local/goedge/edge-admin # Admin 設定 + 日誌 + API 設定
|
|
||||||
ports:
|
|
||||||
- "8030:7788" # 管理後台登入端口 (預設 admin/123456)
|
|
||||||
networks:
|
|
||||||
- minecraft_net
|
|
||||||
|
|
||||||
# 5. GoEdge 邊緣節點 (實際負責轉發的 Proxy)
|
# 5. 備份服務 (可選) - 自動備份到雲端或其他位置
|
||||||
goedge-node:
|
|
||||||
image: goedgelabs/goedge-node:latest
|
|
||||||
container_name: goedge_node
|
|
||||||
restart: unless-stopped
|
|
||||||
environment:
|
|
||||||
- TZ=Asia/Taipei
|
|
||||||
volumes:
|
|
||||||
- goedge_node_data:/usr/local/goedge/edge-node
|
|
||||||
ports:
|
|
||||||
- "1110-1200:1110-1200" # 預留 1110 到 1200 之間的 90 個端口
|
|
||||||
networks:
|
|
||||||
- minecraft_net
|
|
||||||
depends_on:
|
|
||||||
- goedge-admin
|
|
||||||
|
|
||||||
# 6. 備份服務 (可選) - 自動備份到雲端或其他位置
|
|
||||||
# duplicati:
|
# duplicati:
|
||||||
# image: lscr.io/linuxserver/duplicati:latest
|
# image: lscr.io/linuxserver/duplicati:latest
|
||||||
# container_name: minecraft_backup
|
# container_name: minecraft_backup
|
||||||
@@ -138,7 +119,7 @@ services:
|
|||||||
# networks:
|
# networks:
|
||||||
# - minecraft_net
|
# - minecraft_net
|
||||||
|
|
||||||
# 7. Watchtower - 自動更新容器映像檔(可選)
|
# 6. Watchtower - 自動更新容器映像檔(可選)
|
||||||
# watchtower:
|
# watchtower:
|
||||||
# image: containrrr/watchtower:latest
|
# image: containrrr/watchtower:latest
|
||||||
# container_name: watchtower_minecraft
|
# container_name: watchtower_minecraft
|
||||||
@@ -161,6 +142,3 @@ volumes:
|
|||||||
netdataconfig:
|
netdataconfig:
|
||||||
netdatalib:
|
netdatalib:
|
||||||
netdatacache:
|
netdatacache:
|
||||||
goedge_admin_mysql: # MySQL 資料庫(單獨備份用)
|
|
||||||
goedge_admin_data: # Admin 所有資料(設定 + 日誌 + API)
|
|
||||||
goedge_node_data: # Node 所有資料(設定 + 日誌)
|
|
||||||
122
karylab-vps/exchange.md
Normal file
122
karylab-vps/exchange.md
Normal file
@@ -0,0 +1,122 @@
|
|||||||
|
# 工程師交接
|
||||||
|
|
||||||
|
## 1. cloudflared -> vps tunnel(已完成)
|
||||||
|
|
||||||
|
### 實作結果:採用方案一(FRP)
|
||||||
|
|
||||||
|
#### 檔案清單
|
||||||
|
|
||||||
|
| 檔案 | 位置 | 說明 |
|
||||||
|
|---|---|---|
|
||||||
|
| `vpstunnel+npm.yml` | `karylab-entrance/` | 內網 compose stack(frpc + npm + filebrowser) |
|
||||||
|
| `frpc.toml` | `karylab-entrance/config/` | frpc 設定,掛載至 frpc container |
|
||||||
|
| `vps-tunnel.yml` | `karylab-vps/` | VPS compose stack(frps) |
|
||||||
|
| `frps.toml` | `karylab-vps/config/` | frps 設定,掛載至 frps container |
|
||||||
|
|
||||||
|
#### 架構說明
|
||||||
|
|
||||||
|
```
|
||||||
|
[外部訪客]
|
||||||
|
│ TCP 80/443
|
||||||
|
▼
|
||||||
|
[PVE VM(固定 IP)]
|
||||||
|
└─ frps container
|
||||||
|
│ TLS 加密隧道(Port 7000)
|
||||||
|
▼
|
||||||
|
[UCG 內網]
|
||||||
|
└─ frpc container ─→ npm container(Port 80/443)
|
||||||
|
│
|
||||||
|
▼
|
||||||
|
NAS / 其他內網服務
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 安全設計
|
||||||
|
|
||||||
|
- **控制通道 TLS**:frps 強制 `transport.tls.force = true`,frpc 開啟 `tls.enable = true`,控制通道全程加密
|
||||||
|
- **Token 驗證**:frpc 與 frps 使用 HMAC-SHA256 簽名的 token 驗證身份
|
||||||
|
- **NPM 管理後台(Port 81)不對外 tunnel**:只能從內網直接存取 `http://內網機器IP:81`
|
||||||
|
- **建議**:在 VPS 防火牆(UFW / iptables)限制 Port 7000 只允許內網出口 IP 連入
|
||||||
|
|
||||||
|
#### 部署注意事項
|
||||||
|
|
||||||
|
1. **VPS 防火牆**必須開放 inbound TCP Port **80、443、7000**,否則 frpc 會出現 `i/o timeout`
|
||||||
|
2. `frpc.toml` 的 `serverAddr` 填入 VPS 固定 IP 或可解析的網域皆可
|
||||||
|
3. `frpc.toml` 與 `frps.toml` 的 `token` 必須設定為**同一組強密碼**
|
||||||
|
4. 設定檔路徑:
|
||||||
|
- VPS:`/opt/frp/frps.toml`
|
||||||
|
- 內網:`/opt/cloudflare/frp/frpc.toml`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### 目標:
|
||||||
|
|
||||||
|
原來是cloudflare tunnel對接npm 再讓npm去找相關的設備
|
||||||
|
直接把tunnel換成其他容器 然後對接vps(pve上的vm)
|
||||||
|
|
||||||
|
### 方案說明:
|
||||||
|
|
||||||
|
部署在 PVE 上的那台「固定 IP VM」當作私有的 Cloudflare 節點(也就是您的自建 VPS),然後用特定的「隧道容器」來取代 cloudflared+npm.yml 中的 cloudflared,打通兩個隔離的網段。新的版本更新到 vpstunnel+npm.yml。
|
||||||
|
|
||||||
|
要達成這個目的,有兩種主流的開源工具/容器可以完美取代 Cloudflare Tunnel,以下為您分析兩種作法:
|
||||||
|
|
||||||
|
**方案一:使用 FRP (Fast Reverse Proxy) —— 最直接的 1:1 替換**
|
||||||
|
FRP 的運作邏輯與 Cloudflare Tunnel 幾乎一模一樣,只是伺服器從 Cloudflare 變成了您的 PVE VM。
|
||||||
|
|
||||||
|
架構配置:
|
||||||
|
```
|
||||||
|
前端 (您的 PVE VM - 具備固定 IP):安裝並運行 frps (FRP Server) 容器。它負責監聽來自網際網路的請求(如 Port 80, 443, 25565)。
|
||||||
|
|
||||||
|
後端 (您的 UCG 網段內):部署一個 frpc (FRP Client) 容器。這個容器會主動向 frps 發起連線,建立一條加密隧道。
|
||||||
|
|
||||||
|
路由分發:frpc 收到流量後,將 HTTP/HTTPS 流量轉交給同在 UCG 網段內的 NPM (Nginx Proxy Manager),再由 NPM 去找 UCG 底下的 NAS 或其他設備。
|
||||||
|
```
|
||||||
|
優點:架構與 Cloudflare Tunnel 概念完全一致,完全不用開 Port,因為是 frpc 由內向外主動連線的。
|
||||||
|
|
||||||
|
缺點:設定檔是基於 ini/yaml,需要稍微學習一下語法。
|
||||||
|
|
||||||
|
參考資源:FRP 官方 GitHub 專案庫與文件
|
||||||
|
|
||||||
|
**方案二:使用 WireGuard 或 Tailscale —— 網路層的虛擬區網 (推薦)**
|
||||||
|
與其只代理特定 Port,不如在 PVE VM 和 UCG 網段之間建立一個專屬的「虛擬私有區域網路 (VPN)」。
|
||||||
|
|
||||||
|
架構配置:
|
||||||
|
```
|
||||||
|
前端 (您的 PVE VM):安裝 NPM 以及 Tailscale (或 WireGuard) 容器。將 Zyxel 的 80/443 Port Forwarding 到這個 VM。
|
||||||
|
|
||||||
|
後端 (您的 UCG 網段內):只需要在負責提供服務的機器(或 NPM)上安裝 Tailscale,讓它們加入同一個虛擬網路。
|
||||||
|
|
||||||
|
路由分發:當外部訪客連線到您的固定 IP (PVE VM) 時,VM 上的 NPM 會解析網域,並透過 Tailscale 給的虛擬 IP(例如 100.x.x.x)將流量安全地轉發到 UCG 底下的設備。
|
||||||
|
```
|
||||||
|
優點:
|
||||||
|
|
||||||
|
極致的隔離:Tailscale / WireGuard 使用點對點加密,流量穿梭在 Zyxel 網段與 UCG 網段之間時是完全加密的。
|
||||||
|
|
||||||
|
管理方便:所有伺服器都在同一個虛擬網段內,互相溝通就像在同一個 Switch 下一樣簡單。
|
||||||
|
|
||||||
|
參考資源:Tailscale 官方網站、WireGuard 官方網站
|
||||||
|
|
||||||
|
**流量動線解析 (以方案二為例)**
|
||||||
|
假設訪客要訪問您在 UCG 網段下的 Nextcloud:
|
||||||
|
|
||||||
|
外部訪客輸入 cloud.example.com。
|
||||||
|
|
||||||
|
DNS (Cloudflare 灰雲) 將網域解析到您的 中華電信固定 IP。
|
||||||
|
|
||||||
|
流量抵達 vps 側路由器,透過 Port Forwarding 送入 PVE VM (自建 VPS) 的 Port 443。
|
||||||
|
|
||||||
|
PVE VM 上的 NPM 接收到請求,查看設定規則,發現要把流量送給 Nextcloud。
|
||||||
|
|
||||||
|
流量進入 隧道容器 (WireGuard/Tailscale),被加密打包。
|
||||||
|
|
||||||
|
加密封包穿越實體網路,抵達 UCG 網段下的目標機器。
|
||||||
|
|
||||||
|
目標機器解密封包,交由 Nextcloud 容器 處理。
|
||||||
|
|
||||||
|
這樣做的好處?
|
||||||
|
擺脫限制:完全沒有 Cloudflare 的 100MB 檔案大小限制,也沒有任何協議的限制(您可以傳輸 TCP, UDP, 甚至跑自訂協議)。
|
||||||
|
|
||||||
|
完美隔離:您的 UCG 路由器不需要開放任何對外 Port (Inbound 規則維持全擋),所有的外部威脅第一時間都是由 Zyxel 底下的 PVE VM 承受。就算 VM 被攻破,攻擊者也無法直接看見 UCG 底下的設備(除非他們破解了加密隧道)。
|
||||||
|
|
||||||
|
掌控權:資料不再經過第三方的邊緣節點解密(Cloudflare 橘雲會解密 HTTPS 流量),真正的端到端都在您自己的掌控之下。
|
||||||
Reference in New Issue
Block a user