cloudflare 提供了免费的 Tunnel 产品,可以实现内网穿透的功能。但前提是你在 cloudflare 有域名托管。
Tunnel 有两种使用方式:
第一种是 cloudflare 后台UI界面管理,这种方式简单,但管理多个子域名时需要开多个 Tunnel,比较冗余。
第二种是命令行方式,复杂但比较灵活。适合在 nas 的 docker 中运行。这篇文章主要介绍这种方式。
首先在有 docker 的环境运行以下命令,获得登录密钥文件。注意命令行输出,运行后会生成一个连接,复制链接到浏览器完成登录和授权。
docker run --rm -v $PWD/cloudflared:/home/nonroot/.cloudflared cloudflare/cloudflared login
然后创建 Tunnel ,这里的 mytunnel
可以换成你喜欢的名字。
docker run --rm -v $PWD/cloudflared:/etc/cloudflared cloudflare/cloudflared tunnel create mytunnel
完成这两步后,会在当前目录创建一个文件夹 (cloudflared) 和两个文件。类似这样
tree
./cloudflared/cert.pem
./cloudflared/xxxxxxx-1aa2-46fe-a4ef-5d6ba1b946c8.json
然后编写配置文件 ./cloudflared/config.yml ,配置文件中的域名 mywebsite.com 改成你自己的域名。xxxxxxx-1aa2-46fe-a4ef-5d6ba1b946c8 也改你自己的。
vim config.yml
tunnel: xxxxxxx-1aa2-46fe-a4ef-5d6ba1b946c8
ingress:
- hostname: www.mywebsite.com
service: http://192.168.1.100:8080
- hostname: nas.mywebsite.com
service: http://192.168.1.100:5000
- service: http_status:404
分配一个 CNAME 记录,将流量指向您的 Tunnel。
# 创建子域名记录,如果有多个子域名,要执行多次。
docker run --rm -v $PWD/cloudflared:/etc/cloudflared cloudflare/cloudflared tunnel route dns xxxxxx-1aa2-46fe-a4ef-5d6ba1b946c8 nas.mywebsite.com
# 验证配置文件
docker run --rm -v $PWD/cloudflared:/etc/cloudflared cloudflare/cloudflared tunnel ingress validate
# 验证访问规则
docker run --rm -v $PWD/cloudflared:/etc/cloudflared cloudflare/cloudflared tunnel ingress rule https://nas.mywebsite.com
启动 docker 容器。启动后需要等一会才能联通。看到这样的日志就代表联通了。Registered tunnel connection connIndex=0 connection=xxxxxx-f4e9-4d5e-bb34-323ea53420ee event=0 ip=28.0.11.157 location=kix02 protocol=http2
# 测试启动
docker run --rm -v $PWD/cloudflared:/etc/cloudflared cloudflare/cloudflared tunnel run mytunnel
# 正式启动
docker run -d --restart unless-stopped -v $PWD/cloudflared:/etc/cloudflared cloudflare/cloudflared tunnel run mytunnel
最后测试,对了 cloudflare 会贴心的为你的 Tunnel 套上 ssl 证书,所以访问时用 https 哦。
curl -v https://nas.mywebsite.com