Cloudflare Tunnel 搭配优选域名部署教程:单域名实现 Tunnel + SaaS 回源

本文介绍一种基于 Cloudflare Tunnel + Cloudflare SaaS 回源 + 优选域名 的部署方式。

整个方案只需要使用一个自己的域名,通过两个 Tunnel 路由分别负责访问入口和源站回源,再利用 Cloudflare 的 SaaS 自定义主机名功能,将访问域名与优选域名结合起来。

本文以以下域名为例:

  • 主域名:example.com
  • 应用域名:appname.example.com
  • 源站域名:origin-appname.example.com
  • SaaS 默认回源:saas.example.com
  • CDN 优选域名:cdn.example.com
  • 优选域名:cdn.els.edu.rs

一、整体部署结构

最终的访问链路如下:

用户
 │ 访问
 ▼
appname.example.com
 │ CNAME
 ▼
cdn.example.com
 │ CNAME
 ▼
cdn.els.edu.rs
 │
 ▼
Cloudflare
 │ SaaS 自定义主机名
 ▼
origin-appname.example.com
 │ Cloudflare Tunnel
 ▼
内网应用

其中:

appname.example.com

是最终给用户使用的访问域名。

origin-appname.example.com

负责作为 Tunnel 的源站回源主机名。

cdn.example.com

负责指向 CF 优选域名。

saas.example.com

则作为 Cloudflare SaaS 配置中的默认回源域名。


二、创建 Cloudflare Tunnel

首先进入 Cloudflare Zero Trust:

Cloudflare
→ Zero Trust
→ Networks
→ Tunnels

创建一个新的 Cloudflare Tunnel。

例如:

Tunnel Name:
my-app

完成 Tunnel 创建之后,根据 Cloudflare 提供的方式,在内网服务器运行 cloudflared

Tunnel 正常连接后,开始配置 Public Hostnames。


三、创建两个 Tunnel 路由

这里是整个方案比较关键的一步。

我们需要创建两个 Public Hostname。

3.1 第一个路由

第一个路由用于应用访问:

appname.example.com

例如:

Hostname:
appname.example.com

Service:
http://192.168.1.100:3000

其中:

192.168.1.100:3000

替换成你的实际内网服务地址。


3.2 第二个路由

第二个路由用于后续 SaaS 回源:

origin-appname.example.com

同样指向刚才的内网服务:

Hostname:
origin-appname.example.com

Service:
http://192.168.1.100:3000

因此现在实际上存在两个域名:

appname.example.com
        ↓
192.168.1.100:3000

origin-appname.example.com
        ↓
192.168.1.100:3000

两个域名最终都指向同一个内网服务

image-20260916172203933.png


四、检查 SSL/TLS 加密模式

进入:

Cloudflare
→ SSL/TLS
→ 概述

检查当前加密模式。

本方案要求:

灵活(Flexible)

也就是:

用户
 ↓ HTTPS
Cloudflare
 ↓ HTTP
源站

image-20260916172620631.png

如果当前不是“灵活”,需要根据实际环境调整。

注意:SSL/TLS 模式会影响 Cloudflare 到源站之间的连接方式。如果你的实际 Tunnel/ 源站环境使用了不同的 TLS 配置,应以实际环境为准,不要机械套用本文配置。


五、检查 Cloudflare SaaS 功能

接下来需要确认 Cloudflare 的 SaaS 自定义主机名功能已经开通。

进入 Cloudflare 对应的 SaaS 配置页面,检查:

自定义主机名
Custom Hostnames

确保相关 SaaS 功能可用。

本文后面的:

appname.example.com

自定义回源主机名配置,就是依赖这一功能完成的。


六、创建 SaaS 默认回源域名

接下来进入:

Cloudflare
→ DNS
→ 记录

创建:

saas.example.com

指向:

7.7.7.7

配置类似:

类型:A
名称:saas
IPv4 地址:7.7.7.7
代理状态:已代理

