Cloudflare Spectrum 配置完全指南:Origin 类型、TLS 模式与 Proxy Protocol 实战(基于 skills 仓库 cloudflare-deploy 参考文档)
【免费下载链接】skillsSkills Catalog for Codex项目地址: https://gitcode.com/GitHub_Trending/skills4/skills
本文以 skills/.curated/cloudflare-deploy/references/spectrum/configuration.md 为核心骨架,系统讲解 Cloudflare Spectrum 的四大配置维度:三种 Origin 源站类型(Direct IP / CNAME / Load Balancer)、四种 TLS 模式的选择、Proxy Protocol 客户端真实 IP 透传,以及 IP 防火墙与企业版端口范围。读完本文,你将掌握使用 TypeScript SDK 与 Terraform 两种方式创建、管理 Spectrum 应用,并能根据业务协议(SSH、数据库、游戏、MQTT 等)正确选型与排障。
一、Spectrum 是什么,何时使用
在进入配置细节前,先明确适用边界。根据 spectrum/README.md 的定义:Cloudflare Spectrum 是运行在 Cloudflare 边缘节点上的全局四层(L4)反向代理,为任意 TCP 或 UDP 应用提供安全与加速,可承载 MQTT、邮件、文件传输、版本控制、游戏等协议流量,通过 Cloudflare 边缘转发来隐藏源站并抵御 DDoS 攻击。
何时使用 Spectrum:当你的协议不是 HTTP/HTTPS 时(HTTP 应使用 Cloudflare 标准代理),Spectrum 负责其余一切——SSH、游戏、数据库、MQTT、SMTP、RDP 以及自定义协议。
在 skills 仓库的 cloudflare-deploy 技能决策树(SKILL.md)中,Spectrum 被归入 "Networking & Connectivity" 分支:TCP/UDP proxy (non-HTTP) → spectrum/。这也决定了本文所有配置的出发点:为某个非 HTTP 端口创建一个 Spectrum 应用(App)。
二、Origin 源站类型:三种选型与完整配置
Spectrum 应用的核心是回答"流量转发到哪"。文档给出了三种源站(Origin)类型,选型依据是源站地址的形态:静态 IP、动态主机名,还是需要高可用负载均衡。
2.1 Direct IP Origin(静态 IP 直连)
适用于单台服务器、固定静态 IP的场景。使用origin_direct指定tcp://IP:PORT格式的源站地址。
TypeScript SDK:
const app = await client.spectrum.apps.create({ zone_id: 'your-zone-id', protocol: 'tcp/22', // 对外暴露的协议与端口 dns: { type: 'CNAME', name: 'ssh.example.com' }, // 用户访问的域名 origin_direct: ['tcp://192.0.2.1:22'], // 源站静态 IP + 端口 ip_firewall: true, // 启用区域防火墙规则 tls: 'off', // SSH 自带加密,无需 TLS });Terraform:
resource "cloudflare_spectrum_application" "ssh" { zone_id = var.zone_id protocol = "tcp/22" dns { type = "CNAME" name = "ssh.example.com" } origin_direct = ["tcp://192.0.2.1:22"] ip_firewall = true tls = "off" argo_smart_routing = true # 启用 Argo Smart Routing 降低延迟 }要点:origin_direct是字符串数组(可配置多个 IP 做简单冗余),每个元素必须带tcp://或udp://前缀;IP 使用文档中的文档网段示例(如 192.0.2.1)时,请替换为你的真实源站地址。
2.2 CNAME Origin(主机名源站)
适用于源站是主机名(hostname)而非固定 IP的场景。Spectrum 会动态解析 DNS,当源站 IP 变化时无需重建应用,典型用于数据库主节点等内部主机名。
TypeScript SDK:
const app = await client.spectrum.apps.create({ zone_id: 'your-zone-id', protocol: 'tcp/3306', dns: { type: 'CNAME', name: 'db.example.com' }, origin_dns: { name: 'db-primary.internal.example.com' }, // 源站主机名 origin_port: 3306, // 源站实际监听端口 tls: 'full', });Terraform:
resource "cloudflare_spectrum_application" "database" { zone_id = var.zone_id protocol = "tcp/3306" dns { type = "CNAME" name = "db.example.com" } origin_dns { name = "db-primary.internal.example.com" } origin_port = 3306 tls = "full" argo_smart_routing = true }与 Direct IP 的关键差异:CNAME Origin 使用origin_dns加origin_port的组合,origin_port用于指定源站主机名对应的服务端口。从 api.md 的请求结构看,origin_direct与origin_dns在CreateSpectrumAppRequest中均为可选字段,二者互斥——每应用只能选一种源站形态。
2.3 Load Balancer Origin(负载均衡源站)
适用于高可用与故障转移(failover)场景。Spectrum 源站指向一个 Cloudflare Load Balancer 的域名,由负载均衡层完成健康检查、流量分发与自动切换。
Terraform:
resource "cloudflare_load_balancer" "game_lb" { zone_id = var.zone_id name = "game-lb.example.com" default_pool_ids = [cloudflare_load_balancer_pool.game_pool.id] } resource "cloudflare_load_balancer_pool" "game_pool" { name = "game-primary" origins { name = "game-1"; address = "192.0.2.1" } monitor = cloudflare_load_balancer_monitor.tcp_monitor.id } resource "cloudflare_load_balancer_monitor" "tcp_monitor" { type = "tcp"; port = 25565; interval = 60; timeout = 5 } resource "cloudflare_spectrum_application" "game" { zone_id = var.zone_id protocol = "tcp/25565" dns { type = "CNAME"; name = "game.example.com" } origin_dns { name = cloudflare_load_balancer.game_lb.name } # 源站指向 LB 域名 origin_port = 25565 }该配置链由三层资源构成:cloudflare_load_balancer_monitor(TCP 健康检查,每 60s 探测一次、5s 超时)→cloudflare_load_balancer_pool(源站池 + 关联监控)→cloudflare_load_balancer(对外 LB 域名)→cloudflare_spectrum_application(Spectrum 应用)。当主源站故障时,负载均衡器自动将流量切换至池内其他可用源站。需要多源站故障转移的完整示例可参考 patterns.md 的 Multi-Origin Failover 章节,其中展示了fallback_pool_id备用池的配置方式。
三、TLS 配置:四种模式的取舍
TLS 模式决定 Spectrum 边缘与客户端、边缘与源站之间如何加密。文档给出完整对照表:
| Mode | Description | Use Case | Origin Cert |
|---|---|---|---|
off | No TLS | Non-encrypted (SSH, gaming) | No |
flexible | TLS client→CF, plain CF→origin | Testing | No |
full | TLS end-to-end, self-signed OK | Production | Yes (any) |
strict | Full + valid cert verification | Max security | Yes (CA) |
解读每个选项的适用前提:
off:完全不启用 TLS。适用于协议自身已加密的场景(如 SSH、游戏服务端自带加密的 RDP),此时不要求源站有任何证书。flexible:客户端到 Cloudflare 走 TLS,Cloudflare 到源站走明文。仅建议测试环境使用,因为源站与边缘之间的链路没有加密。full:端到端 TLS,但允许源站使用自签名证书,边缘不做证书有效性校验。适合源站有证书(哪怕不是 CA 签发)的生产环境。strict:端到端 TLS 且强制校验源站证书有效性(必须为 CA 签发的有效证书)。用于数据库等安全敏感场景,提供最高等级保护。
配置示例(strict 模式):
const app = await client.spectrum.apps.create({ zone_id: 'your-zone-id', protocol: 'tcp/3306', dns: { type: 'CNAME', name: 'db.example.com' }, origin_direct: ['tcp://192.0.2.1:3306'], tls: 'strict', // Validates origin certificate });排障联动:TLS 模式选错是 525 错误与握手超时的常见根因。gotchas 文档(gotchas.md)给出了对应关系——源站无 TLS 时使用full/strict会报 Connection refused(应改off或启用源站 TLS);源站为自签名证书时使用strict会报 525(应改full或更换有效证书)。诊断命令:openssl s_client -connect app.example.com:443 -showcerts。
四、Proxy Protocol:透传客户端真实 IP
Spectrum 边缘转发会改变连接来源,导致源站日志中看到的都是 Cloudflare IP。启用Proxy Protocol可将真实客户端 IP 透传给源站,前提是源站必须支持解析对应协议版本。
版本对照表:
| Version | Protocol | Use Case |
|---|---|---|
off | - | Origin doesn't need client IP |
v1 | TCP | Most TCP apps (SSH, databases) |
v2 | TCP | High-performance TCP |
simple | UDP | UDP applications |
兼容性说明:
- v1:HAProxy、nginx、SSH、大多数数据库均支持,覆盖面最广;
- v2:二进制格式、性能更高,要求 HAProxy 1.5+、nginx 1.11+;
- simple:Cloudflare 专有的 UDP 格式。
在 Spectrum 应用中启用:
const app = await client.spectrum.apps.create({ // ... proxy_protocol: 'v1', // Origin must parse PROXY header });源站侧 nginx 配置(TCP 流代理):
stream { server { listen 22 proxy_protocol; proxy_pass backend:22; } }对应 HAProxy 的写法是bind :22 accept-proxy。从 patterns.md 的游戏服务器示例可以看到proxy_protocol: 'v1'用于保留玩家真实 IP,以便实现基于 IP 的封禁与统计;而 gotchas 文档强调,如果应用行为异常,应先用proxy_protocol: 'off'验证,再确认源站确实支持所选版本。
五、IP Access Rules:区域防火墙联动
Spectrum 应用可通过ip_firewall开关接入Zone 级别的防火墙规则(IP 访问规则),实现"仅允许指定 IP/国家访问某端口"的访问控制。
const app = await client.spectrum.apps.create({ // ... ip_firewall: true, // Applies zone firewall rules });配置流程分两步:① 在 Spectrum 应用中开启ip_firewall: true;② 在 Zone 层面配置对应的防火墙规则(白名单/黑名单)。这一能力对 SSH(见 patterns.md 的 SSH 保护示例)与 RDP(文档明确标注ip_firewall = true为REQUIRED)等高危端口尤为重要——RDP 是 DDoS 与暴力破解的重点目标,务必配合 Zone 防火墙白名单使用。
六、Port Ranges:企业版端口范围
Pro/Business 套餐只支持选定端口,而企业版(Enterprise)支持 1-65535 全部 TCP/UDP 端口以及端口范围。端口范围配置通过protocol与origin_port的起止区间联合声明:
resource "cloudflare_spectrum_application" "game_cluster" { zone_id = var.zone_id protocol = "tcp/25565-25575" # 对外端口段 dns { type = "CNAME" name = "games.example.com" } origin_direct = ["tcp://192.0.2.1"] # 源站不写端口 origin_port { start = 25565 end = 25575 # 源站端口段 } }注意两个细节:protocol中的端口段与origin_port的{ start, end }区间是成对出现的;origin_direct中只写源站 IP(不带端口),端口由origin_port块统一指定。从 api.md 的CreateSpectrumAppRequest结构可知,origin_port字段本身支持两种形态:number(单端口)或{ start: number; end: number }(端口区间),这与企业版功能严格对应。
七、配置参数速查:请求结构与完整字段
综合 api.md 的CreateSpectrumAppRequest,Spectrum 应用的可配置字段如下,便于对照上文各节:
interface CreateSpectrumAppRequest { protocol: string; // "tcp/22", "udp/53"(企业版可含端口范围) dns: { type: "CNAME" | "ADDRESS"; name: string; // "ssh.example.com" }; origin_direct?: string[]; // ["tcp://192.0.2.1:22"] origin_dns?: { name: string }; // {"name": "origin.example.com"} origin_port?: number | { start: number; end: number }; proxy_protocol?: "off" | "v1" | "v2" | "simple"; ip_firewall?: boolean; tls?: "off" | "flexible" | "full" | "strict"; edge_ips?: { type: "dynamic" | "static"; connectivity: "all" | "ipv4" | "ipv6"; }; traffic_type?: "direct" | "http" | "https"; argo_smart_routing?: boolean; }其中edge_ips.connectivity用于处理 IPv6 连通性问题(all双栈为默认、要求源站同时支持 IPv4/IPv6;源站无 IPv6 时选ipv4),traffic_type声明流量类型,argo_smart_routing控制 Argo 智能路由加速。完整的 REST API 端点(GET/POST/PUT/DELETE /zones/{zone_id}/spectrum/apps及三条 analytics 端点)与 Python、Go SDK 示例,均可直接查阅 api.md。
八、Go 实战示例与进一步阅读
除了 TypeScript SDK 与 Terraform,Spectrum 同样支持 Go SDK。以下创建应用的示例取自 api.md:
import "github.com/cloudflare/cloudflare-go" api, _ := cloudflare.NewWithAPIToken("your-api-token") // Create app, _ := api.CreateSpectrumApplication(ctx, "zone-id", cloudflare.SpectrumApplication{ Protocol: "tcp/22", DNS: cloudflare.SpectrumApplicationDNS{Type: "CNAME", Name: "ssh.example.com"}, OriginDirect: []string{"tcp://192.0.2.1:22"}, IPFirewall: true, ArgoSmartRouting: true, }) // List apps, _ := api.SpectrumApplications(ctx, "zone-id") // Delete _ = api.DeleteSpectrumApplication(ctx, "zone-id", app.ID)推荐阅读顺序(与 spectrum/README.md 一致):
- 先按协议查看 patterns.md(SSH、Minecraft、MQTT、SMTP、MySQL/PostgreSQL、RDP 六大场景的完整配置与安全要求);
- 再按源站形态回到本文选择 Origin 类型;
- 上线前务必阅读 gotchas.md,重点核对连接超时、客户端 IP 显示为 Cloudflare IP、TLS 错误、SMTP 反向 DNS、分析数据保留期与各套餐配额限制;
- 程序化访问参考 api.md。
此外,Spectrum 所在的 cloudflare-deploy 技能还覆盖了完整的 IaC 生态:通用 Terraform 资源模板见 terraform/configuration.md,Pulumi 参考见 pulumi/configuration.md,REST 通用接口见 api/api.md。
【免费下载链接】skillsSkills Catalog for Codex项目地址: https://gitcode.com/GitHub_Trending/skills4/skills
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考