1348 字
7 分钟
FRP 内网穿透:用 VPS 远程访问家里的 NAS
折腾 Homelab 的最后一块拼图:在外面也能访问家里的 NAS
为什么需要内网穿透?
家里的 fnOS 跑着各种服务,但运营商给的是内网 IP,从外面访问不了。解决方案有几种:
| 方案 | 优点 | 缺点 |
|---|---|---|
| DDNS + 端口映射 | 简单 | 需要公网IP,运营商可能不给 |
| Tailscale/ZeroTier | 零配置 | 依赖第三方,国内速度一般 |
| frp | 自主可控,速度取决于VPS | 需要有VPS |
| WireGuard | 性能最好 | 配置稍复杂 |
正好手上有阿里云 VPS,frp 是最顺手的选择。
架构设计
graph LR
A["🌐 外网设备<br/>(手机/电脑)"] -->|访问| B["☁️ 阿里云 VPS<br/>frps 服务端"]
B -->|穿透| C["🏠 家庭内网<br/>frpc 客户端"]
C --> D["📦 fnOS/Docker 服务"]
穿透目标:
- fnOS 管理界面 (5666)
- SSH (22)
- 其他 Docker 服务
VPS 端:部署 frps
1. 下载 frp
# 在 VPS 上执行cd /optwget https://github.com/fatedier/frp/releases/download/v0.61.1/frp_0.61.1_linux_amd64.tar.gztar -xzf frp_0.61.1_linux_amd64.tar.gzmv frp_0.61.1_linux_amd64 frp2. 配置 frps.toml
bindPort = 7000auth.token = "你的安全密钥"
# Web 管理面板(可选)webServer.addr = "0.0.0.0"webServer.port = 7500webServer.user = "admin"webServer.password = "你的面板密码"3. 创建 systemd 服务
[Unit]Description=frp serverAfter=network.target
[Service]Type=simpleExecStart=/opt/frp/frps -c /opt/frp/frps.tomlRestart=on-failureRestartSec=5s
[Install]WantedBy=multi-user.targetsystemctl daemon-reloadsystemctl enable frpssystemctl start frps4. 开放防火墙端口
# 阿里云安全组需要放行以下端口# 7000 - frp 通信端口# 7500 - frp 管理面板(可选)# 6000-6100 - 穿透服务端口段内网端:部署 frpc
方案一:Docker 部署(推荐)
在 fnOS 上用 Docker 运行 frpc:
version: '3'services: frpc: image: snowdreamtech/frpc container_name: frpc restart: always network_mode: host volumes: - ./frpc.toml:/etc/frp/frpc.tomlserverAddr = "47.108.xxx.xxx"serverPort = 7000auth.token = "你的安全密钥"
[[proxies]]name = "fnos-web"type = "tcp"localIP = "127.0.0.1"localPort = 5666remotePort = 6001
[[proxies]]name = "fnos-ssh"type = "tcp"localIP = "127.0.0.1"localPort = 22remotePort = 6022方案二:IStoreOS 插件
如果想在路由器层面做穿透,IStoreOS 有 frpc 插件可以直接装。
验证与使用
# 外网访问 fnOS 管理界面http://47.108.xxx.xxx:6001
# 外网 SSH 连接ssh -p 6022 user@47.108.xxx.xxx安全加固
内网穿透等于把内网服务暴露到公网,安全措施必须到位:
- 强密码 + 改默认端口
- frp 启用 token 认证
- 考虑加一层 Nginx 反向代理 + HTTPS
- 敏感服务可以用 STCP(需要访问端也装 frpc)
避坑清单
| 问题 | 原因 | 解决 |
|---|---|---|
| 连接超时 | VPS 安全组没开端口 | 检查阿里云安全组规则 |
| frpc 启动失败 | token 不匹配 | 检查两端配置一致性 |
| 穿透后访问慢 | VPS 带宽瓶颈 | 换更高带宽的 VPS |
| 服务时断时续 | frpc 没设置重连 | 用 systemd/Docker 托管 |
实战:NAT VPS 的特殊配置
上面是标准的独立 IP VPS 配置。但如果你用的是 NAT VPS(共享公网 IP,通过端口映射访问),配置会有些不同。
NAT VPS vs 独立 IP VPS
| 对比项 | 独立 IP VPS | NAT VPS |
|---|---|---|
| 公网 IP | 独享一个 | 多用户共享 |
| 端口使用 | 任意端口 | 只能用分配的端口 |
| 价格 | 较贵 | 便宜(常见 10-30 元/月) |
| 访问方式 | IP:端口 | 域名:映射端口 |
NAT VPS 通常会给你一个域名和几个端口映射,比如:
内部端口 33895 → 外部 xxxxxx.xxxxx.xxx:43155内部端口 3000 → 外部 xxxxxx.xxxxx.xxx:58619我的实际架构
graph LR
A["🌐 外网设备"] -->|":43155"| B["☁️ NAT VPS<br/>frps 监听 :33895"]
B <-->|隧道| C["🖥️ PVE LXC<br/>CFtunnel"]
C -->|"10.0.0.191:3000"| D["🔧 NewAPI"]
style B fill:#333,stroke:#666,stroke-width:2px,color:#fff
style C fill:#333,stroke:#666,stroke-width:2px,color:#fff
VPS 端配置(NAT 版)
# 注意:bindPort 要用 NAT 分配的内部端口bindPort = 33895auth.token = "你的安全密钥"关键点:bindPort 填的是 NAT 内部端口,不是外部端口。
内网端配置(PVE LXC 容器)
我选择在 PVE 的 LXC 容器里跑 frpc,而不是 Docker,更轻量。
1. 下载 frp
# 国内服务器建议用镜像加速cd /optwget https://mirror.ghproxy.com/https://github.com/fatedier/frp/releases/download/v0.61.1/frp_0.61.1_linux_amd64.tar.gztar -xzf frp_0.61.1_linux_amd64.tar.gzmv frp_0.61.1_linux_amd64 frp
# 重要:给执行权限!chmod +x /opt/frp/frpc2. 配置 frpc.toml
# serverPort 要填 NAT 的外部端口!serverAddr = "xxxxxx.xxxxx.xxx"serverPort = 43155auth.token = "你的安全密钥"
[[proxies]]name = "newapi"type = "tcp"localIP = "10.0.0.191" # 内网服务的实际 IPlocalPort = 3000remotePort = 3000 # VPS 上暴露的端口NAT VPS 的坑:
serverAddr填域名,不是 IPserverPort填外部映射端口(43155),不是 frps 的 bindPort(33895)remotePort也要在 NAT 端口映射范围内,否则外网访问不到
3. 创建 systemd 服务
[Unit]Description=frp clientAfter=network.target
[Service]Type=simpleExecStart=/opt/frp/frpc -c /opt/frp/frpc.tomlRestart=on-failureRestartSec=5s
[Install]WantedBy=multi-user.targetsystemctl daemon-reloadsystemctl enable frpcsystemctl start frpc验证连接
# 检查 frpc 状态systemctl status frpc
# 外网访问穿透的服务# 如果 remotePort=3000 映射到外部 58619curl http://xxxxxx.xxxxx.xxx:58619NAT VPS 避坑补充
| 问题 | 原因 | 解决 |
|---|---|---|
frpc 启动报 permission denied | 二进制文件没有执行权限 | chmod +x /opt/frp/frpc |
| 连接成功但外网访问不了 | remotePort 不在 NAT 映射范围 | 检查 NAT 端口分配 |
| GitHub 下载卡住 | 国内网络问题 | 用 ghproxy 镜像 |
| serverPort 填错 | NAT 有内外端口之分 | frpc 填外部端口,frps 填内部端口 |
关于 HTTPS
通过 frp 穿透后,访问链接是 http://域名:端口,浏览器会提示”不安全”。
几种解决思路:
- Cloudflare 代理 - 免费 HTTPS,但会增加延迟
- Nginx + Let’s Encrypt - 在 VPS 上套一层反代
- frp 的 HTTPS 插件 - frp 原生支持,但配置稍复杂
- 不管它 - 自己用的服务,HTTP 也无所谓
frp 用了这么多年还是香,配置简单,稳定可靠。NAT VPS 虽然便宜,但端口映射确实要多绕一步。搞清楚内外端口的关系,剩下的就顺理成章了。
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!
FRP 内网穿透:用 VPS 远程访问家里的 NAS
https://jielumoon.top/posts/frp-nas-remote-access/