ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

(亲测)Cloudflare Tunnel(cloudflared,CF)完整部署教程|单隧道多服务(本人成功全流程,查询摸索总结)

(亲测)Cloudflare Tunnel(cloudflared,CF)完整部署教程|单隧道多服务(本人成功全流程,查询摸索总结) 以下方案的流程全是手工亲测实现之后记录的最近开发了一款网页主要用于账号管理但是只能在本地局域网跑。我想放到外网只要有网络的地方就能访问想到一个最简单的方法内网穿透快速、低成本这个方案最适合测试无需购买云服务器。它的原理是在我的电脑和公网之间建立一个安全的隧道。使用Cloudflare Tunnel优点免费、自动提供 HTTPS、速度稳定、可绑定自己的域名。缺点需要拥有一个自己的域名。其实这个也很简单买域名免费的也是一大把。流程如下一、下载并安装cloudflared客户端完整服务搭建1.1官方下载地址Cloudflare官方下载页https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/downloads/根据系统选择Windows amd64版本下载exeExecutable可执行文件。文件下载名cloudflared-windows-amd64.exe下载好之后建议重命名为 cloudflared.exe然后建议统一复制存放在 D:\cloudflared\ 目录下注意下载好的 .exe 执行文件不需要双击打开统一后面在cmd命令窗口去安装配置。1.2 添加域名到 Cloudflare以 ABC.com 为例登录 Cloudflare 后点击“添加站点”输入你的域名 ABC.com选择免费套餐FreeCloudflare 会提供两个 NS 服务器地址前往域名的注册商如阿里云、腾讯云、华为云等修改 DNS 为上述 NS 地址一定要注意不是修改DNS解析是修改域名的 DNS 服务器然后等待 DNS 生效通常几分钟到几小时。然后会收到两个cloudflare提供的NS 服务器地址wilson.ns.cloudflare.comhattie.ns.cloudflare.com比如我的域名在阿里云我就进入阿里云的域名管理1回到阿里云控制台进入域名管理页面。2找到你的域名点击右侧的 “管理” 或 “DNS 管理”。3在左侧导航栏或页面顶部找到 “DNS 修改” 或 “修改 DNS 服务器”。4选择 “自定义 DNS”将原来的阿里云 DNS 地址如 dns1.hichina.com删除。5填入 Cloudflare 提供的两个 NS 地址wilson.ns.cloudflare.comhattie.ns.cloudflare.com6点击 “确认” 或 “保存”。关键区别这里改的是 DNS 服务器不是在解析记录列表里添加 NS 记录。这个要特别注意。我一开始就没有注意到这个细节。1.3授权并且下载凭证文件回到本地系统在本地系统打开cmd命令窗口进入D盘找到我们前面新建的目录cloudflaredD:cdD:\cloudflared cloudflared.exe login然后系统会自动打开浏览器并进入cloudflare域名管理页面浏览器会自动打开域名授权页面因为我们前面已经完成了域名的添加保存和服务配置选择你的域名 xxxx.com 并点击 Authorize 授权Cloudflare 会自动下载凭证文件cert.pem默认是下载到用户目录例如C:\Users\你的用户名\ .cloudflared点击 Authorize 授权然后本地的文件夹就会自动下载凭证文件和比如我的就是下载并保存在这个文件目录下进入cert.pem的保存目录下将它拷贝到我们 D:\cloudflared\ 目录下。1.4创建 Tunnel 隧道创建一个Tunnel 隧道命名为 mytunnel 这个你可以自己定义名字后面要用在cmd命令行中继续执行cloudflared.exe tunnel create mytunnel注意要在 D:\cloudflared\ 目录下执行命令创建成功后将生成一个 UUID 凭证文件如1c1c89e7-xxxx-yyyy-zzzz-abcdefghijkl.json输出一条日志提示 UUID例如Created tunnel mytunnel with id: 1c1c89e7-xxxx-yyyy-zzzz-abcdefghijkl文件默认保存在目录C:\Users\你的用户名\ .cloudflared\拷贝该文件到 D:\cloudflared\ 目录下不要去重新命名⚠️ 重要提醒不要手动重命名这个UUID.json凭证文件改名会直接导致隧道鉴权失败无法连接云端。反正我就是遇到无法连接。不过有一些强制HTTP2之后也可以。因人而异吧。⚠️ 如果提示 “tunnel already exists”可以使用已有 tunnel跳过此步或 删除 tunnel 后重新创建当然要知道自己的tunnel名字才方便删除cloudflared.exe tunnel delete mytunnel1.5创建配置文件 config.yml依旧在我们的 D:\cloudflared\ 目录下新建一个文件 config.yml然后用记事本打开# 替换为你的隧道UUIDtunnel:你的隧道UUID# 完整填写UUID.json路径不要手动改名credentials-file:D:\cloudflared\一般默认就是UUID.json# 流量转发规则ingress: - hostname: abc.xxx.com service: http://127.0.0.1:5000# 兜底规则必须放在最后不可删除- service: http_status:404说明tunnel: 对应你的隧道UUIDcredentials-file: 必须是你保存凭证文件的路径和 cloudflared.exe 同级hostname: 你在 Cloudflare 上设置的子域名或者根域名service: 你本地服务的地址根据实际情况修改端口也是根据需求调整即可创建好之后我们可以对配置语法进行一个校验避免格式写错无法启动cloudflared tunnel ingress validate或者写清楚详细路径检测cloudflared tunnel--configD:\cloudflared\config.yml ingress validate输出Validation passed代表配置无误。1.6将域名与隧道绑定将域名ABC.xxx.com与 Cloudflare Tunnel 隧道mytunnel绑定起来。简单来说它会在 Cloudflare 的 DNS 记录中自动创建一条 CNAME 记录将 ABC.xxx.com 指向你的隧道在 Cloudflare 网络中的入口地址。这样一来当用户访问 ABC.xxx.com 时请求就能通过隧道安全地到达你本地的服务。执行命令cloudflared tunnel route dns mytunnel ABC.xxx.com备注这里面的mytunnel是你自己命名的隧道名字ABC.xxx.com是你的域名输出Added CNAME即绑定成功CF后台自动生成隧道CNAME解析默认开启CDN代理并且会自动启用CF的 CDN 的边缘节点缓存你网站上的静态资源比如图片、CSS 文件和 JS 文件方便全球访问备注说明-----CDN代理优势1全球加速2源 IP 隐藏核心安全当 CDN 代理开启后别人在世界任何地方 Ping 你的域名 ABC.xxx.com得到的都是 Cloudflare 的 IP 地址而非你家里或云服务器的真实 IP。这能极大降低被恶意攻击的风险。3免费 SSL 证书Cloudflare 会自动为你的域名申请并续签 HTTPS 证书用户访问时将显示“安全锁”标识。4安全防护Cloudflare 会在流量到达你的服务器前自动拦截常见的恶意攻击如 DDoS 攻击、SQL 注入等。所以任何人通过 Cloudflare 访问你的服务路径是用户 → Cloudflare CDN 边缘节点缓存安检 → Cloudflare Tunnel加密通道 → 你本地电脑的 Flask 服务这样既安全又高效。注意如果绑定域名的时候提示这个说明已经有一条记录可以手动删除也可以强制覆盖强制覆盖已有记录如果 ABC.xxx.com 已有 DNS 记录命令会失败。你可以添加 --overwrite-dns 或 -f 参数来强制覆盖也就是可以命令后面添加-f执行命令cloudflared tunnel route dns mytunnel ABC.xxx.com-f1.7启动隧道、网络协议排错QUIC UDP被拦截国内运营商、局域网防火墙大概率拦截UDP 7844端口默认QUIC协议会反复重连报错日志持续打印context canceled需要强制切换HTTP2协议启动。前台测试启动调试用cloudflared tunnel--protocolhttp2--configD:\cloudflared\config.ymlrun mytunnel此时浏览器访问https://ABC.xxx.com就可以实现公网访问本机127.0.0.1:5000服务自动带HTTPS安全绿锁。常见报错“Failed to get tunnel”触发原因一般是手动修改了UUID.json凭证文件名或者配置文件内的凭证路径填写错误导致云端鉴权不通过。解决办法删除旧的cert.pem、改名后的凭证文件重新执行cloudflared tunnel login授权重建隧道凭证配置文件严格指向 UUID.json 完整路径不再手动修改文件名保留原名即可二单隧道同时发布多个本地Web服务2.1不用新建多条隧道同一隧道可以关联多个域名通过 config.yml 中的 ingress 规则将不同域名指向本地不同的服务端口。修改config.yml 中的 ingress 规则# 替换为你的隧道UUIDtunnel:你的隧道UUID# 完整填写UUID.json路径不要手动改名credentials-file:D:\cloudflared\一般默认就是UUID.json# 流量转发规则规则按顺序从上到下匹配将特定域名指向特定本地端口ingress: - hostname: abc.xxx.com service: http://127.0.0.1:5000 - hostname: api.xxx.com service: http://localhost:3000 - hostname: blog.xxx.com service: http://localhost:8080# 最后必须有一个“兜底”规则处理未匹配的请求- service: http_status:4042.2为每个域名添加 DNS 记录要让互联网知道这些域名指向我的隧道我需要为每个域名在 Cloudflare 的 DNS 中添加一条 CNAME 记录。每个新增子域名执行一次绑定命令cloudflared tunnel route dns mytunnel api.xxx.com cloudflared tunnel route dns mytunnel blog.xxx.com2.3还可以基于路径路由同一域名不同路径通过 config.yml 中的 ingress 规则将不同路径路由指向本地不同的服务端口。也就是只用一个域名如 abc.xxx.com通过 URL 路径区分不同服务abc.xxx.com → 本地服务 05000 端口abc.xxx.com/account → 本地服务 A5050 端口abc.xxx.com/api → 本地服务 B3000 端口修改config.yml 中的 ingress 规则# 替换为你的隧道UUIDtunnel:你的隧道UUID# 完整填写UUID.json路径不要手动改名credentials-file:D:\cloudflared\一般默认就是UUID.json# 流量转发规则规则按顺序从上到下匹配将特定域名指向特定本地端口ingress: - hostname: abc.xxx.com service: http://localhost:5000 - hostname: abc.xxx.com path: /account/* service: http://localhost:5050 - hostname: abc.xxx.com path: /api/* service: http://localhost:3000 - service: http_status:4042.4验证并启动服务修改 config.yml 后建议先验证配置是否正确cloudflared tunnel--configD:\cloudflared\config.yml ingress validate验证通过后重启隧道使配置生效cloudflared tunnel--configD:\cloudflared\config.yml run三将CF安装为 Windows 系统服务可以实现自启动不用每次手动打开因为前台cmd命令启动只能作为临时调试关闭窗口隧道就会断开。最好是安装为Windows系统服务后台静默运行电脑重启自动重连。3.1这就需要给程序一个官方的“后台管家”让它们能开机自启也能通过标准命令随时启动、停止或重启以管理员身份打开命令提示符cmd进入 cloudflared 所在目录安装服务cloudflaredserviceinstall记住服务名称Cloudflared可能不同的电脑名称不一致这个名称决定了后面的执行操作3.2验证安装按 Win R输入 services.msc 打开服务列表找到 Cloudflared 服务。它的“启动类型”应为“自动”表示会开机自启。注意服务默认会使用 %USERPROFILE%.cloudflared\config.yml 作为配置文件。如果你的 config.yml 在其他位置如 D:\cloudflared\可以手动编辑服务对应的注册表项来修改路径而且还有一个很重要的步骤就是我们需要在服务启动时使用 --protocol http2 和 --config 参数所以我们必须修改现有服务的注册表3.3打开注册表编辑器regedit找到 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Cloudflared修改 ImagePath 为“D:\cloudflared\cloudflared.exe” tunnel --config “D:\cloudflared\config.yml” --protocol http2 run mytunnel3.4修改好之后我们需要重启服务一次使其生效。重启服务net stop Cloudflared然后net start Cloudflared然后再去打开相关网页服务就可以正常访问了备注说明管理 Cloudflared 服务安装为服务后可通过以下命令管理启动服务net start Cloudflared停止服务net stop Cloudflared查看状态sc query Cloudflared重启服务net stop Cloudflared然后net start Cloudflared卸载服务Cloudflared service uninstall强制结束 cloudflared.exe 进程taskkill /f /im cloudflared.exe有时候停止服务可能会遇到卡死就需要强制结束进程通过命令查看状态sc query Cloudflared备注重点查看 STATE 字段。如果状态是START_PENDING正在启动中但卡住了。等待 1~2 分钟如果还是这样需要强制处理STOP_PENDING正在停止中卡住了。同样需要强制处理RUNNING正在运行那就不需要再启动STOPPED已停止可以正常启动备注说明如果想要保留服务运行日志信息我们需要配置因为 cloudflared 默认不保存日志到文件所以要持久化日志需在启动服务时添加参数参数要添加到现有服务的注册表里面和上面添加一样我们可以将这个参数添加到 “D:\Cloudflared\bin\cloudflared.exe” 信息后面注意要在前后参数之间添加一个空格--logfileD:\Cloudflared\cloudflared.log--loglevelinfo添加之后如下D:\Cloudflared\bin\cloudflared.exe--logfileD:\Cloudflared\cloudflared.log--loglevelinfo tunnel--configD:\cloudflared\config.yml--protocolhttp2 run mytunnel点击“确定”然后重启 Cloudflared 服务使修改生效。之后日志会写入目录 D:\Cloudflared\cloudflared.log 文件方便排查问题。备注说明如果你还想要将本地的网页服务也能自动运行也可以。考虑到在 Windows 系统中要让 Celery、Flask、Redis 这些程序脱离 CMD 窗口、后台常驻运行核心是将它们注册为Windows 系统服务Service—— 这是 Windows 官方的后台运行方案开机自启、关闭 CMD 不影响还能通过服务管理器管理。这就需要用到NSSMNon-Sucking Service ManagerNSSM是 Windows 系统下 最易用的服务注册工具能把任意可执行程序注册为系统服务下载地址https://nssm.cc/download选择对应系统版本比如nssm-2.24.zip下载好之后解压到固定目录比如C:\nssm解压后重命名为nssm方便命令调用记住nssm.exe的路径C:\nssm\win64\nssm.exe这个是64 位系统C:\nssm\win32\nssm.exe这个是32 位系统以管理员身份打开命令提示符cmd比如我的系统是64位的所以我直接用命令打开NSSMC:\nssm\win64\nssminstallFlaskAccountService在弹出的 NSSM service installer GUI 窗口中配置Path你的代码解释器路径比如我是python写的代码就是 C:\Python311\python.exeStartup directory代码.py 所在目录如 D:\myprojectArguments代码.py 代码完整名字包括后缀扩展名Service name服务的名字这个可以自定义方便记忆查看然后我们点击 Install service 安装服务cmd命令窗口会弹出一个 successfully 提示表示服务安装成功了。然后我们可以通过命令启动也可以进入服务窗口去手动启动并且可以将服务开启成自动这样我们本地的网页服务也可以自动运行了。C:\nssm\win64\nssm start 你自己设定的服务名称恭喜你至此基本上一条完整的CF隧道就搭建好了直接可以实现内网穿透将本地服务和互联网连接起来
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表