1348 字
7 分钟

FRP 内网穿透:用 VPS 远程访问家里的 NAS

2026-01-22
浏览量 加载中...

折腾 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#

Terminal window
# 在 VPS 上执行
cd /opt
wget https://github.com/fatedier/frp/releases/download/v0.61.1/frp_0.61.1_linux_amd64.tar.gz
tar -xzf frp_0.61.1_linux_amd64.tar.gz
mv frp_0.61.1_linux_amd64 frp

2. 配置 frps.toml#

/opt/frp/frps.toml
bindPort = 7000
auth.token = "你的安全密钥"
# Web 管理面板(可选)
webServer.addr = "0.0.0.0"
webServer.port = 7500
webServer.user = "admin"
webServer.password = "你的面板密码"

3. 创建 systemd 服务#

/etc/systemd/system/frps.service
[Unit]
Description=frp server
After=network.target
[Service]
Type=simple
ExecStart=/opt/frp/frps -c /opt/frp/frps.toml
Restart=on-failure
RestartSec=5s
[Install]
WantedBy=multi-user.target
Terminal window
systemctl daemon-reload
systemctl enable frps
systemctl start frps

4. 开放防火墙端口#

Terminal window
# 阿里云安全组需要放行以下端口
# 7000 - frp 通信端口
# 7500 - frp 管理面板(可选)
# 6000-6100 - 穿透服务端口段

内网端:部署 frpc#

方案一:Docker 部署(推荐)#

在 fnOS 上用 Docker 运行 frpc:

docker-compose.yml
version: '3'
services:
frpc:
image: snowdreamtech/frpc
container_name: frpc
restart: always
network_mode: host
volumes:
- ./frpc.toml:/etc/frp/frpc.toml
frpc.toml
serverAddr = "47.108.xxx.xxx"
serverPort = 7000
auth.token = "你的安全密钥"
[[proxies]]
name = "fnos-web"
type = "tcp"
localIP = "127.0.0.1"
localPort = 5666
remotePort = 6001
[[proxies]]
name = "fnos-ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 6022

方案二:IStoreOS 插件#

如果想在路由器层面做穿透,IStoreOS 有 frpc 插件可以直接装。


验证与使用#

Terminal window
# 外网访问 fnOS 管理界面
http://47.108.xxx.xxx:6001
# 外网 SSH 连接
ssh -p 6022 user@47.108.xxx.xxx

安全加固#

内网穿透等于把内网服务暴露到公网,安全措施必须到位:

  1. 强密码 + 改默认端口
  2. frp 启用 token 认证
  3. 考虑加一层 Nginx 反向代理 + HTTPS
  4. 敏感服务可以用 STCP(需要访问端也装 frpc)

避坑清单#

问题原因解决
连接超时VPS 安全组没开端口检查阿里云安全组规则
frpc 启动失败token 不匹配检查两端配置一致性
穿透后访问慢VPS 带宽瓶颈换更高带宽的 VPS
服务时断时续frpc 没设置重连用 systemd/Docker 托管

实战:NAT VPS 的特殊配置#

上面是标准的独立 IP VPS 配置。但如果你用的是 NAT VPS(共享公网 IP,通过端口映射访问),配置会有些不同。

NAT VPS vs 独立 IP VPS#

对比项独立 IP VPSNAT 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 版)#

/opt/frp/frps.toml
# 注意:bindPort 要用 NAT 分配的内部端口
bindPort = 33895
auth.token = "你的安全密钥"

关键点bindPort 填的是 NAT 内部端口,不是外部端口。

内网端配置(PVE LXC 容器)#

我选择在 PVE 的 LXC 容器里跑 frpc,而不是 Docker,更轻量。

1. 下载 frp#

Terminal window
# 国内服务器建议用镜像加速
cd /opt
wget https://mirror.ghproxy.com/https://github.com/fatedier/frp/releases/download/v0.61.1/frp_0.61.1_linux_amd64.tar.gz
tar -xzf frp_0.61.1_linux_amd64.tar.gz
mv frp_0.61.1_linux_amd64 frp
# 重要:给执行权限!
chmod +x /opt/frp/frpc

2. 配置 frpc.toml#

/opt/frp/frpc.toml
# serverPort 要填 NAT 的外部端口!
serverAddr = "xxxxxx.xxxxx.xxx"
serverPort = 43155
auth.token = "你的安全密钥"
[[proxies]]
name = "newapi"
type = "tcp"
localIP = "10.0.0.191" # 内网服务的实际 IP
localPort = 3000
remotePort = 3000 # VPS 上暴露的端口

NAT VPS 的坑

  • serverAddr 填域名,不是 IP
  • serverPort外部映射端口(43155),不是 frps 的 bindPort(33895)
  • remotePort 也要在 NAT 端口映射范围内,否则外网访问不到

3. 创建 systemd 服务#

/etc/systemd/system/frpc.service
[Unit]
Description=frp client
After=network.target
[Service]
Type=simple
ExecStart=/opt/frp/frpc -c /opt/frp/frpc.toml
Restart=on-failure
RestartSec=5s
[Install]
WantedBy=multi-user.target
Terminal window
systemctl daemon-reload
systemctl enable frpc
systemctl start frpc

验证连接#

Terminal window
# 检查 frpc 状态
systemctl status frpc
# 外网访问穿透的服务
# 如果 remotePort=3000 映射到外部 58619
curl http://xxxxxx.xxxxx.xxx:58619

NAT VPS 避坑补充#

问题原因解决
frpc 启动报 permission denied二进制文件没有执行权限chmod +x /opt/frp/frpc
连接成功但外网访问不了remotePort 不在 NAT 映射范围检查 NAT 端口分配
GitHub 下载卡住国内网络问题用 ghproxy 镜像
serverPort 填错NAT 有内外端口之分frpc 填外部端口,frps 填内部端口

关于 HTTPS#

通过 frp 穿透后,访问链接是 http://域名:端口,浏览器会提示”不安全”。

几种解决思路:

  1. Cloudflare 代理 - 免费 HTTPS,但会增加延迟
  2. Nginx + Let’s Encrypt - 在 VPS 上套一层反代
  3. frp 的 HTTPS 插件 - frp 原生支持,但配置稍复杂
  4. 不管它 - 自己用的服务,HTTP 也无所谓

frp 用了这么多年还是香,配置简单,稳定可靠。NAT VPS 虽然便宜,但端口映射确实要多绕一步。搞清楚内外端口的关系,剩下的就顺理成章了。

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!

赞助
FRP 内网穿透:用 VPS 远程访问家里的 NAS
https://jielumoon.top/posts/frp-nas-remote-access/
作者
Jielumoon
发布于
2026-01-22
许可协议
CC BY-NC-SA 4.0

评论区

目录