OpenWrt 用 Cloudflare Tunnels 代替 Frp 及SAAS优选

# 前言

11 月份 Frp 的机到期了,发现能用 CF 白嫖内网穿透,于是开始了折腾

# 准备

  • * ImmortalWrt 23.05
  • * 两个域名且绑定在 Cloudflare
  • * CF 账号以及开通 SAAS 不多说
  • # 开始

    首先在 ImmortalWrt 上面安装好 `luci-app-cloudflared` (ImmortalWrt 自带相关软件包,我未深入研究其他安装方式。Linux 系统的安装方法有很多,这里不再赘述,详情可参考官方 GitHub 页面:[Cloudflare/cloudflared](https://github.com/cloudflare/cloudflared) )

    ## SSH 连接到设备

    注意:如果和我一样是是用 ImmortalWrt 提供的软件包,可以输入 `cloudflared update` 来更新软件,不会影响 luci 的兼容

    bash</s><i> </i>cloudflared tunnel login<i> </i><e>

    这时候打开客户端跳出来的链接,登录 Cloudflare 后选择你的副域名(辅助域名),例如:back.com
    电脑这时候会下载 "cert.pem" 到 `/root/.cloudflared`,需要自己把他移动到 `/etc/cloudflared/` 或者用 luci 界面上传
    如果下载失败可以手动点击控制台的链接下载到电脑,重命名后,再用上面的方式传输到 OpenWrt

    ## 创建隧道,随意命名

    bash</s><i> </i>cloudflared tunnel create XXX<i> </i><e>

    这时候 `/root/.cloudflared` 下面会有一个 `<UUID>.json` 文件,同样把它弄到 `/etc/cloudflared/` 文件夹里面去

    添加一个域名,这个域名将作为回退源,建议使用子域名,这里以 op.back.com 为例

    bash</s><i> </i>cloudflared tunnel route dns &lt;UUID or NAME&gt; op.back.com<i> </i><e>

    ## 创建配置文件 config.yml

    ```txt
    tunnel: <UUID>
    credentials-file: /etc/cloudflared/<UUID>.json

    ingress:

    Example of a rule responding to traffic with an HTTP status:

    • service: http_status:404
      ```

    验证配置是否有效

    bash</s><i> </i>cloudflared tunnel ingress validate<i> </i><e>

    ## 运行隧道

    bash</s><i> </i>cloudflared tunnel run &lt;UUID or NAME&gt;<i> </i><e>

    或去 luci 启动

    ## 迁移本地配置

    迁移到云端更便于管理,避免使用抓包 PUT 请求

    去 Cloudflare 的 Tunnel 界面查看是否为 `HEALTHY`

    image![image](https://85d8ba7.webp.li/2024/12/225d0b8e7d2bf8bfdd4b5490eedad8e0.webp)

    进入该 Tunnel 的管理界面,一路确认就可以迁移了

    这时候可以添加主域名的穿透了,Add a public hostname --> `op.a.com` --> `http://192.168.8.1:80`

    image![image](https://85d8ba7.webp.li/2024/12/e812b96e59aebffed374496d45d975e3.webp)

    还可以继续添加同一 IP 不同端口的服务到,a.com 的其他子域名下面(我自己折腾,同一内网不同 IP 也是可以的,如:回退源为 192.168.8.1,但是我穿透 192.168.8.2 的服务,用网站测速也是有加速效果的,这里没有佬的研究成果,效果不敢保证)

    ## 设置优选域名

  • 1. 在 Cloudflare 中直接设置
  • 2. 主域名的一个子域名(cdn.a.com)托管到腾讯云、阿里云等提供 DNS 分线路解析服务的平台,进行境内境外分流
  • ### 方法一

    到 辅助域名(back.com )的管理页面

    添加一条 DNS 记录,用作优选域名,如:cdn.back.com

    把该域名 CNAME 到一个优选域名(切记关闭小黄云),请自行挑选:[CloudFlare 公共 Cname 域名](https://www.wetest.vip/page/cloudflare/cname.html)

    ### 方法二

    dnspod 或其他 dns 平台,添加主域名的随机一个子域名,如:cdn.a.com

    这里以腾讯云为例

    复制主机记录和记录值去 CF 添加,同时添加 NS 记录指向 `f1g1ns1.dnspod.net` 和 `f1g1ns2.dnspod.net`,然后在高级设置中关闭暂停解析

    如下图添加解析,境内指向优选域名 / IP,境外指向你的回退源

    image![image](https://85d8ba7.webp.li/2024/12/a772ac3e0e92b1eeb78ac1fb2d679fad.webp)

    然后在我的域名界面,点击该加速域名的 “更多” --> “开始解析”

    ## 设置回退源

    辅助域名(back.com)管理界面,左侧边栏 -->SSL/TLS--> 自定义主机名

    设置回退源为 `op.back.com`

    设置自定义主机名为 `op.a.com`(还有其他服务一并添加)

    复制好 “主机名预验证 TXT 名称” 和 “主机名预验证 TXT 值”
    就是 `_cf-custom-hostname.op.a.com`

    证书验证(_acme-challenge.op.a.com)不用管,CNAME 到回退源他会自动消失的

    ## 主域名设置

    现在去主域名(a.com)设置 DNS 记录

    由于我们在 Tunnel 已经添加过主域名的记录,所以这里会有 CNAME 的记录,且内容为我我们的容器 ID

    把容器 ID 改为我们的优选域名(cdn.a.com)关闭小黄云,这样就用上了

    再把 “主机名预验证 TXT 名称” 和 “主机名预验证 TXT 值” 添加好,这时候可以回到,辅助域名(back.com)自定义主机界面,看 “证书状态” 和 “主机名状态” 是否都变成了有效,到此就大功告成了

    [ITDOG](https://www.itdog.cn/http/) 和 [ZHALE](https://zhale.me/http/) 的网站测速看看(带上 https://,慢速检测),出口 IP 有十个以上就是成功了

    # 设置截图

    Public hostname
    image![image](https://85d8ba7.webp.li/2024/12/b25173d3c71da7eed98a4213d5b41737.webp)

    辅助域名(back.com DNS 设置)
    image![image](https://85d8ba7.webp.li/2024/12/418b6e87f9235a5ea6dd4c7a0724a2af.webp)

    自定义主机名设置
    image![image](https://85d8ba7.webp.li/2024/12/1726bfa32a1d2224e0b4714ca04dc33e.webp)

    主域名(a.com DNS 设置)
    image![image](https://85d8ba7.webp.li/2024/12/09ff7293440f35e7a1fbaf18cacde9a1.webp)

    加速域名设置(cdn.a.com)
    image![image](https://85d8ba7.webp.li/2024/12/a772ac3e0e92b1eeb78ac1fb2d679fad.webp)

    # 注意事项

  • 1.

    OpenWrt 上面跑了科学的话,请跳过这两个域名的流量嗅探,或者 OpenWrt 不要走代理,不然会连接不到 Cloudflare

    </s><i> </i> region1.v2.argotunnel.com region2.v2.argotunnel.com<i> </i><e>

    最好走直连,或者把 CF Tunnel 的服务 IP 走直连,不然家里的梯子断了就连不回来了

    思路来源于

    https://blog.xmgspace.me/archives/cloudflare-tunnel-via-proxy.html

    https://www.nodeseek.com/post-201141-1


  • 2.

    免费计划 API Tokens 只能创建 50 个,也就是你只要授权 50 次,就会报错:</s>Quota limit exceeded, you can create no more than 50 tokens.<e>

    所以要记得删除无用的:https://dash.cloudflare.com/profile/api-tokens

    详细请见:https://blog.tsinbei.com/archives/1505

  • # End

    其实优选后的提升不是很大😂

    感觉分享,非常有用。