详细更新
This commit is contained in:
@@ -7,12 +7,9 @@ created: 2026-04-03
|
|||||||
description:
|
description:
|
||||||
tags: [frp, macos, ubuntu]
|
tags: [frp, macos, ubuntu]
|
||||||
---
|
---
|
||||||
|
#frp #macos #ubuntu #nas #frpc #fprs #caddy
|
||||||
|
|
||||||
|
|
||||||
# FRP 配置详细笔记
|
# FRP 配置详细笔记
|
||||||
|
|
||||||
#frp #macos #ubuntu
|
|
||||||
## 概述
|
## 概述
|
||||||
|
|
||||||
本文档记录 macmini、ubuntu1、ubuntu2、NAS 四个服务器上的 FRP(Fast Reverse Proxy)客户端配置信息。
|
本文档记录 macmini、ubuntu1、ubuntu2、NAS 四个服务器上的 FRP(Fast Reverse Proxy)客户端配置信息。
|
||||||
|
|||||||
@@ -136,49 +136,93 @@ ssh-add ~/.ssh/id_ed25519
|
|||||||
|
|
||||||
## 1. 整体架构
|
## 1. 整体架构
|
||||||
|
|
||||||
### 正确的访问方式
|
### 实际部署拓扑
|
||||||
|
|
||||||
```
|
```
|
||||||
┌─────────────────────────────────────────────────────────┐
|
┌──────────────────────────────────────────────────────────────────┐
|
||||||
│ 远程访问架构 │
|
│ Gitea 远程访问架构 │
|
||||||
├─────────────────────────────────────────────────────────┤
|
├──────────────────────────────────────────────────────────────────┤
|
||||||
│ │
|
│ │
|
||||||
│ HTTP 访问(通过 Caddy 反代) │
|
│ ┌─────────┐ │
|
||||||
│ 浏览器 → Caddy :443 → frps :13000 → Gitea :3000 │
|
│ │ Browser │──HTTPS──┐ │
|
||||||
│ │
|
│ └─────────┘ │ │
|
||||||
│ SSH 访问(直接转发,绕过 Caddy) │
|
│ ▼ │
|
||||||
│ Git Client → frps :12222 → Gitea :2222 │
|
│ ┌──────────┐ ┌──────────┐ │
|
||||||
│ │
|
│ │ 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 流量)
|
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
|
```toml
|
||||||
serverAddr = "your-vps.com"
|
# ===== 服务器连接 =====
|
||||||
|
serverAddr = "192.227.222.142" # VPS1
|
||||||
serverPort = 7000
|
serverPort = 7000
|
||||||
auth.method = "token"
|
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]]
|
[[proxies]]
|
||||||
name = "gitea-http"
|
name = "gitea-web"
|
||||||
type = "tcp"
|
type = "tcp"
|
||||||
localIP = "127.0.0.1"
|
localIP = "127.0.0.1"
|
||||||
localPort = 3000
|
localPort = 3000
|
||||||
remotePort = 13001
|
remotePort = 13001
|
||||||
|
|
||||||
# SSH 转发 - 直接暴露
|
# ===== Gitea SSH(直接暴露给 Git 客户端)=====
|
||||||
[[proxies]]
|
[[proxies]]
|
||||||
name = "gitea-ssh"
|
name = "gitea-ssh"
|
||||||
type = "tcp"
|
type = "tcp"
|
||||||
@@ -188,58 +232,220 @@ remotePort = 12222
|
|||||||
```
|
```
|
||||||
|
|
||||||
**配置说明:**
|
**配置说明:**
|
||||||
- `remotePort = 13001`:Caddy 通过此端口访问 Gitea Web UI
|
- `remotePort = 13001`:Caddy 在 VPS1 上反代此端口
|
||||||
- `remotePort = 12222`:Git 客户端通过此端口连接 SSH
|
- `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
|
```toml
|
||||||
|
# ===== 监听配置 =====
|
||||||
bindAddr = "0.0.0.0"
|
bindAddr = "0.0.0.0"
|
||||||
bindPort = 7000
|
bindPort = 7000
|
||||||
|
|
||||||
|
# ===== 认证(必须与所有 frpc 一致)=====
|
||||||
auth.method = "token"
|
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
|
```bash
|
||||||
# UFW(Ubuntu/Debian)
|
systemctl daemon-reload
|
||||||
ufw allow 7000/tcp # frp 通信
|
systemctl enable frps
|
||||||
ufw allow 13001/tcp # Gitea Web(给 Caddy)
|
systemctl start frps
|
||||||
ufw allow 12222/tcp # Gitea SSH
|
systemctl status frps
|
||||||
|
|
||||||
# iptables
|
# 查看日志
|
||||||
iptables -A INPUT -p tcp --dport 7000 -j ACCEPT
|
journalctl -u frps -f
|
||||||
iptables -A INPUT -p tcp --dport 13001 -j ACCEPT
|
tail -f /var/log/frps.log
|
||||||
iptables -A INPUT -p tcp --dport 12222 -j ACCEPT
|
|
||||||
```
|
```
|
||||||
|
|
||||||
**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 配置
|
### Caddyfile 配置
|
||||||
|
|
||||||
|
编辑 `/etc/caddy/Caddyfile`:
|
||||||
|
|
||||||
```caddy
|
```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**
|
- **反代目标是 `127.0.0.1:13001`**:frps 把 NAS 上 Gitea 的 :3000 转发到 VPS1 的 :13001
|
||||||
- Caddy 只负责 HTTP/HTTPS,不处理 SSH
|
- **不要将 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`
|
**NAS 端(Gitea + frpc):**
|
||||||
- [ ] SSH 服务启用 `docker exec gitea cat /data/gitea/conf/app.ini | grep SSH`
|
- [ ] Docker 容器运行:`docker ps | grep gitea`
|
||||||
- [ ] 本地 SSH 连接 `ssh -T git@192.168.3.17 -p 2222`
|
- [ ] SSH 服务启用:`docker exec gitea cat /data/gitea/conf/app.ini | grep SSH`
|
||||||
- [ ] frp 连接正常 `journalctl -u frpc -f`
|
- [ ] 本地 SSH 测试:`ssh -T git@<NAS-IP> -p 2222`
|
||||||
- [ ] SSH 端口放行(防火墙)`netstat -tlnp | grep 12222`
|
- [ ] frpc 服务运行:`systemctl status frpc`
|
||||||
- [ ] Web UI 访问 浏览器打开 `https://gitea.yourdomain.com`
|
- [ ] frpc 日志正常:`journalctl -u frpc -f` 显示 `[gitea-web] start proxy success` 和 `[gitea-ssh] start proxy success`
|
||||||
- [ ] 公钥已添加 Gitea Web UI 验证
|
|
||||||
- [ ] Git Clone 测试 `git clone ssh://git@gitea.yourdomain.com:12222/username/repo.git`
|
**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 <user>!`
|
||||||
|
- [ ] Git Clone:`git clone ssh://git@gitea.ishenwei.online:12222/<user>/<repo>.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 │
|
||||||
|
└─────────────────────────────────────────────────────────────┘
|
||||||
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user