Brave
@47c132035ed7a1105a867946b99d67af WordPress学习小组 公开
讨论 Cloudflare Tunnel 托管 WordPress 完全指南

Cloudflare Tunnel 托管 WordPress 完全指南

在 2026 年,通过 Cloudflare Tunnel 托管 WordPress 已成为个人开发者、小型企业乃至中型团队的首选方案。本文将详细介绍如何整合本地服务器与Cloudflare Tunnel 实现WordPress托管,包括具体流程、配置要点和安全最佳实践。


一、核心架构

你的架构通常是这样的:

用户浏览器 ↔ Cloudflare 全球网络 ↔ Cloudflare Tunnel (cloudflared) ↔ 本地 WordPress (通常在 Docker 或 Nginx 中)

🔍 架构深度解析:

这一架构的核心在于 cloudflared——一个轻量级守护进程,它在你的本地服务器上运行,仅建立「出站连接」到 Cloudflare 的全球边缘网络。这意味着:

  • 你的本地服务器无需开放任何入站端口
  • 所有流量都经过 Cloudflare 的全球 CDN 加速
  • 你的真实 IP 地址对外完全不可见
  • cloudflared 与 Cloudflare 之间的通信始终加密

从技术实现角度来看,当用户访问你的域名时,请求首先到达距离用户最近的 Cloudflare 边缘节点,然后通过已建立的加密隧道转发到你的本地 WordPress 服务器。响应数据则沿着相同路径返回用户。


二、为什么它比传统方式更适合 WordPress

🔐 解决 HTTPS 问题

WordPress 非常依赖 HTTPS(否则后台可能无法登录或样式加载错误)。Cloudflare Tunnel 会在云端自动处理 SSL 证书,你本地只需要运行简单的 HTTP 服务。

📋 技术细节补充:传统方式下,你需要使用 Let's Encrypt 或其他证书颁发机构申请 SSL 证书,还要配置自动续期——这对于家庭网络用户尤其困难,因为许多 ISP 会封锁 80/443 端口,导致证书验证失败。而使用 Cloudflare Tunnel 后:

  • Cloudflare 自动为你的域名提供受信任的 SSL 证书
  • 建议在 Cloudflare 控制台中将 SSL/TLS 加密模式设置为「Full (Strict)」以获得最佳安全性
  • 同时开启「Always Use HTTPS」选项,强制所有 HTTP 请求重定向至 HTTPS
  • 启用 HSTS(HTTP Strict Transport Security),强制浏览器仅使用安全连接

🛡️ 防御攻击

WordPress 是黑客攻击的重灾区。通过 Tunnel,你的真实 IP 完全隐藏在 Cloudflare 防火墙(WAF)之后,可以有效拦截暴力破解和 DDoS 攻击。

⚠️ 为什么 WordPress 是高危目标?

根据统计,WordPress 驱动了全球超过 40% 的网站,这使得其登录页面成为网络攻击的频繁目标,尤其是暴力破解攻击和恶意机器人流量。传统安全措施(如强密码和双因素认证)虽然有帮助,但无法从根本上阻止攻击者持续尝试。

🆚 传统端口转发 vs Cloudflare Tunnel 安全对比:

安全维度传统端口转发Cloudflare Tunnel
入站端口必须开放 80/443 端口零入站端口,仅出站连接
真实 IP 暴露完全暴露,可被直接攻击完全隐藏在 Cloudflare 之后
DDoS 防护无,需额外购买服务内置 Cloudflare 全球网络防护
SSL 证书需自行申请和维护自动配置和续期
配置复杂度需配置路由器、防火墙规则一条命令即可完成
动态 IP 影响路由器重启后链接可能失效不受影响,隧道自动重连

三、特别注意:WordPress 的"反向代理"配置

由于 Cloudflare Tunnel 充当了反向代理,你需要在 WordPress 中做一点微调,否则会出现样式失效或无法登录的问题:

📝 修改 wp-config.php

你需要告诉 WordPress 流量是经过代理进入的,在文件中添加以下代码:

/* 强制开启 HTTPS 检测 */ if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
    $_SERVER['HTTPS'] = 'on';
}

🚨 避免重定向循环的关键提示:

一个常见问题是当你在 wp-config.php 中同时设置 WP_HOMEWP_SITEURL 为 https 时,可能导致重定向循环。这是因为:

  1. Tunnel 将请求以 HTTP 协议转发到本地 WordPress
  2. WordPress 检测到非 HTTPS,尝试重定向到 HTTPS 域名
  3. 请求再次通过 Cloudflare 进入,形成无限循环