也就是:

saas.example.com
        ↓
      7.7.7.7

这里的 7.7.7.7 主要用于满足 Cloudflare SaaS 回源配置所需要的默认回源条件。

它并不是实际的应用源站地址。

同时需要打开 Cloudflare 的代理,也就是“小黄云”。


七、创建 CDN 优选域名

接下来创建:

cdn.example.com

将它 CNAME 到你的优选域名。

本文使用:

cdn.els.edu.rs

作为示例。

DNS 配置:

类型:CNAME
名称:cdn
目标:cdn.els.edu.rs
代理状态:仅 DNS

也就是:

cdn.example.com
       ↓
cdn.els.edu.rs

这里需要注意:

关闭 Cloudflare 代理

cdn.example.com 不开启小黄云。

也就是:

☁️ DNS Only

而不是:

☁️ Proxied

否则容易形成额外的 Cloudflare 代理层。


八、删除 Cloudflare Tunnel 自动创建的 DNS 记录

当创建 Cloudflare Tunnel Public Hostname 时,Cloudflare 通常会自动创建对应 DNS 记录。

例如:

appname.example.com

此时 DNS 中可能已经存在 Tunnel 自动创建的 CNAME 记录。

需要先删除这个自动创建的:

appname.example.com

记录。

因为我们接下来需要手动重新配置它。


九、重新创建 appname.example.com

重新进入:

Cloudflare
→ DNS
→ 记录

创建:

appname.example.com

配置:

类型:CNAME
名称:appname
目标:cdn.example.com
代理状态:仅 DNS

也就是:

appname.example.com
        ↓
cdn.example.com
        ↓
cdn.els.edu.rs

这里同样需要:

Proxy status:DNS Only

不要打开小黄云。

image-20260916173428838.png


十、配置 SaaS 自定义主机名

现在进入 Cloudflare SaaS 的:

自定义主机名
→ 回源

添加一个新的回源自定义主机名。

填写:

自定义主机名:

appname.example.com

10.1 最低 TLS 版本

最低 TLS 版本设置为:

TLS 1.1

10.2 证书类型

证书类型选择:

Cloudflare 提供

10.3 证书验证方法

选择:

HTTP 验证

10.4 自定义源服务器

这里填写:

origin-appname.example.com

也就是:

appname.example.com
        ↓
SaaS 自定义主机名
        ↓
origin-appname.example.com
        ↓
Cloudflare Tunnel
        ↓
内网服务

完成配置后保存。

image-20260916173809267.png


十一、最终 DNS 关系

完成上述配置后,DNS 大致如下:

类型 主机名 指向 代理
A saas.example.com 7.7.7.7 开启
CNAME cdn.example.com cdn.els.edu.rs 关闭
CNAME appname.example.com cdn.example.com 关闭

Tunnel 中则存在:

appname.example.com
        ↓
内网服务

origin-appname.example.com
        ↓
内网服务

十二、最终完整链路

把所有配置串起来:

                        Cloudflare
                            │
用户 ── HTTPS ──> appname.example.com
                            │ CNAME
                            ▼
                    cdn.example.com
                            │ CNAME
                            ▼
                     cdn.els.edu.rs
                            │
                            ▼
                    Cloudflare Edge
                            │
                            ▼
                SaaS Custom Hostname
                            │ Custom Origin
                            ▼
              origin-appname.example.com
                            │ Cloudflare Tunnel
                            ▼
                   cloudflared
                            │
                            ▼
                   内网服务器
                            │
                            ▼
                    192.168.1.100:3000

因此,最终用户只需要访问:

https://appname.example.com

而不需要直接知道:

origin-appname.example.com

也不需要直接访问:

cdn.els.edu.rs

十三、为什么需要两个 Tunnel 路由?

这里可能是整个方案中最容易产生疑问的地方。

实际上:

appname.example.com

和:

origin-appname.example.com

虽然最终都连接到同一个内网服务,但是承担的作用不同。

