VPS、Mac mini、Frp 搭建内网穿透家用服务器
通过阿里云 VPS 提供的公网 IP,使用 FRP 实现内网穿透到家里的 Mac mini。
杭州
为什么这么设计
核心问题:
- 家里的 Mac mini 性能强劲,但没有公网 IP,无法直接从外网访问
- 阿里云 VPS 有公网 IP,但配置较低(2 核 2G),性能不足以运行复杂服务
解决方案:
- VPS 负责流量转发:利用公网 IP 作为流量入口,通过 Nginx + FRP 将请求转发到内网
- Mac mini 负责实际服务:利用强劲性能运行各种 Docker 服务,处理真正的业务逻辑
这样既解决了公网访问问题,又充分利用了现有硬件资源,避免购买高配 VPS 的额外成本。
概览
流量流向
当用户访问你的服务时,请求的完整路径如下:
用户浏览器 → VPS 公网 IP (443/80)
↓
Nginx 接收并转发
↓
FRPS (8090) 接收 HTTP 流量
↓
通过 FRP 隧道 (7100) 传输
↓
Mac mini FRPC 接收
↓
转发到本地 Docker 容器 (4321/4322/4323...)
↓
容器处理请求并返回响应
整个过程中,VPS 只负责流量中转,真正的业务逻辑都在 Mac mini 的 Docker 容器中处理。
VPS
Nginx
- 流量转发:通过 443/80 端口接收外部流量,并转发至本地 8090 端口(FRPS 服务)
server {
listen 443 ssl http2; # 监听 443 端口(HTTPS)并启用 SSL 和 HTTP/2
...
# 代理配置 - 将请求转发到本地 8090 端口
location / {
proxy_pass http://localhost:8090;
...
}
}
FRPS
一个快速反向代理,帮助你将 NAT 或防火墙后的本地服务器暴露到互联网
- 流量桥接:接收 8090 端口的 HTTP 流量,通过 7100 端口与客户端建立隧道连接
bindPort = 7100 # FRPS(服务端)与 FRPC(客户端)建立隧道通信的主要端口
auth.token = "******" # 客户端和服务端之间的认证 Token
vhostHTTPPort = 8090 # FRPS 用于对外暴露 HTTP 服务的端口
# 管理面板(Dashboard)
webServer.port = 7500 # 管理面板端口
webServer.user = "admin"
webServer.password = "******"
webServer.addr = "0.0.0.0" # 允许所有 IP 访问(公网可访问)
Mac Mini
FRPC 客户端
Mac mini 通过 FRPC 客户端与 VPS 建立隧道,并通过 [[proxies]] 配置实现多域名分流
- 隧道连接:与 VPS 上的 FRPS 服务建立稳定连接
- 多域名代理:通过
[[proxies]]配置实现不同域名到本地端口的映射
[[proxies]]
name = "blog"
type = "http"
localPort = 4321 # 个人博客服务
customDomains = ["blog.example.com"]
[[proxies]]
name = "api"
type = "http"
localPort = 4322 # API 服务
customDomains = ["api.example.com"]
[[proxies]]
name = "dashboard"
type = "http"
localPort = 4323 # 管理面板
customDomains = ["admin.example.com"]
这里的 localPort 对应的并不一定是 Mac mini 本机的实际端口,大多数情况下是运行在 Docker 容器中的应用服务。
例如:
4321 → API 服务容器(如 FastAPI、Node.js)
4322 → Nginx 容器,用于个人博客或静态站点
换句话说,FRPC 就像”公网入口”,而 Docker 是”本地应用商店”:你在 Mac mini 上随时可以用 Docker 启动一个新服务,分配一个本地端口,然后只需在 FRPC 配置中增加一个 [[proxies]],几秒钟就能让它通过独立域名对外提供访问。