frp

用阿里云和 frp 把家里的高性能主机开放到公网

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

2026年6月13日10 分钟阅读
用阿里云和 frp 把家里的高性能主机开放到公网

这篇笔记记录一下我怎么用一台阿里云服务器和 frp,把家里的高性能主机开放到公网。

我的想法很简单:

  • 云服务器有公网 IP,但是配置不高。
  • 家里花四千块钱配一台主机,性能更强,硬盘也更容易扩展。
  • 家里的宽带通常没有稳定公网 IP,或者路由器外面还有运营商 NAT。
  • 用 frp 把两台机器连接起来,公网请求先到阿里云,再转发到家里的主机。

这样就可以在家里的主机上部署一些对性能要求高一点的应用,比如 Dify、模型服务、测试环境,以及自己写的小工具。

整体结构

正在渲染流程图...

需要安装两个程序:

程序安装位置作用
frps阿里云服务器frp 服务端,接收公网请求和家里主机的连接
frpc家里的主机frp 客户端,主动连接阿里云,并把流量转给本地应用

frp 为什么能解决这个问题

家里的主机不一定能直接被公网访问。

但是家里的主机通常可以主动访问互联网,也就可以主动连接阿里云服务器。

frpc 启动以后,会主动连接公网服务器上的 frps,并维持一条通信通道。外部用户访问阿里云服务器的指定端口时,frps 会把流量通过这条通道转发给家里的 frpcfrpc 再把流量交给本地应用。

可以理解成:

text
公网用户
  -> 阿里云公网 IP
  -> frps
  -> 已经建立好的 frp 隧道
  -> 家里主机上的 frpc
  -> 本地应用

关键点在于:连接是从家里主动发起的。

所以即使家里的主机没有公网 IP,frp 仍然可以让外部请求绕到家里的服务。

这算不算高性能服务器

这种方案可以让应用使用家里主机的 CPU、内存、硬盘和显卡。

但是访问速度仍然会受到网络限制:

  • 阿里云服务器的公网带宽。
  • 家庭宽带的上行速度。
  • 两边网络的延迟和稳定性。
  • frp 转发带来的少量额外开销。

如果应用主要是管理后台、个人工具、Dify 工作流或者低并发服务,这种方式通常很好用。

如果需要大量用户同时下载文件、播放视频,或者对网络延迟要求很高,就要认真评估带宽。

准备工作

需要准备:

  1. 一台带公网 IP 的阿里云 Linux 服务器。
  2. 一台放在家里的 Linux 主机。
  3. 在家里主机上已经运行的应用。
  4. 一个随机生成的 frp 鉴权 Token。

假设:

text
阿里云公网 IP:203.0.113.10
frp 通信端口:7000
公网访问端口:18080
家里应用端口:8080

下面的 IP 只是示例,实际配置时换成自己的地址。

先在家里主机上确认应用能正常访问:

bash
curl http://127.0.0.1:8080

下载 frp

到 frp 的 GitHub Releases 页面下载适合系统架构的版本:

text
https://github.com/fatedier/frp/releases

例如 Linux x86_64 主机通常选择:

text
frp_版本号_linux_amd64.tar.gz

ARM 主机则要选择对应的 arm64 版本。

阿里云服务器和家里主机尽量使用相同版本。

解压后会看到:

text
frps
frpc

可以分别把程序安装到:

text
/usr/local/bin/frps
/usr/local/bin/frpc

配置文件放到:

text
/etc/frp/frps.toml
/etc/frp/frpc.toml

当前 frp 推荐使用 TOML、YAML 或 JSON 配置。旧的 INI 格式已经废弃,新配置直接使用 TOML。

配置阿里云上的 frps

在阿里云服务器创建:

text
/etc/frp/frps.toml

内容:

toml
bindPort = 7000

auth.method = "token"
auth.token = "换成自己随机生成的长字符串"

7000 是家里主机连接 frp 服务端的端口。

Token 不要使用简单密码,也不要提交到公开仓库。可以生成一个随机值:

bash
openssl rand -hex 32

配置家里主机上的 frpc

在家里主机创建:

text
/etc/frp/frpc.toml

内容:

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

这段配置的意思是:

text
访问阿里云公网 IP:18080
  -> 转发到家里主机 127.0.0.1:8080

启动成功后,可以在外部电脑访问:

text
http://203.0.113.10:18080

阿里云安全组和防火墙

阿里云服务器需要开放:

端口用途建议
7000家里主机连接 frps可以限制来源 IP 时尽量限制
18080外部访问应用按实际需求开放

除了阿里云控制台里的安全组,还要检查服务器本身的防火墙。

例如使用 UFW:

bash
sudo ufw allow 7000/tcp
sudo ufw allow 18080/tcp

