frp
用阿里云和 frp 把家里的高性能主机开放到公网
这篇笔记记录一下我怎么用一台阿里云服务器和 frp,把家里的高性能主机开放到公网。 我的想法很简单: 云服务器有公网 IP,但是配置不高。 家里花四千块钱配一台主机,性能更强,硬盘也更容易扩展。 家里的宽带通常没有稳定公网 IP,或者路由器外面还有运营商 NAT。 用 frp 把两台机器连接起来,公网请求先到阿里云,再

这篇笔记记录一下我怎么用一台阿里云服务器和 frp,把家里的高性能主机开放到公网。
我的想法很简单:
- 云服务器有公网 IP,但是配置不高。
- 家里花四千块钱配一台主机,性能更强,硬盘也更容易扩展。
- 家里的宽带通常没有稳定公网 IP,或者路由器外面还有运营商 NAT。
- 用 frp 把两台机器连接起来,公网请求先到阿里云,再转发到家里的主机。
这样就可以在家里的主机上部署一些对性能要求高一点的应用,比如 Dify、模型服务、测试环境,以及自己写的小工具。
整体结构
正在渲染流程图...
需要安装两个程序:
| 程序 | 安装位置 | 作用 |
|---|---|---|
frps | 阿里云服务器 | frp 服务端,接收公网请求和家里主机的连接 |
frpc | 家里的主机 | frp 客户端,主动连接阿里云,并把流量转给本地应用 |
frp 为什么能解决这个问题
家里的主机不一定能直接被公网访问。
但是家里的主机通常可以主动访问互联网,也就可以主动连接阿里云服务器。
frpc 启动以后,会主动连接公网服务器上的 frps,并维持一条通信通道。外部用户访问阿里云服务器的指定端口时,frps 会把流量通过这条通道转发给家里的 frpc。frpc 再把流量交给本地应用。
可以理解成:
公网用户
-> 阿里云公网 IP
-> frps
-> 已经建立好的 frp 隧道
-> 家里主机上的 frpc
-> 本地应用关键点在于:连接是从家里主动发起的。
所以即使家里的主机没有公网 IP,frp 仍然可以让外部请求绕到家里的服务。
这算不算高性能服务器
这种方案可以让应用使用家里主机的 CPU、内存、硬盘和显卡。
但是访问速度仍然会受到网络限制:
- 阿里云服务器的公网带宽。
- 家庭宽带的上行速度。
- 两边网络的延迟和稳定性。
- frp 转发带来的少量额外开销。
如果应用主要是管理后台、个人工具、Dify 工作流或者低并发服务,这种方式通常很好用。
如果需要大量用户同时下载文件、播放视频,或者对网络延迟要求很高,就要认真评估带宽。
准备工作
需要准备:
- 一台带公网 IP 的阿里云 Linux 服务器。
- 一台放在家里的 Linux 主机。
- 在家里主机上已经运行的应用。
- 一个随机生成的 frp 鉴权 Token。
假设:
阿里云公网 IP:203.0.113.10
frp 通信端口:7000
公网访问端口:18080
家里应用端口:8080下面的 IP 只是示例,实际配置时换成自己的地址。
先在家里主机上确认应用能正常访问:
curl http://127.0.0.1:8080下载 frp
到 frp 的 GitHub Releases 页面下载适合系统架构的版本:
https://github.com/fatedier/frp/releases例如 Linux x86_64 主机通常选择:
frp_版本号_linux_amd64.tar.gzARM 主机则要选择对应的 arm64 版本。
阿里云服务器和家里主机尽量使用相同版本。
解压后会看到:
frps
frpc可以分别把程序安装到:
/usr/local/bin/frps
/usr/local/bin/frpc配置文件放到:
/etc/frp/frps.toml
/etc/frp/frpc.toml当前 frp 推荐使用 TOML、YAML 或 JSON 配置。旧的 INI 格式已经废弃,新配置直接使用 TOML。
配置阿里云上的 frps
在阿里云服务器创建:
/etc/frp/frps.toml内容:
bindPort = 7000
auth.method = "token"
auth.token = "换成自己随机生成的长字符串"7000 是家里主机连接 frp 服务端的端口。
Token 不要使用简单密码,也不要提交到公开仓库。可以生成一个随机值:
openssl rand -hex 32配置家里主机上的 frpc
在家里主机创建:
/etc/frp/frpc.toml内容:
serverAddr = "203.0.113.10"
serverPort = 7000
auth.method = "token"
auth.token = "和服务端相同的 Token"
[[proxies]]
name = "dify-web"
type = "tcp"
localIP = "127.0.0.1"
localPort = 8080
remotePort = 18080这段配置的意思是:
访问阿里云公网 IP:18080
-> 转发到家里主机 127.0.0.1:8080启动成功后,可以在外部电脑访问:
http://203.0.113.10:18080阿里云安全组和防火墙
阿里云服务器需要开放:
| 端口 | 用途 | 建议 |
|---|---|---|
7000 | 家里主机连接 frps | 可以限制来源 IP 时尽量限制 |
18080 | 外部访问应用 | 按实际需求开放 |
除了阿里云控制台里的安全组,还要检查服务器本身的防火墙。
例如使用 UFW:
sudo ufw allow 7000/tcp
sudo ufw allow 18080/tcp如果只想自己访问某个管理页面,最好不要直接向所有 IP 开放。可以限制来源地址,或者使用 VPN、SSH 隧道、frp 的安全访问模式。
先手动测试
在阿里云服务器上运行:
/usr/local/bin/frps -c /etc/frp/frps.toml在家里主机上运行:
/usr/local/bin/frpc -c /etc/frp/frpc.toml然后从另一台电脑访问:
http://203.0.113.10:18080确认能正常打开以后,再配置后台运行。
用 systemd 持久化后台运行
手动运行有一个明显问题:SSH 断开后,程序也可能退出。服务器重启以后,也不会自动恢复。
Linux 上可以用 systemd 管理 frps 和 frpc。
阿里云服务器:frps.service
创建:
/etc/systemd/system/frps.service内容:
[Unit]
Description=frp server
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
ExecStart=/usr/local/bin/frps -c /etc/frp/frps.toml
Restart=on-failure
RestartSec=5s
[Install]
WantedBy=multi-user.target加载配置并启动:
sudo systemctl daemon-reload
sudo systemctl enable --now frps查看状态:
sudo systemctl status frps查看日志:
sudo journalctl -u frps -f家里主机:frpc.service
创建:
/etc/systemd/system/frpc.service内容:
[Unit]
Description=frp client
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
ExecStart=/usr/local/bin/frpc -c /etc/frp/frpc.toml
Restart=always
RestartSec=5s
[Install]
WantedBy=multi-user.target加载配置并启动:
sudo systemctl daemon-reload
sudo systemctl enable --now frpc查看状态:
sudo systemctl status frpc查看日志:
sudo journalctl -u frpc -f这样即使网络临时中断,或者家里停电后重新开机,frpc 也会自动重新连接阿里云服务器。
再映射一个 SSH 端口
如果希望从外部远程管理家里的主机,可以增加一个 SSH 映射。
在家里的:
/etc/frp/frpc.toml继续添加:
[[proxies]]
name = "home-ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 16022重启客户端:
sudo systemctl restart frpc外部电脑就可以通过阿里云连接家里的主机:
ssh -p 16022 你的用户名@203.0.113.10SSH 不要使用简单密码。建议:
- 使用 SSH 密钥。
- 禁止
root直接远程登录。 - 关闭密码登录。
- 在阿里云安全组中限制来源 IP。
给 Web 服务加域名和 HTTPS
直接使用:
http://203.0.113.10:18080已经可以访问。
如果长期使用,可以在阿里云服务器上再加一层 Nginx 或 Caddy:
域名 HTTPS 请求
-> 阿里云 Nginx 或 Caddy
-> 127.0.0.1:18080
-> frps
-> 家里主机这样可以使用:
https://dify.example.com而不是记忆 IP 和端口。
如果使用中国大陆服务器和域名,还要留意备案要求。
可以部署哪些东西
家里的高性能主机可以部署:
- Dify。
- 自己写的前后端项目。
- 测试环境。
- 数据库管理工具。
- 模型服务。
- 下载和文件处理服务。
- 只供自己使用的小工具。
不过不要为了方便,把数据库、Docker daemon、管理后台全部直接映射到公网。
更稳妥的做法是:
- 只开放真正需要的端口。
- 管理服务限制来源 IP。
- 优先通过 SSH 或 VPN 进入内网。
- 应用自己也要配置登录认证。
- 定期更新 frp 和系统安全补丁。
- Token 泄漏后立即更换。
常见排查顺序
如果外部访问失败,可以按顺序检查:
- 家里的应用能不能通过
127.0.0.1:8080正常访问。 - 阿里云的
frps是否正在运行。 - 家里主机的
frpc是否已经连接成功。 - 两边 Token 是否一致。
- 阿里云安全组是否开放
7000和映射端口。 - 阿里云服务器防火墙是否允许访问。
- 配置里的
remotePort是否被其他程序占用。 - 家里网络是否临时断开。
常用命令:
sudo systemctl status frps
sudo systemctl status frpc
sudo journalctl -u frps -f
sudo journalctl -u frpc -f我最后的感觉
这个方案的成本比较容易控制。
阿里云服务器主要负责提供公网入口,不一定要买很高配置。真正需要 CPU、内存、硬盘和显卡的应用,可以跑在家里的主机上。
frp 做的事情可以简单理解为:
让家里的主机主动连接公网服务器
-> 建立一条长期存在的隧道
-> 公网请求到达云服务器
-> 再通过隧道转发回家里它没有让家里的宽带凭空拥有公网 IP,而是借用了阿里云服务器的公网入口。
这种方式很适合个人开发、学习和低并发服务。先用较低成本把东西跑起来,后面真的有大量用户,再根据访问量考虑更正式的云上部署。