✅ 正确做法:添加上述 $_SERVER['HTTPS'] = 'on'; 代码,让 WordPress 知道实际上用户已经在使用 HTTPS 访问,而保持 WP_SITEURLWP_HOME 使用 http 协议指向本地。

🌐 设置站点地址

在 WordPress 后台的「设置」中,将 WordPress 地址 (URL)站点地址 (URL) 都改为你的正式域名(如 https://www.yourdomain.com)。

💡 数据库层面的备用方案:

如果你无法访问后台,也可以通过直接修改数据库来设置站点地址:

UPDATE wp_options SET option_value = 'https://www.yourdomain.com' WHERE option_name = 'siteurl';
UPDATE wp_options SET option_value = 'https://www.yourdomain.com' WHERE option_name = 'home';

四、部署建议

为了最简化管理,建议在本地使用 Docker Compose 同时运行 WordPress 和 Cloudflare Tunnel。

📦 示例 docker-compose.yml 结构

  • db: MySQL/MariaDB 数据库
  • wordpress: 网站主体
  • cloudflared: 运行 Tunnel 客户端,将请求转发给 wordpress 容器

🆕 完整的生产级 docker-compose.yml 示例(2025年最佳实践):

version: '3.8'

services:
  # Cloudflare Tunnel 服务
  tunnel:
    image: cloudflare/cloudflared:latest
    restart: unless-stopped
    command: tunnel run
    environment:
      - TUNNEL_TOKEN=你的隧道令牌  # 从 Cloudflare Zero Trust 控制台获取
    depends_on:
      - wordpress

  # MariaDB 数据库
  db:
    image: mariadb:10.11
    command: '--default-authentication-plugin=mysql_native_password'
    volumes:
      - db_data:/var/lib/mysql
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=生成一个强密码
      - MYSQL_DATABASE=wordpress
      - MYSQL_USER=wordpress
      - MYSQL_PASSWORD=生成另一个强密码
    # 注意:不再需要 expose 端口到主机

  # WordPress 主服务
  wordpress:
    image: wordpress:latest
    volumes:
      - wp_data:/var/www/html
    restart: always
    environment:
      - WORDPRESS_DB_HOST=db
      - WORDPRESS_DB_USER=wordpress
      - WORDPRESS_DB_PASSWORD=与上面的 MYSQL_PASSWORD 保持一致
      - WORDPRESS_DB_NAME=wordpress
    depends_on:
      - db
    # 注意:不需要暴露端口到主机,仅需容器间通信

volumes:
  db_data:
  wp_data:

⚙️ 关键配置说明:

  1. 无需暴露端口:由于使用 Tunnel,WordPress 容器无需将端口映射到主机。流量完全在 Docker 内部网络中流转。
  2. Tunnel 配置指向容器名:在 Cloudflare Zero Trust 控制台配置 Tunnel 时,服务地址应设置为 http://wordpress:80(而非 localhost),因为在 Docker Compose 网络中,容器可以通过服务名互相访问。
  3. 强烈建议更改默认的数据库用户名、密码和数据库名称,以增强安全性。

🔑 获取 Tunnel Token 的步骤:

  1. 登录 Cloudflare Dashboard
  2. 进入「Zero Trust」→「Networks」→「Tunnels」
  3. 点击「Create a tunnel」,选择「Cloudflared」类型
  4. 为隧道命名(如 "wordpress-tunnel")
  5. 选择 Docker 作为安装方式,复制生成的 Token
  6. 配置 Public Hostname,将你的域名指向 http://wordpress:80

五、进阶安全建议(针对 WordPress)

既然你已经接入了 Cloudflare,强烈建议开启以下功能:

🔥 WAF 规则

在 Cloudflare 后台开启 WordPress 专用防护规则。

📊 Cloudflare WAF 托管规则详解:

Cloudflare 提供多层 WAF 防护,包括:

规则集说明计划要求
Cloudflare Managed Ruleset由 Cloudflare 安全团队维护,快速应对新漏洞Pro 及以上
OWASP Core Ruleset基于 OWASP CRS v3.x,提供行业标准防护Pro 及以上
WordPress 专用规则使用 "wordpress" 标签的规则,专门防护 WP 漏洞Pro 及以上

🎚️ OWASP 规则集配置建议:

  • Paranoia Level(偏执级别):建议从 PL1 开始,逐步提升。更高级别防护更严格,但可能导致误报
  • Score Threshold(分数阈值)
    • Low (60):最宽松,适合初期测试
    • Medium (40):推荐的生产环境设置
    • High (25):最严格,可能阻止部分正常流量

⚠️ 重要提醒:2025年6月15日起,旧版 WAF 托管规则 API 已停止支持。如果你使用 Terraform 管理 Cloudflare 配置,请确保更新到新版资源。

📋 Page Rules

针对 /wp-admin 后台设置访问限制(例如仅允许你自己的 IP 访问,或者再加一层 Cloudflare Access 验证)。

🛡️ WordPress 管理后台推荐 Page Rule 配置:

创建一个针对 yourdomain.com/wp-admin/ 的 Page Rule,启用以下设置:

  • Security Level: High(提高安全等级)
  • Cache Level: Bypass(管理后台不应被缓存)
  • Disable Apps: 是(禁用 Cloudflare 应用)
  • Disable Performance: 是(禁用 Minify、Rocket Loader、Mirage、Polish 等优化功能,这些仅应用于前端)

🔐 使用 Cloudflare Zero Trust Access 保护后台(强烈推荐):

相比简单的 IP 限制,Cloudflare Zero Trust 提供了更强大、更灵活的身份验证访问控制:

工作原理:

  • 在用户看到 WordPress 登录页面之前,先通过 Cloudflare 的身份验证关卡
  • 彻底阻止暴力破解攻击——攻击者甚至无法触及 wp-login.php
  • 消除机器人流量对服务器资源的消耗

配置步骤:

  1. 进入 Cloudflare Zero Trust 控制台
  2. 选择「Access」→「Applications」→「Add an application」
  3. 选择「Self-hosted」类型
  4. 配置 Application 名称和域名(如 yourdomain.com/wp-admin
  5. 创建 Access Policy,设置访问规则:
    • Include:允许特定邮箱域名(如 @yourdomain.com
    • Require:可选,强制要求 MFA(多因素认证)
    • Exclude:可选,排除特定条件

认证方式选择:

  • One-Time Pin (OTP):通过邮箱发送一次性验证码(免费且简单)
  • Google / Azure AD / Okta:集成企业身份提供商
  • 硬件密钥:支持 FIDO2 安全密钥

💡 进阶技巧:同时为 /wp-login.php/xmlrpc.php 创建 Access 策略,全面保护 WordPress 入口点。

🚦 速率限制(Rate Limiting)

针对登录页面设置请求频率限制,防止暴力破解攻击:

推荐配置:

  • 路径/wp-login.php
  • 阈值:每分钟 10 次请求
  • 动作:Block 1 小时
  • 备注:Rate Limiting 规则现已在所有 Cloudflare 计划中无限量提供

六、故障排除指南

🔧 常见问题与解决方案:

问题原因解决方案
样式加载失败/页面错乱HTTPS 检测问题添加 $_SERVER['HTTPS'] = 'on'; 到 wp-config.php
无限重定向循环WP_HOME/WP_SITEURL 配置冲突保持这两个值使用 http,仅依赖 $_SERVER['HTTPS'] 设置
Tunnel 连接被拒绝Docker 网络配置错误确保使用容器名(如 http://wordpress)而非 localhost
后台无法登录Cookie 域名不匹配检查站点地址设置是否正确指向公网域名
Zero Trust 页面不显示DNS 记录未代理确保 DNS 记录状态为「Proxied」(橙色云朵)

✅ 总结

Cloudflare Tunnel 和 WordPress 是"黄金搭档"。你只需要准备好域名,在本地把 WordPress 跑起来,然后用一条 Tunnel 命令映射出去即可。不需要折腾复杂的路由器端口转发或证书申请。

🎁 使用 Cloudflare Tunnel 的核心优势回顾:

优势说明
🔒 零端口暴露无需在路由器上开放任何端口
🌐 全球 CDN 加速自动利用 Cloudflare 遍布全球的边缘节点
🛡️ 企业级安全DDoS 防护、WAF、Bot 管理开箱即用
📜 自动 SSL无需手动申请或续期证书
🆓 免费使用Tunnel 本身完全免费
配置简单比传统方案减少 90% 的配置步骤