家庭内网穿透实战:手把手教你FRP结合阿里云反代实现域名访问

想在家里的NAS或树莓派上跑个服务,随时随地通过浏览器访问,却发现宽带没有公网IP?这大概是很多折腾党的痛点。

最近看到有不少朋友在讨论这个事儿,其实解决方案有很多,比如Cloudflare Tunnel、ZeroTier之类的。但如果你手里刚好有一台闲置的阿里云ECS,那么用 FRP 配合 Nginx反向代理 来实现,绝对是最稳、延迟最低的方案之一。

今天就把这套配置方案拆解一下,从原理到实操,手把手教你把家里的设备“搬”到公网上。

为什么选这套方案?

在开始之前,先明确一下这套架构的优势。

FRP内网穿透架构原理图,展示了流量从用户经过阿里云、FRP隧道到达家庭内网设备的流程。

图1:整体架构原理流程,流量经公网VPS再穿透至内网。

  • 稳定性高:阿里云ECS提供稳定的公网入口,不用担心P2P穿透的不稳定性。
  • 速度快:流量直接走VPS带宽,尤其是当你买了CN2线路的VPS时,国内访问速度非常可观。
  • HTTPS支持:通过在VPS上配置反向代理,可以很方便地申请SSL证书,全站加密。
  • 多服务复用:一个域名、一个端口,可以代理家里好几个不同的服务(路由器后台、NAS、个人博客)。

架构原理

整个流程其实很简单,理解了这三步,配置起来就只是填空题了。

  1. 内网端(家里):运行FRP客户端,主动连接阿里云服务器,告诉服务器“我家有个192.168.1.5:8080的端口需要对外开放”。
  2. 公网端(阿里云):运行FRP服务端,监听特定端口(比如7000),接收客户端的连接请求,并将流量转发给内网。
  3. 反向代理层:为了让访问更优雅(不带端口号、支持HTTPS),我们在阿里云上再装个Nginx,监听80/443端口,把域名的请求转发给FRP的监听端口。

第一步:准备服务器环境

你需要一台阿里云ECS,系统推荐CentOS或Debian/Ubuntu。

首先,去FRP的GitHub Releases页面下载最新的版本。注意服务器架构(X86还是ARM),下载对应的压缩包。

# 举例下载Linux amd64版本
wget https://github.com/fatedier/frp/releases/download/v0.52.3/frp_0.52.3_linux_amd64.tar.gz

![Nginx反向代理配置及HTTPS部署示意图,展示了DNS解析与Nginx转发的关系。](/media-load/019f0d34-5cb0-75d7-a3dc-8ead58d329b6)

*图2:Nginx反向代理与HTTPS加密通信配置原理。*

tar -zxvf frp_0.52.3_linux_amd64.tar.gz
cd frp_0.52.3_linux_amd64

解压后,我们会看到一堆文件,服务器端只需要关注 frpsfrps.toml

第二步:配置阿里云FRP服务端

新版FRP(0.52+)配置文件格式改成了TOML,这点要注意,网上很多老教程是ini格式的,直接照搬会报错。

编辑 frps.toml

bindPort = 7000

# 如果你需要通过FRP自带的仪表盘查看状态,可以配置这个
webServer.addr = "0.0.0.0"
webServer.port = 7500
webServer.user = "admin"
webServer.password = "这里填个强密码"
``
n配置很简单,主要就是设置一个 `bindPort`(用于和家里客户端建立连接的隧道口)和 `webServer`(管理面板,可选)。

**这里有个关键点:** 记得去阿里云控制台的**安全组**里,放行 `7000` 和 `7500` 端口!如果后面还要用Web服务,80和443也要放行。

启动服务端:

```bash
# 使用 nohup 后台运行
nohup ./frps -c frps.toml &

第三步:配置家里的FRP客户端

回到家里的电脑/NAS/树莓派上,同样下载FRP包,这次用的是 frpcfrpc.toml

编辑 frpc.toml

serverAddr = "你的阿里云公网IP"
serverPort = 7000

# 这里定义你要穿透的服务
[[proxies]]
name = "nas-web"
type = "tcp"
localIP = "192.168.1.5"  # 你家里设备的内网IP
localPort = 5000        # 你家里设备的服务端口
remotePort = 6000       # 在阿里云上开启的端口,用于后续反代

保存后启动:

nohup ./frpc -c frpc.toml &

这时候,你可以尝试在浏览器访问 http://你的阿里云IP:6000。如果正常显示了你家里设备的内容,说明底层的隧道已经打通了!

第四步:Nginx反向代理 + 域名绑定

n虽然 IP:6000 能用,但既不美观也不安全。我们需要用域名,并且加上HTTPS。

1. 安装Nginx

debian/ubuntu系统:

apt update && apt install nginx -y

2. 配置反代文件

/etc/nginx/conf.d/ 下新建一个配置文件,比如 frp.conf

server {
    listen 80;
    server_name home.yourdomain.com; # 换成你的域名

location / {
        proxy_pass http://127.0.0.1:6000; # 转发给刚才FRP设置的remotePort
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

# 建议加上WebSocket支持,如果家里服务需要
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

3. 解析域名

去你的域名DNS管理后台,添加一条A记录:

  • 主机记录:home
  • 记录值:你的阿里云公网IP

4. 申请SSL证书(推荐使用Certbot)

为了安全,必须上HTTPS。安装Certbot:

apt install certbot python3-certbot-nginx -y

直接自动配置:

certbot --nginx -d home.yourdomain.com

按提示输入邮箱,同意条款,Certbot会自动修改Nginx配置并续期证书。搞定后,你就可以通过 https://home.yourdomain.com 安全地访问家里的设备了。

常见问题与避坑指南

Q: 启动FRP成功,但无法访问连接数据库/路由器后台? A: 某些服务(比如OpenWrt)在检测到访问IP变化时可能会拒绝连接,或者服务本身只监听了 127.0.0.1。请检查 frpc.toml 中的 localIP 是否指向正确的局域网IP,而不是localhost。

Q: 为什么我访问速度很慢? A: 这完全取决于你的阿里云服务器带宽。如果是1Mbps的小带宽家庭版ECS,传输大文件肯定会卡。建议至少升级到3Mbps以上,或者使用按流量计费的高带宽突发实例。

Q: 家里的设备重启后怎么办? A: 记得把 frpc 设置为系统服务,开机自启。可以写个简单的systemd服务文件,确保断网重连后进程能自动拉起。

总结

n通过FRP穿透到阿里云,再由Nginx做反代,这是一套非常经典的内网穿透架构。它比Tailscale之类方案的优点在于无需下载客户端软件,只要有个浏览器就能访问,非常适合分享给别人使用。

如果你的数据隐私要求极高,建议在代理层再加一层HTTP Basic Auth或者仅允许自己的IP访问,安全第一嘛。

标签: none

评论已关闭