diff --git a/knowledgebase/FRP 配置详细笔记.md b/knowledgebase/FRP 配置详细笔记.md index 8d7e7433..233c957a 100644 --- a/knowledgebase/FRP 配置详细笔记.md +++ b/knowledgebase/FRP 配置详细笔记.md @@ -7,12 +7,9 @@ created: 2026-04-03 description: tags: [frp, macos, ubuntu] --- - - - +#frp #macos #ubuntu #nas #frpc #fprs #caddy # FRP 配置详细笔记 -#frp #macos #ubuntu ## 概述 本文档记录 macmini、ubuntu1、ubuntu2、NAS 四个服务器上的 FRP(Fast Reverse Proxy)客户端配置信息。 diff --git a/knowledgebase/Gitea 完整配置指南(SSH + frp + Caddy).md b/knowledgebase/Gitea 完整配置指南(SSH + frp + Caddy).md index 94ec19de..dbd1df1b 100644 --- a/knowledgebase/Gitea 完整配置指南(SSH + frp + Caddy).md +++ b/knowledgebase/Gitea 完整配置指南(SSH + frp + Caddy).md @@ -136,49 +136,93 @@ ssh-add ~/.ssh/id_ed25519 ## 1. 整体架构 -### 正确的访问方式 +### 实际部署拓扑 ``` -┌─────────────────────────────────────────────────────────┐ -│ 远程访问架构 │ -├─────────────────────────────────────────────────────────┤ -│ │ -│ HTTP 访问(通过 Caddy 反代) │ -│ 浏览器 → Caddy :443 → frps :13000 → Gitea :3000 │ -│ │ -│ SSH 访问(直接转发,绕过 Caddy) │ -│ Git Client → frps :12222 → Gitea :2222 │ -│ │ -└─────────────────────────────────────────────────────────┘ +┌──────────────────────────────────────────────────────────────────┐ +│ Gitea 远程访问架构 │ +├──────────────────────────────────────────────────────────────────┤ +│ │ +│ ┌─────────┐ │ +│ │ Browser │──HTTPS──┐ │ +│ └─────────┘ │ │ +│ ▼ │ +│ ┌──────────┐ ┌──────────┐ │ +│ │ Caddy │───▶│ frps │ VPS1 │ +│ │ :80/:443 │ │ :7000 │ 192.227.222.142 │ +│ └──────────┘ │ :13001 │ │ +│ │ :12222 │ │ +│ └────┬─────┘ │ +│ │ frp 隧道 │ +│ ┌─────────────┐ │ │ +│ │ Git Client │──TCP :12222─────────┤ │ +│ └─────────────┘ │ │ +│ ▼ │ +│ ┌──────────┐ │ +│ │ frpc │ NAS │ +│ │ Gitea │ 192.168.x.x │ +│ │ :3000 │ (Web) │ +│ │ :2222 │ (SSH) │ +│ └──────────┘ │ +│ │ +└──────────────────────────────────────────────────────────────────┘ ``` +### 端口分配 + +| 端点 | 端口 | 说明 | +|------|------|------| +| VPS1 :7000 | frps 控制 | frpc 与 frps 通信 | +| VPS1 :13001 | Gitea HTTP | Caddy 反代目标(不直接对外) | +| VPS1 :12222 | Gitea SSH | Git 客户端直连 | +| VPS1 :443 | Caddy HTTPS | gitea.ishenwei.online 入口 | +| NAS :3000 | Gitea Web | Docker 容器映射端口 | +| NAS :2222 | Gitea SSH | Docker `2222:22` 映射 | + ### 核心原则 -1. **HTTP 走 Caddy**:Web 浏览器通过 Caddy 反代访问 Gitea Web UI +1. **HTTP 走 Caddy**:浏览器通过 Caddy 反代访问 Gitea Web UI(自动 HTTPS) 2. **SSH 直接转发**:SSH 流量不经过 Caddy(Caddy 是 HTTP 代理,无法处理 SSH TCP 流量) -3. **防火墙放行**:frps 服务器必须在防火墙中放行相应端口 +3. **防火墙放行**:VPS1 必须放行 7000、13001、12222 三个端口 +4. **13001 不要直接对外**:仅供 Caddy 本机反代用,可用 iptables 限制为 localhost 访问 --- -## 2. frpc 配置(本地端,如 NAS) +## 2. frpc 配置(NAS 端) -### frpc.toml 配置文件 +### 部署位置 + +- **路径**:`/opt/frp/frp_0.65.0_linux_amd64/frpc.toml` +- **运行方式**:systemd(详见第五部分管理命令) + +### frpc.toml 配置(Gitea 相关部分) ```toml -serverAddr = "your-vps.com" +# ===== 服务器连接 ===== +serverAddr = "192.227.222.142" # VPS1 serverPort = 7000 auth.method = "token" -auth.token = "your-token" +auth.token = "Gg8sqHJVgh42KQ0oTatMjl6AywWqAzaaT0B77a4qD46tXtoH9j9mXb2k1YitObhs" -# HTTP 转发 - 给 Caddy 用 +# ===== 日志 ===== +log.level = "info" +log.maxDays = 3 + +# ===== 管理界面(可选)===== +webServer.addr = "127.0.0.1" +webServer.port = 7400 +webServer.user = "admin" +webServer.password = "admin" + +# ===== Gitea Web(给 Caddy 反代用)===== [[proxies]] -name = "gitea-http" +name = "gitea-web" type = "tcp" localIP = "127.0.0.1" localPort = 3000 remotePort = 13001 -# SSH 转发 - 直接暴露 +# ===== Gitea SSH(直接暴露给 Git 客户端)===== [[proxies]] name = "gitea-ssh" type = "tcp" @@ -188,58 +232,220 @@ remotePort = 12222 ``` **配置说明:** -- `remotePort = 13001`:Caddy 通过此端口访问 Gitea Web UI -- `remotePort = 12222`:Git 客户端通过此端口连接 SSH +- `remotePort = 13001`:Caddy 在 VPS1 上反代此端口 +- `remotePort = 12222`:Git 客户端通过 `gitea.ishenwei.online:12222` 连接 --- -## 3. frps 配置(服务器端,如 VPS) +## 3. frps 配置(VPS1 端) -### frps.toml 配置文件 +### 基本信息 + +| 配置项 | 值 | +|--------|-----| +| 服务器 IP | 192.227.222.142 | +| 部署路径 | `/opt/frp/frp_0.65.0_linux_amd64/` | +| 配置文件 | `frps.toml` | +| 运行方式 | systemd | +| 管理界面 | http://127.0.0.1:7500 (admin/admin) | + +### frps.toml 配置 ```toml +# ===== 监听配置 ===== bindAddr = "0.0.0.0" bindPort = 7000 + +# ===== 认证(必须与所有 frpc 一致)===== auth.method = "token" -auth.token = "your-token" +auth.token = "Gg8sqHJVgh42KQ0oTatMjl6AywWqAzaaT0B77a4qD46tXtoH9j9mXb2k1YitObhs" + +# ===== 日志 ===== +log.to = "/var/log/frps.log" +log.level = "info" +log.maxDays = 7 + +# ===== 管理 Dashboard ===== +webServer.addr = "0.0.0.0" +webServer.port = 7500 +webServer.user = "admin" +webServer.password = "admin" + +# ===== 安全限制(可选但推荐)===== +# 限制 frpc 可以使用的端口范围 +allowPorts = [ + { start = 10000, end = 65535 } +] + +# 单个客户端最大代理数 +maxPoolCount = 50 + +# 心跳超时(秒) +transport.heartbeatTimeout = 90 ``` -### 防火墙配置 +### frps systemd 服务 -**在 VPS 上放行端口:** +创建 `/etc/systemd/system/frps.service`: + +```ini +[Unit] +Description=frp server +After=network-online.target +Wants=network-online.target + +[Service] +Type=simple +ExecStart=/opt/frp/frp_0.65.0_linux_amd64/frps -c /opt/frp/frp_0.65.0_linux_amd64/frps.toml +Restart=on-failure +RestartSec=10 +LimitNOFILE=1048576 + +[Install] +WantedBy=multi-user.target +``` + +启用并启动: ```bash -# UFW(Ubuntu/Debian) -ufw allow 7000/tcp # frp 通信 -ufw allow 13001/tcp # Gitea Web(给 Caddy) -ufw allow 12222/tcp # Gitea SSH +systemctl daemon-reload +systemctl enable frps +systemctl start frps +systemctl status frps -# iptables -iptables -A INPUT -p tcp --dport 7000 -j ACCEPT -iptables -A INPUT -p tcp --dport 13001 -j ACCEPT -iptables -A INPUT -p tcp --dport 12222 -j ACCEPT +# 查看日志 +journalctl -u frps -f +tail -f /var/log/frps.log ``` -**AWS/阿里云/腾讯云等云服务:** -- 需要同时配置安全组(云控制台)和系统防火墙 -- 缺一不可 +### VPS1 防火墙配置 + +```bash +# UFW(推荐) +ufw allow 7000/tcp # frp 控制通道 +ufw allow 12222/tcp # Gitea SSH(对外) +ufw allow 80/tcp # Caddy HTTP(自动跳转 HTTPS) +ufw allow 443/tcp # Caddy HTTPS + +# 13001 仅本机访问,无需对外放行 +# 如果需要明确禁止,可以: +ufw deny 13001/tcp + +# 验证规则 +ufw status numbered +``` + +**重要:** 如果 VPS 提供商有云控制台安全组(如 AWS Security Group、阿里云安全组),**必须同时放行**,缺一不可。 --- -## 4. Caddy 反代配置 +## 4. Caddy 反代配置(VPS1 端) + +Caddy 部署在与 frps 相同的 VPS1 上,自动申请并续期 Let's Encrypt 证书。 + +### 安装 Caddy(Debian/Ubuntu) + +```bash +sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl +curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' \ + | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg +curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' \ + | sudo tee /etc/apt/sources.list.d/caddy-stable.list +sudo apt update +sudo apt install caddy +``` + +Caddy 安装后自动注册为 systemd 服务,配置文件位于 `/etc/caddy/Caddyfile`。 ### Caddyfile 配置 +编辑 `/etc/caddy/Caddyfile`: + ```caddy -gitea.yourdomain.com { - reverse_proxy 127.0.0.1:13001 +# ============================================ +# Gitea Web UI +# ============================================ +gitea.ishenwei.online { + # 反代到本机 frps 监听的 Gitea HTTP 端口 + reverse_proxy 127.0.0.1:13001 { + # 传递真实客户端 IP 给 Gitea + header_up X-Real-IP {remote_host} + header_up X-Forwarded-For {remote_host} + header_up X-Forwarded-Proto {scheme} + } + + # 日志(可选) + log { + output file /var/log/caddy/gitea.log { + roll_size 50mb + roll_keep 5 + } + format json + } + + # 大文件支持(Git push/LFS 必需) + request_body { + max_size 5GB + } } + +# ============================================ +# 其他服务示例(同样模式) +# ============================================ +# n8n.ishenwei.online { +# reverse_proxy 127.0.0.1:15679 +# } +# +# vaultwarden.ishenwei.online { +# reverse_proxy 127.0.0.1:15151 +# } ``` -**关键点:** -- 反代目标是 `127.0.0.1:13001`(frps 转发来的 HTTP 流量) -- **不要将 SSH 端口(12222)配进 Caddy** -- Caddy 只负责 HTTP/HTTPS,不处理 SSH +### 关键要点 + +- **反代目标是 `127.0.0.1:13001`**:frps 把 NAS 上 Gitea 的 :3000 转发到 VPS1 的 :13001 +- **不要将 SSH 端口(12222)配进 Caddy**:Caddy 是 HTTP/HTTPS 反向代理,无法承载 SSH TCP 协议 +- **自动 HTTPS**:Caddy 会自动通过 Let's Encrypt 申请证书并自动续期(前提是域名 A 记录已正确指向 VPS1,且 80/443 端口已放行) +- **大文件支持**:`request_body max_size` 必须设置足够大,否则 `git push` 大仓库会失败 + +### DNS 配置 + +在你的 DNS 服务商(Cloudflare/阿里云等)添加 A 记录: + +``` +gitea.ishenwei.online A 192.227.222.142 +``` + +如果使用 Cloudflare,**必须关闭代理(小灰云)** 用 DNS only 模式,否则 Caddy 申请证书会失败,且 SSH 不工作。 + +### Caddy 管理命令 + +```bash +# 验证 Caddyfile 语法 +caddy validate --config /etc/caddy/Caddyfile + +# 优雅重载(修改配置后用这个,不会断连) +sudo systemctl reload caddy + +# 查看状态 +sudo systemctl status caddy + +# 查看日志 +sudo journalctl -u caddy -f +tail -f /var/log/caddy/gitea.log +``` + +### 验证 HTTPS + +```bash +# 测试证书 +curl -I https://gitea.ishenwei.online + +# 预期返回: +# HTTP/2 200 +# server: Caddy +# ... +``` --- @@ -719,14 +925,51 @@ services: 部署完成后,按以下顺序验证: -- [ ] Docker 容器运行 `docker ps | grep gitea` -- [ ] SSH 服务启用 `docker exec gitea cat /data/gitea/conf/app.ini | grep SSH` -- [ ] 本地 SSH 连接 `ssh -T git@192.168.3.17 -p 2222` -- [ ] frp 连接正常 `journalctl -u frpc -f` -- [ ] SSH 端口放行(防火墙)`netstat -tlnp | grep 12222` -- [ ] Web UI 访问 浏览器打开 `https://gitea.yourdomain.com` -- [ ] 公钥已添加 Gitea Web UI 验证 -- [ ] Git Clone 测试 `git clone ssh://git@gitea.yourdomain.com:12222/username/repo.git` +**NAS 端(Gitea + frpc):** +- [ ] Docker 容器运行:`docker ps | grep gitea` +- [ ] SSH 服务启用:`docker exec gitea cat /data/gitea/conf/app.ini | grep SSH` +- [ ] 本地 SSH 测试:`ssh -T git@ -p 2222` +- [ ] frpc 服务运行:`systemctl status frpc` +- [ ] frpc 日志正常:`journalctl -u frpc -f` 显示 `[gitea-web] start proxy success` 和 `[gitea-ssh] start proxy success` + +**VPS1 端(frps + Caddy):** +- [ ] frps 服务运行:`systemctl status frps` +- [ ] frps Dashboard 可访问:`http://192.227.222.142:7500` (admin/admin) +- [ ] 端口监听:`ss -tlnp | grep -E '7000|12222|13001'` +- [ ] 防火墙放行:`ufw status` 包含 7000/12222/80/443 +- [ ] Caddy 运行:`systemctl status caddy` +- [ ] DNS 解析正确:`dig gitea.ishenwei.online +short` → `192.227.222.142` + +**客户端:** +- [ ] 公钥已添加:Gitea Web UI → Settings → SSH Keys +- [ ] HTTPS 访问:浏览器打开 `https://gitea.ishenwei.online`(绿锁) +- [ ] SSH 连接:`ssh -T git@gitea.ishenwei.online -p 12222` 返回 `Hi !` +- [ ] Git Clone:`git clone ssh://git@gitea.ishenwei.online:12222//.git` + +--- + +## 完整端到端部署流程速查 + +``` +┌─────────────────────────────────────────────────────────────┐ +│ 1. NAS: 启动 Gitea Docker (端口 3000, 2222:22) │ +│ 2. NAS: 配置 app.ini (SSH_DOMAIN, SSH_PORT=12222) │ +│ 3. NAS: 部署 frpc.toml (gitea-web:13001, gitea-ssh:12222) │ +│ 4. NAS: systemctl restart frpc │ +│ ↓ │ +│ 5. VPS1: 部署 frps.toml + frps.service │ +│ 6. VPS1: ufw allow 7000/12222/80/443 │ +│ 7. VPS1: systemctl enable --now frps │ +│ 8. VPS1: 编辑 /etc/caddy/Caddyfile (gitea.ishenwei.online) │ +│ 9. VPS1: systemctl reload caddy │ +│ ↓ │ +│ 10. DNS: 添加 A 记录 gitea → 192.227.222.142 │ +│ ↓ │ +│ 11. 客户端: 生成 SSH key + 上传公钥到 Gitea │ +│ 12. 客户端: 配置 ~/.ssh/config │ +│ 13. 客户端: git clone ssh://git@gitea.ishenwei.online:12222 │ +└─────────────────────────────────────────────────────────────┘ +``` ---