appname.example.com

主要作为原始的 Tunnel Hostname。

origin-appname.example.com

主要作为 SaaS 自定义主机名中的:

Custom Origin Server

这样可以把“用户访问域名”和“Cloudflare 回源域名”分离开。

最终形成:

访问域名
appname.example.com

        ↓

优选入口
cdn.example.com
        ↓
cdn.els.edu.rs

        ↓

SaaS 回源
origin-appname.example.com

        ↓

Tunnel
内网服务

十四、部署完成后的检查

建议按照下面的顺序进行检查。

14.1 检查 Tunnel

确认 Tunnel 状态:

Healthy

并且两个 Public Hostname 都正常。


14.2 检查 DNS

执行:

nslookup appname.example.com

然后:

nslookup cdn.example.com

确认解析关系符合预期。


14.3 检查 HTTPS

执行:

curl -I https://appname.example.com

正常情况下应该能够获得 HTTP 响应。


14.4 检查 Cloudflare 响应

可以使用:

curl -I https://appname.example.com

观察:

server
cf-ray

等响应头。


14.5 浏览器访问

最后直接访问:

https://appname.example.com

确认应用能够正常打开。


十五、常见问题

15.1 为什么 appname.example.com 不能直接使用 Tunnel 自动生成的 DNS?

因为本方案需要让:

appname.example.com

进入:

cdn.example.com
→ 优选域名

然后再通过 SaaS 自定义主机名进行回源。

因此需要删除 Tunnel 自动创建的 DNS 记录,再按照本文方式重新创建。


15.2 为什么 cdn.example.com 必须关闭代理?

因为:

cdn.example.com

承担的是优选域名 CNAME 入口。

如果再次开启 Cloudflare Proxy,就可能形成额外的代理层,使实际链路与预期不一致。

因此本文配置采用:

DNS Only

15.3 为什么需要 saas.example.com?

它作为 Cloudflare SaaS 配置中的默认回源域名。

本文使用:

saas.example.com
→ 7.7.7.7

并开启 Cloudflare 代理。

这个地址不是实际应用服务器。


15.4 为什么还需要 origin-appname.example.com?

因为 SaaS 自定义主机名中需要指定:

Custom Origin Server

这里填写:

origin-appname.example.com

而这个域名又通过 Cloudflare Tunnel 连接到实际内网服务。


十六、配置总结

最终只需要记住下面这几个关系:

saas.example.com
        ↓
    7.7.7.7
    Proxied


cdn.example.com
        ↓
cdn.els.edu.rs
    DNS Only


appname.example.com
        ↓
cdn.example.com
    DNS Only


SaaS Custom Hostname
        ↓
appname.example.com
        ↓
Custom Origin
        ↓
origin-appname.example.com


Cloudflare Tunnel

appname.example.com
        ↓
内网服务

origin-appname.example.com
        ↓
内网服务

最终访问:

https://appname.example.com

即可进入内网部署的应用。


十七、最终效果

通过这种方式,可以将:

Cloudflare Tunnel
+
Cloudflare SaaS Custom Hostname
+
自定义域名
+
CF 优选域名

组合在一起。

整个方案只需要维护一个主域名:

example.com

然后通过不同的子域名承担不同职责:

appname.example.com          # 用户访问入口

origin-appname.example.com  # Tunnel 回源入口

cdn.example.com             # 优选域名入口

saas.example.com            # SaaS 默认回源

这样既保留了 Cloudflare Tunnel 的内网穿透能力,又可以在入口处使用指定的优选域名,同时将用户访问域名和实际 Tunnel 回源域名分离。

提示:Cloudflare 的 SaaS、Custom Hostnames、SSL/TLS 和 Tunnel 功能可能随套餐、账户类型及 Cloudflare 产品更新而变化。本文中的界面名称和配置逻辑以实际控制台为准。优选域名本身也可能发生线路、可用性和策略变化,部署后建议自行进行实际网络测试。