FRP 内网穿透实战:用一台 VPS 把 NAS 与内网服务安全映射到公网


很多站长手里都有一台闲置的 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 的商家,比单纯拼价格更划算。


手机扫码阅读

微信或手机浏览器扫一扫,随时随地随心阅读与分享

VPS 性能监控实战:从 CPU 排查到可视化面板一次讲清

网站备份实战:crontab 定时自动备份网站与数据库,异地存储与一键恢复一次讲清

评 论