很多站长手里都有一台闲置的 VPS,同时家里还有 NAS、路由器后台、开发测试环境这些只在内网能访问的服务。想在外面随时打开,最省钱、最通用的做法就是内网穿透。FRP 是目前用得最多的一款开源工具,本文从服务端到客户端完整走一遍,并补上 HTTPS 访问与安全加固,照着做基本能一次跑通。
一、FRP 到底能解决什么问题
FRP(Fast Reverse Proxy)是一个用 Go 编写的反向代理工具,分为服务端 frps 和客户端 frpc。frpc 部署在内网机器上,主动连接公网 VPS 上的 frps,建立一条长连接;外部用户访问 VPS 的指定端口时,流量会通过这条隧道转发回内网。因为是由内向外主动建连,所以内网没有公网 IP、运营商封了 80/443 也能正常使用。
常见的使用场景:
1. 在外访问家里的 NAS 管理后台、群晖 DSM、照片库;
2. 远程桌面家里的 Windows 主机或 Mac;
3. 把本地开发中的网站临时给客户预览;
4. 内网服务需要对外提供 Web 访问,但宽带没有公网 IP。
需要提前说明的是,FRP 只解决“能访问”的问题,不负责“加速”。实际速度取决于 VPS 带宽和内网出口带宽,传大文件之前先确认带宽够用。
二、准备工作
一台有公网 IP 的 VPS(1 核 1G 就够用,本文以 Debian 12 为例);一个域名(可选,用于 HTTPS 访问);一台内网机器(NAS、软路由或 Linux/Windows 主机)。
端口规划建议:7000 用于 frps 与 frpc 通信,7500 用于 frps 管理面板(只对本机开放),8080 用于测试 Web 服务,远程桌面使用 3389。规划好之后再动手,能少踩很多端口冲突的坑。
三、服务端部署 frps
到 GitHub Releases 下载对应架构的压缩包,解压后只需要 frps 和 frps.toml 两个文件。先写服务端配置:
bindPort = 7000
auth.method = "token"
auth.token = "换成你自己的长随机字符串"
webServer.addr = "127.0.0.1"
webServer.port = 7500
webServer.user = "admin"
webServer.password = "再换一个强密码"
保存为 /etc/frp/frps.toml。管理面板只监听 127.0.0.1,需要查看时通过 SSH 隧道访问,不要直接暴露在公网。
接着用 systemd 托管,创建 /etc/systemd/system/frps.service:
[Unit]
Description=frp server
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/frps -c /etc/frp/frps.toml
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
执行 systemctl daemon-reload && systemctl enable --now frps,然后确认服务状态。最后放行 7000 端口:ufw allow 7000/tcp,或在云厂商控制台的安全组里放行,两者缺一不可。
四、客户端部署 frpc
在内网机器上下载同版本的 frpc,配置 frpc.toml:
serverAddr = "你的 VPS 公网 IP"
serverPort = 7000
auth.method = "token"
auth.token = "与服务端保持一致"
[[proxies]]
name = "nas-web"
type = "tcp"
localIP = "127.0.0.1"
localPort = 5000
remotePort = 8080
启动后访问 http://VPS_IP:8080 就能打开 NAS 后台。Windows 下可以把 frpc.exe 注册成服务,或用 nssm 托管;群晖、威联通这类 NAS 可以直接在 Docker 里运行 frpc,把配置文件挂载进去即可,升级也更方便。
五、用域名加 HTTPS 访问
直接暴露 HTTP 端口既不安全也不好记。更推荐的做法是:内网 Web 服务只监听本机,由 VPS 上的 Nginx 按域名反代,再配 Let's Encrypt 证书。
server {
listen 443 ssl http2;
server_name nas.example.com;
ssl_certificate /etc/letsencrypt/live/nas.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/nas.example.com/privkey.pem;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
FRP 的 vhost 模式也能按域名分流,但证书续期、多站点和缓存策略交给 Nginx 管理更灵活,后面要加新服务也只是多一个 server 块。
六、安全加固(重点)
内网穿透相当于在公网上开了一扇门,配置不当很容易被扫描和爆破。至少做到以下几点:
1. 必须开启 token 认证,不要用默认的空配置;
2. 管理面板只监听 127.0.0.1,通过 SSH 隧道查看;
3. 只映射真正需要的端口,不要图省事映射整个网段;
4. 远程桌面、数据库这类服务加 IP 白名单,或改到高位端口并配合强密码;
5. 定期升级 frp 版本,关注安全公告;
6. 给 VPS 配好防火墙,只放行必要端口,安全组与系统防火墙同时配置。
七、常见问题排查
frpc 连不上:先确认服务端 7000 端口已放行,再核对两边 token 是否一致,最后排查 VPS 是否被运营商限制。
能连上但打不开网页:检查 localIP 是否写成了 127.0.0.1,而服务实际只监听了内网网卡地址。
访问速度很慢:多数情况是 VPS 带宽跑满,可以在 frpc 中开启 tcpMux 并适当调整连接池参数。
端口冲突:remotePort 不要与 VPS 上已有服务重复,映射前先用 ss -lntp 看一下端口占用。
八、总结
FRP 的部署本身并不复杂,真正的难点在端口规划和后续的安全维护。建议先用一个测试端口把链路跑通,确认没有问题后再逐个上线正式服务;同时把配置文件和 token 做好备份,换机器时能快速恢复。
如果还在挑选用来做穿透的 VPS,优先看线路稳定、带宽充足、支持自助更换 IP 的商家,比单纯拼价格更划算。