最近有不少小伙伴问我,怎样才能更安全、更灵活地远程访问家里的NAS。今天我就来分享一套我觉得很不错的组合方案——Cloudflare Tunnel配合Nginx Proxy Manager。与其说这是一个教程,不如说是我对这套方案的一些心得体会。全文四千字,预计阅读时间11分钟,可先收藏,实际安装时打开按照教程来一步步配置。
为什么要这样搭配?
说起来,我用Cloudflare Tunnel 代理已经有一段时间了。它的确很方便,点点鼠标就能配置,但越用越觉得有些不灵活。比如打开cloudaflare网页时有时因为网络环境会加载卡顿,比如我想安装Tinyauth来增强安全性,或者需要自定义一些Nginx的转发规则,就得SSH登录进去找配置文件硬改,这体验着实不太爽。直到我接触到Nginx Proxy Manager(NPM),才发现有更好的办法。这个工具就像是给Nginx装上了一个友好的管理界面,让你可以在Web端直观地管理所有的代理规则,即便没有Nginx基础也能快速上手。而Cloudflare Tunnel呢,它提供了一种零配置的内网穿透方案——不用开放任何端口,不用配置复杂的路由转发,只需要在NAS上运行一个轻量级的Agent,就能安全地暴露你内网的服务。两者结合起来,就像给你的家庭网络装上了一把坚固的锁,又保留了灵活调整的空间。
什么是Nginx Proxy Manager?
简单来说,Nginx Proxy Manager就是一个带着漂亮前端管理界面的Nginx反向代理服务器。它打包在Docker容器里,你可以用它来转发来自互联网的请求到你在家里运行的各种服务——无论是Plex、Emby、还是其他自搭建的应用。而且NPM集成了Let's Encrypt,只要配置好域名,它会自动为你申请和续期证书,你完全不用操心证书过期的问题。而且它的操作界面真的很直观,即使是技术小白也能在几分钟内配置好一个代理。不过有用Cloudflare Tunnel的就不需要去配置这个功能。因为通过CF tunnel,你的链接直接是加密好的Https。它是适合有公网IP,直接暴露在公网上的用户。
什么是Cloudflare Tunnel?
Cloudflare Tunnel是Cloudflare提供的一项服务,允许你在没有公网IP的情况下安全地将内网服务暴露到互联网。它的原理是在你的NAS上运行一个Tunnel Agent,这个Agent主动连接到Cloudflare的边缘网络,创建一条安全的隧道。所有访问你服务的流量都通过这条隧道,完全不需要你开放任何防火墙端口。
- 无需公网IP - 不管你的运营商是否给分配公网IP都不影响
- 天然的DDOS防护 - 所有流量都经过Cloudflare的防护节点
两者怎么配合?
流量流向: 互联网用户 → Cloudflare Tunnel → Nginx Proxy Manager → 内网服务
- Cloudflare Tunnel负责把互联网的请求安全地传到你的NAS
- Nginx Proxy Manager在NAS上接收这些请求,根据域名、路径等规则转发给各个内网服务
这样的好处是什么呢?你可以用一个Tunnel来承载多个服务,然后通过NPM来灵活地管理这些服务的转发规则。比如你想要给某个服务加认证、修改转发规则、或者重定向到新的服务器,只需要在NPM的Web界面改改配置就行,完全不需要登录CF的网站去修改。
安装Nginx Proxy Manager
1.创建Docker卷目录
└── letsencrypt/ (存放SSL证书)
2. 选择数据库
NPM需要一个MySQL数据库来存储配置信息。我建议按照GitHub上NPM的安装页面说明,使用MariaDB。services: app: image: 'jc21/nginx-proxy-manager:latest' restart: unless-stopped ports: - '80:80' - '443:443' - '81:81' environment: TZ: "Asia/Shanghai" DB_MYSQL_HOST: "db" DB_MYSQL_PORT: 3306 DB_MYSQL_USER: "npm" DB_MYSQL_PASSWORD: "npm" DB_MYSQL_NAME: "npm" volumes: - ./data:/data - ./letsencrypt:/etc/letsencrypt depends_on: - db
db: image: 'jc21/mariadb-aria:latest' restart: unless-stopped environment: MYSQL_ROOT_PASSWORD: 'npm' MYSQL_DATABASE: 'npm' MYSQL_USER: 'npm' MYSQL_PASSWORD: 'npm' MARIADB_AUTO_UPGRADE: '1' volumes: - ./mysql:/var/lib/mysql
(如果复制出现格式错误,可后台发送NPM,获取配置文件。)
3. 部署Docker容器
打开飞牛Docker应用,在Compose中选择创建项目,项目名可随意命名,就是未来的docker名,路径选择你刚刚新建的。为什么用这些奇怪的端口号呢?因为80和443通常被飞牛本身占用了。如果我举例的这些端口有冲突,你可以用命令查一下,改成空闲的端口就好:netstat -tunlp | grep 端口号
4. 启动并登录
容器运行起来后,在浏览器输入 http://你的飞牛IP:1081,就能看到NPM的登录界面。
第一次登录会创建管理员账号,账号会保存在本地,如果忘记了就算卸载重装NPM也还在,所以务必记好。
安装Cloudflare Tunnel
1. 在Cloudflare创建Tunnel
登录你的Cloudflare账户,进入零信任(Zero Trust)控制面板,创建一个新的Tunnel。Cloudflare会给你一段Docker启动命令。
2. 在NAS上运行Tunnel容器
把Cloudflare提供的命令复制下来,在飞牛Docker里创建一个新容器。这个容器非常轻量,不需要太多配置,基本上拿到的命令直接用就行。
3. 配置Tunnel路由
Tunnel创建好后,你需要在Cloudflare的Tunnel管理界面配置路由。这里就是关键了:创建两个新的CNAME类型DNS解析,名称分别是*和你的域名,内容则是<隧道号>.cfargotunnel.com再回到隧道配置中,添加一个新的配置,指向Nginx Proxy Manager:这样,所有来自互联网访问你域名的流量,都会通过Cloudflare Tunnel进入你的NAS,然后被Nginx Proxy Manager接收和转发。
在NPM中配置Proxy Host
现在流量已经能进来了,接下来就是在NPM里配置代理规则。这一步很直观:
1. 打开NPM的Web界面,点击"Proxy Hosts"
2. 点击"Add Proxy Host",填入你要代理的内网服务信息
进阶玩法
1. 多服务转发
同一个域名下,可以根据不同的路径转发到不同的服务。比如:yourdomain.com/plex → 转发到Plex服务器yourdomain.com/emby → 转发到Emby服务器yourdomain.com/qbittorrent → 转发到qBittorrent
2. 加入身份认证
NPM支持集成Tinyauth或其他认证系统,这样可以在代理层面就加上身份认证,无需每个应用都配置。
3. 自定义请求头
某些应用可能需要特定的请求头。在NPM的"Custom Locations"或"Advanced"标签里,你可以添加自定义的Nginx规则。
总结
这套方案我用了一段时间,越用越喜欢。Cloudflare Tunnel提供了安全、稳定的内网穿透,Nginx Proxy Manager则让代理配置变得简单易用。相比之下,飞牛的内置反向代理虽然开箱即用,但在灵活性上确实差了一些。如果你也想折腾一下自己的NAS,想要更安全、更灵活的方式来远程访问家里的服务,不妨试试这个组合。相信我,一旦上手,你就会爱上这套流程。
阅读原文:原文链接
该文章在 2025/12/26 11:56:30 编辑过