免费的Cloudflared实现外网访问群晖(续)

这两天可能中了甲流,因为做了抗原始终是一条杠

老婆是前天晚上开始发烧的,我则是从昨天中午开始的,昨晚是 37.8℃,今早起来是 38℃,症状就是肌肉酸痛,头有点昏昏沉沉的,公众号后台、博客上都积攒了不少提问的,等老苏缓过劲来再一一答复吧


前言

老苏 3 年前买的腾讯 vps 下个月要到期了,续费的话有点肉疼,毕竟它的作用只是为了写免费的教程

更何况因为 ml 域名的问题,也不能备案。那要再加上买域名,会是一笔不小的开支,对老苏这种还在努力搬砖的人来说,真是贵啊。

老苏自用比较简单,直接 Tailscale ,把子网路由一开,在哪访问都跟在家一样,但是写文的话,总有人问 npm 做反向代理的问题,老苏还是需要有个环境来验证。

本着能省则省的原则,老苏开始寻找相应的方案

解决方案

老苏脑子里第一个冒出来的念头就是用 Cloudflared + npm 的方式,理论上肯定是可行的,但是是否真的可行,会遇到什么坑,那只有实践了才知道

乘着五一有几天假期,终于把这个一直在脑子的念头实现了,感觉好像省了几个亿 😂

本文假设你已经会搭建 CloudflaredNginx Proxy Manager,如果还不会的话,建议去看老苏写的相关文章,这里就不赘述了

开始动手

在上篇 免费的Cloudflared实现外网访问群晖 中,我们是针对一个一个的域名做解析的,不仅要在本地修改 config.yaml 文件,还要去 CloudflareDNS 里添加子域名的CNAME 记录,实在是有点烦人

既然要弄,就要把痛点解决掉才有意义 💪

泛域名解析

Cloudflared 是支持泛域名解析的,只要在域名 laosu.ml 域名下面添加两条 CNAME 记录

类型 名称 目标
CNAME @ <隧道 UUID>.cfargotunnel.com
CNAME * <隧道 UUID>.cfargotunnel.com

目的是将 a.laosu.mlb.laosu.mlc.laosu.ml等等的域名请求,都发给 <隧道 UUID>.cfargotunnel.com

config.yaml

接下来要修改 config.yaml 文件,修改前是👇下面这样的

1
2
3
4
5
6
7
8
9
10
11
tunnel: <隧道 UUID>
credentials-file: /root/.cloudflared/<隧道 UUID>.json

ingress:
- hostname: a.laosu.ml
service: http://192.168.0.199:8180
- hostname: b.laosu.ml
service: http://192.168.0.199:7123
- hostname: c.laosu.ml
service: http://192.168.0.199:9000
- service: http_status:404

修改后,只需要一条记录

1
2
3
4
5
6
7
tunnel: <隧道 UUID>
credentials-file: /root/.cloudflared/<隧道 UUID>.json

ingress:
- hostname: "*.laosu.ml"
service: http://192.168.0.199:2080
- service: http_status:404

目的就是将 <隧道 UUID>.cfargotunnel.com 的请求,都转发给 Nginx Proxy Manager2080端口

npm 的设置

以老苏的测速服务为例,本地访问地址为 http://192.168.0.199:8180

主机设置是跟之前一样的

但是 SSL 不同,不要设置证书

因为默认情况下, Cloudflared 是自带证书的,npm中再设置证书,反而会导致 ERR_TOO_MANY_REDIRECTS 错误

所以不要设置证书才可以正常访问

顺便测个速

比之前老苏的 1M 小水管强多了,而且再也不用带尾巴访问了,截端口问题也一劳永逸的解决了

用来写教程,Cloudflared 的免费套餐已经足够用了

安全性

安全性方面,你可以结合 CloudflareZero Trust 来设置存取规则

老苏设置了邮件验证,所以当访问 https://speed.laosu.ml 时,会弹出右键地址输入框

当然只添加了自己的邮箱

邮件中会收到验证码

填写正确的验证码之后就可以看到你访问的站点了

为了一劳永逸,针对的Application URL也是用的 *.laosu.ml

小结

所以后续,每次增加一个服务,只要在 npmAdd Proxy Host,然后填写 Domain NamesIPPort 就可以了,是不是够简单了?

如果你访问的域名在 npm 中没有设置,例如 https://sp.laosu.ml,你会看到

免费的东西总归会有限制的,如果您的应用程序需要传输大量数据或高带宽连接,使用 Cloudflare Tunnel 可能就不是最佳选择了。

参考文档

免费的Cloudflared实现外网访问群晖 | 老苏的blog
地址:https://laosu.tech/2022/04/06/免费的Cloudflared实现外网访问群晖

Using Cloudflare Tunnel with Nginx Proxy Manager : selfhosted
地址:https://www.reddit.com/r/selfhosted/comments/wpvy8c/using_cloudflare_tunnel_with_nginx_proxy_manager/