如果只想自己访问某个管理页面,最好不要直接向所有 IP 开放。可以限制来源地址,或者使用 VPN、SSH 隧道、frp 的安全访问模式。

先手动测试

在阿里云服务器上运行:

bash
/usr/local/bin/frps -c /etc/frp/frps.toml

在家里主机上运行:

bash
/usr/local/bin/frpc -c /etc/frp/frpc.toml

然后从另一台电脑访问:

text
http://203.0.113.10:18080

确认能正常打开以后,再配置后台运行。

用 systemd 持久化后台运行

手动运行有一个明显问题:SSH 断开后,程序也可能退出。服务器重启以后,也不会自动恢复。

Linux 上可以用 systemd 管理 frpsfrpc

阿里云服务器:frps.service

创建:

text
/etc/systemd/system/frps.service

内容:

ini
[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

加载配置并启动:

bash
sudo systemctl daemon-reload
sudo systemctl enable --now frps

查看状态:

bash
sudo systemctl status frps

查看日志:

bash
sudo journalctl -u frps -f

家里主机:frpc.service

创建:

text
/etc/systemd/system/frpc.service

内容:

ini
[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

加载配置并启动:

bash
sudo systemctl daemon-reload
sudo systemctl enable --now frpc

查看状态:

bash
sudo systemctl status frpc

查看日志:

bash
sudo journalctl -u frpc -f

这样即使网络临时中断,或者家里停电后重新开机,frpc 也会自动重新连接阿里云服务器。

再映射一个 SSH 端口

如果希望从外部远程管理家里的主机,可以增加一个 SSH 映射。

在家里的:

text
/etc/frp/frpc.toml

继续添加:

toml
[[proxies]]
name = "home-ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 16022

重启客户端:

bash
sudo systemctl restart frpc

外部电脑就可以通过阿里云连接家里的主机:

bash
ssh -p 16022 你的用户名@203.0.113.10

SSH 不要使用简单密码。建议:

  • 使用 SSH 密钥。
  • 禁止 root 直接远程登录。
  • 关闭密码登录。
  • 在阿里云安全组中限制来源 IP。

给 Web 服务加域名和 HTTPS

直接使用:

text
http://203.0.113.10:18080

已经可以访问。

如果长期使用,可以在阿里云服务器上再加一层 Nginx 或 Caddy:

text
域名 HTTPS 请求
  -> 阿里云 Nginx 或 Caddy
  -> 127.0.0.1:18080
  -> frps
  -> 家里主机

这样可以使用:

text
https://dify.example.com

而不是记忆 IP 和端口。

如果使用中国大陆服务器和域名,还要留意备案要求。

可以部署哪些东西

家里的高性能主机可以部署:

  • Dify。
  • 自己写的前后端项目。
  • 测试环境。
  • 数据库管理工具。
  • 模型服务。
  • 下载和文件处理服务。
  • 只供自己使用的小工具。

不过不要为了方便,把数据库、Docker daemon、管理后台全部直接映射到公网。

更稳妥的做法是:

  • 只开放真正需要的端口。
  • 管理服务限制来源 IP。
  • 优先通过 SSH 或 VPN 进入内网。
  • 应用自己也要配置登录认证。
  • 定期更新 frp 和系统安全补丁。
  • Token 泄漏后立即更换。

常见排查顺序

如果外部访问失败,可以按顺序检查:

  1. 家里的应用能不能通过 127.0.0.1:8080 正常访问。
  2. 阿里云的 frps 是否正在运行。
  3. 家里主机的 frpc 是否已经连接成功。
  4. 两边 Token 是否一致。
  5. 阿里云安全组是否开放 7000 和映射端口。
  6. 阿里云服务器防火墙是否允许访问。
  7. 配置里的 remotePort 是否被其他程序占用。
  8. 家里网络是否临时断开。

常用命令:

bash
sudo systemctl status frps
sudo systemctl status frpc
sudo journalctl -u frps -f
sudo journalctl -u frpc -f

我最后的感觉

这个方案的成本比较容易控制。

阿里云服务器主要负责提供公网入口,不一定要买很高配置。真正需要 CPU、内存、硬盘和显卡的应用,可以跑在家里的主机上。

frp 做的事情可以简单理解为:

text
让家里的主机主动连接公网服务器
  -> 建立一条长期存在的隧道
  -> 公网请求到达云服务器
  -> 再通过隧道转发回家里

它没有让家里的宽带凭空拥有公网 IP,而是借用了阿里云服务器的公网入口。

这种方式很适合个人开发、学习和低并发服务。先用较低成本把东西跑起来,后面真的有大量用户,再根据访问量考虑更正式的云上部署。