给n8n的本地访问链接配置成公网访问

0 阅读4分钟

整体架构说明:

本文通过cloudflare tunnel,将本地运行在localhost:5678的n8n服务,通过cloudflare的中转网络暴露为公网HTTPS域名,从而实现外部设备访问与webhook的调用。

问题背景:

n8n通过docker启动之后,访问链接为localhost:5678

其它设备无法访问链接或者发送http消息到n8n项目中,因此使用cloudflare工具进行内网穿透(把只能在内网访问的服务通过一个中转通道变成外网能够访问的https url)

步骤

1、官网注册dash.cloudflare.com/

2、到github或者cloudflare官网中下载cloudflared工具:cloudflare/cloudflared: Cloudflare Tunnel client

下载最新版就好,windows的话可以选择msi或者exe版本(我下载的exe版本)

图片

下载的客户端会在本机主动向Cloudflare发起HTTP/QUIC长连接,外部访问n8n服务时的流程为:

浏览器→HTTPS→Cloudflare→加密tunnel→cloudflared→n8n

ps:dev-sidecar会阻碍文件的下载(本质上是一个本地代理/流量劫持工具,劫持github网址链接,把访问转发到加速源/镜像上面,提高网页放速度,因此我点击大文件下载链接时,release下载的就不是正确的链接)

3、将exe文件放置在d://software/cloudflared/文件夹,cmd中验证是否可用:cloudflared.exe--version

4、给tunnel分配一个可访问的域名——DNS迁移:zyydgrbk.top(申请的阿里云域名)

此步骤需要在cloudflare官网的域中添加网址,步骤如下:

图片

根据信息选择

图片

其中需要选择一个套餐,根据需求选择free即可,这里将阿里云上的dns配置移动到了cloudflare中,这样博客也可以继续访问,相当于只是在阿里云的域名管理中将dns解析器从阿里云的官方解析器换成了cloudflare的解析器而已。

图片

这里是在阿里云的域名管理页面,切换dns服务器

图片

ps:Cloudflare并没有转移域名的权力,需要把域名解析权交给Cloudflare,tunnel最终通过域名访问,Cloudflare需要为我自己的域名自动创建DNS记录

a、该域名包括其下的所有子域名都可以使用

b、在cloudflare中会添加博客网址,也就是阿里云购买的个人域名,会影响博客的访问吗?

www -> CNAME yangzouy.github.io

@ -> A 185.199.110.153(这是GitHub Pages 的一组 IP 之一)

将域名NS修改到cloudflare 阿里云的DNS将不会再被访问,如果cloudflare的DNS中如果也有这两条记录,那么访问依旧正常

5、登录cloudflare并且授权域名网址(所谓授权其实就是cloudflare知道将tunnel挂在哪个域名下面)的使用,cmd中输入:cloudflared tunnel login,跳转到登录界面

图片

登录成功后会安装证书,页面如下:

图片

ps:注意,在授权过程中,被提示需要去邮件中验证邮箱,原来在登录时就需要进行邮箱验证,否则会卡在这一步

6、创建tunnel

cmd中输入:cloudflared tunnel create <隧道名称>

图片

创建成功后会生成tunnel的json文件,名称是tunnel的ID

图片

查看所有的tunnel列表cloudflared tunnel list

7、创建管道对应的配置文件config.yml(依旧在c盘的相同位置)

图片

这里贴上全部的config.yml:

tunnel: 1b43c60d-4bd7-4457-b365-d4f765f00b09

credentials-file: C:\Users\邹阳\.cloudflared\1b43c60d-4bd7-4457-b365-d4f765f00b09.json

ingress:

- hostname: n8n.zyydgrbk.top

service: http://localhost:5678

- service: http_status:404

在该文件中定义域名到本地服务的映射

8、给tunnel分配公网域名

cloudflared tunnel route dns tunnel-ID n8n.zyydgrbk.top

成功后在域管理页面dns中

图片

9、启动tunnel,访问页面

cloudflared tunnel run <tunnel ID>

图片

在手机上通过浏览器访问n8n.zyydgrbk.top的页面(先登录,登录后访问到n8n.io)

ps:官网中的也可以创建tunnel,但是需要通过zero trust的入口进入

整体流程理解:

① 浏览器访问:n8n.example.com

② DNS 查询:n8n.example.com → Cloudflare

普通dns只是做域名映射到IP,但是这个域名不暴露源站IP,因为这个域名被配置成一种走cf网络的特殊记录,所以需要换成cf的DNS解析器NS,它可以知道这个域名是否需要走cloudflare tunnel

③ Cloudflare DNS 返回:这是一个 Tunnel 域名(非 IP)

HTTP全部交给tunnel处理,DNS只负责判断(即指路)

ps:cf要做到这一点的话,需要控制浏览器访问的这个域名的DNS,TLS证书,HTTP入口,因为需要将该域名挂载到cf中,并且修改阿里云DNS为cf的DNS

④ HTTP请求到达 Cloudflare 边缘节点

⑤ Cloudflare 根据 Host(n8n.example.com)匹配 Tunnel

在cf中配置DNS的时候会添加域名对应tunnel id的映射

⑥ Cloudflare 通过 Tunnel ID 找到在线的 cloudflared 客户端

⑦ 请求通过加密隧道发给 cloudflared

⑧ cloudflared 根据 ingress 规则转发到 localhost:5678

cloudflared通过ingress找到机器上的某个服务

⑨ n8n 响应→ 原路返回

图片