上一篇 下一篇 分享链接 返回 返回顶部

站长实战:用 Docker 部署 Cloudflare Tunnel,隐藏源站 IP 并安全建站

发布人:慈云数据-客服中心 发布时间:5小时前 阅读量:4

Cloudflare Docker部署教程|适合站长

在网站建设和运维过程中,站长经常会遇到几个绕不开的问题:如何隐藏源站 IP、如何提升网站访问速度、如何降低被恶意攻击的风险、如何更方便地管理 HTTPS 证书,以及如何让海外或多地区用户访问更稳定。Cloudflare 作为全球知名的 CDN、安全防护和 DNS 服务平台,正好可以解决其中很多问题。

不过,很多站长在使用 Cloudflare 时,通常只停留在“把域名接入 Cloudflare”“开启小云朵代理”“配置 SSL”这些基础操作上。实际上,Cloudflare 还提供了非常实用的隧道服务 Cloudflare Tunnel,可以让站长通过 Docker 在服务器上快速部署 cloudflared,将本地网站、安全地暴露到公网,而无需开放服务器端口,也可以在一定程度上隐藏源站 IP。

本文将以站长实际使用场景为核心,详细介绍如何通过 Docker 部署 Cloudflare Tunnel,并将网站服务通过 Cloudflare 安全访问。无论你是个人博客站长、企业官网维护者,还是运行多个站点的服务器管理员,都可以参考本教程完成部署。


一、Cloudflare Docker部署适合哪些站长?

在开始之前,我们先明确一下本文所说的“Cloudflare Docker部署”主要指的是:

使用 Docker 部署 Cloudflare 官方客户端 cloudflared,通过 Cloudflare Tunnel 将服务器上的 Web 服务映射到域名,实现安全访问。

这种方式适合以下几类站长:

  1. 不想暴露源站 IP 的站长
    传统部署方式下,站点通常需要在服务器上开放 80、443 等端口。如果源站 IP 泄露,可能会被直接攻击。使用 Cloudflare Tunnel 后,访问流量先进入 Cloudflare,再通过加密隧道回源,源站无需直接对公网开放 Web 端口。

  2. 使用家庭宽带或内网服务器建站的用户
    如果你的网站部署在家用 NAS、内网服务器、软路由、开发机上,没有公网 IP 或无法配置端口转发,可以通过 Cloudflare Tunnel 实现公网访问。

  3. 希望简化 HTTPS 证书配置的站长
    Cloudflare 可以在边缘节点提供 HTTPS。源站与 Cloudflare Tunnel 之间通过安全连接通信,减少手动配置证书的复杂度。

  4. 多个站点统一管理的运维人员
    Docker 部署方式更方便迁移、升级和管理。对于多站点、多服务场景,可以结合 Docker Compose 进行统一编排。

  5. 重视安全但不想复杂配置防火墙的用户
    Tunnel 模式下服务器不需要直接暴露 Web 端口,配合 Cloudflare WAF、防火墙规则、访问控制等功能,可以显著提升安全性。


二、准备工作

在正式部署前,你需要准备以下内容。

1. 一个 Cloudflare 账号

如果还没有账号,可以访问 Cloudflare 官网注册:

https://www.cloudflare.com/

注册完成后,需要将你的域名添加到 Cloudflare,并按照提示修改域名注册商处的 DNS 服务器,也就是 NS 记录。

例如,Cloudflare 会分配类似下面的 NS:

ada.ns.cloudflare.com
tom.ns.cloudflare.com

你需要登录域名注册商后台,将原来的 DNS 服务器替换成 Cloudflare 提供的这两个地址。等待 DNS 生效后,域名才算正式接入 Cloudflare。


2. 一台已安装 Docker 的服务器

本文默认你已经有一台 Linux 服务器,例如:

  • Ubuntu 20.04 / 22.04 / 24.04
  • Debian 11 / 12
  • CentOS / Rocky Linux / AlmaLinux
  • 其他支持 Docker 的系统

如果还没有安装 Docker,可以使用以下命令快速安装。

Ubuntu / Debian:

curl -fsSL https://get.docker.com | bash

安装完成后,启动 Docker:

systemctl enable docker
systemctl start docker

查看 Docker 是否安装成功:

docker -v

如果能看到类似输出,说明安装成功:

Docker version 26.x.x, build xxxxx

建议同时安装 Docker Compose:

docker compose version

如果没有安装,可根据系统环境安装插件版本的 Docker Compose。


3. 一个已经运行的网站服务

Cloudflare Tunnel 本身不是网站程序,它只是负责把服务器上的服务安全地转发到 Cloudflare。

你可以已经有以下服务之一:

  • Nginx 网站
  • Apache 网站
  • WordPress
  • Typecho
  • Halo
  • Ghost
  • 宝塔面板网站
  • Docker 部署的网站服务
  • 本地运行在某个端口的 Web 应用

例如,你的网站服务在服务器本地运行:

http://localhost:8080

后续我们会把域名绑定到这个服务。


三、Cloudflare Tunnel 的工作原理

很多站长在部署前会疑惑:为什么不开放端口,也能访问网站?

简单来说,Cloudflare Tunnel 的原理是:

  1. 服务器上运行 cloudflared 客户端;
  2. cloudflared 主动向 Cloudflare 建立加密连接;
  3. 用户访问你的域名;
  4. 请求先到 Cloudflare;
  5. Cloudflare 通过已建立的隧道,把请求转发到你的服务器本地服务;
  6. 服务器响应后,再通过隧道返回给用户。

由于连接是由服务器主动发起到 Cloudflare 的,所以服务器不需要暴露 80、443 端口。只要服务器能访问互联网,就可以建立隧道。

这对站长来说非常有价值:

  • 降低源站暴露风险;
  • 减少端口开放;
  • 可以穿透 NAT;
  • 方便迁移服务器;
  • 适合 Docker 化管理;
  • 配合 Cloudflare 安全功能更完善。

四、创建 Cloudflare Tunnel

接下来进入实操部分。

1. 登录 Cloudflare Zero Trust 后台

打开:

https://one.dash.cloudflare.com/

首次进入可能需要创建 Team 名称,按照提示填写即可。

进入后台后,依次点击:

Networks → Tunnels

然后点击:

Create a tunnel

Cloudflare 可能会提供两种方式:

  • Cloudflared
  • WARP Connector

这里选择:

Cloudflared

2. 设置 Tunnel 名称

给隧道起一个容易识别的名称,例如:

my-website-tunnel

如果你有多个服务器,也可以按服务器用途命名:

blog-server
company-site
nas-home
docker-web-01

命名建议简单清晰,便于后续维护。


3. 获取 Docker 部署命令

创建 Tunnel 后,Cloudflare 会显示多种安装方式,包括:

  • Debian
  • Red Hat
  • Docker
  • Windows
  • macOS

这里选择 Docker。

你会看到类似下面的命令:

docker run cloudflare/cloudflared:latest tunnel --no-autoupdate run --token xxxxxxxxxxxxxxxxx

其中 --token 后面的一长串字符串,就是这个 Tunnel 的连接令牌。

注意:Token 非常重要,不要公开泄露。任何人拿到 Token,都可能连接你的隧道。


五、使用 Docker 运行 cloudflared

最简单的部署方式,就是直接运行 Cloudflare 提供的 Docker 命令。

1. 直接运行容器

在服务器终端执行:

docker run -d \
  --name cloudflared \
  --restart unless-stopped \
  cloudflare/cloudflared:latest \
  tunnel --no-autoupdate run --token 你的TOKEN

参数说明:

参数 说明
-d 后台运行容器
--name cloudflared 容器名称
--restart unless-stopped 容器异常退出或服务器重启后自动启动
cloudflare/cloudflared:latest 使用官方 cloudflared 镜像
tunnel --no-autoupdate run 启动 Tunnel
--token Cloudflare Tunnel 连接令牌

运行后查看容器状态:

docker ps

如果看到 cloudflared 容器正在运行,说明第一步成功。

查看日志:

docker logs -f cloudflared

如果日志中没有明显报错,并且 Cloudflare 后台显示 Connector 已连接,说明隧道已经正常建立。


六、配置域名访问网站

隧道运行成功后,还需要配置 Public Hostname,也就是把某个域名或子域名绑定到你的本地服务。

1. 添加 Public Hostname

在 Cloudflare Zero Trust 后台中进入刚才创建的 Tunnel,找到:

Public Hostnames

点击:

Add a public hostname

填写如下内容:

配置项 示例 说明
Subdomain www 子域名,可为空
Domain example.com 你的主域名
Path 留空 一般不填
Type HTTP 服务类型
URL localhost:8080 本地服务地址

如果你希望访问:

https://www.example.com

转发到服务器本地:

http://localhost:8080

那么就填写:

Subdomain: www
Domain: example.com
Type: HTTP
URL: localhost:8080

保存后,Cloudflare 会自动创建对应的 DNS 记录。


2. 根域名配置

如果你想让根域名也能访问,例如:

https://example.com

则添加 Public Hostname 时:

Subdomain: 留空
Domain: example.com
Type: HTTP
URL: localhost:8080

这样根域名就会指向本地服务。


3. 多站点配置示例

如果一台服务器运行多个网站,可以配置多个 Public Hostname。

例如:

域名 本地服务
blog.example.com localhost:8080
api.example.com localhost:3000
admin.example.com localhost:9000
status.example.com localhost:5000

只要你的服务器本地服务端口不同,就可以通过同一个 Tunnel 暴露多个服务。


七、使用 Docker Compose 部署 cloudflared

对于站长来说,如果服务较多,建议使用 Docker Compose 管理,后续维护会更方便。

1. 创建目录

mkdir -p /opt/cloudflared
cd /opt/cloudflared

2. 创建 docker-compose.yml

nano docker-compose.yml

写入以下内容:

services:
  cloudflared:
    image: cloudflare/cloudflared:latest
    container_name: cloudflared
    restart: unless-stopped
    command: tunnel --no-autoupdate run --token 你的TOKEN

保存后启动:

docker compose up -d

查看状态:

docker compose ps

查看日志:

docker compose logs -f

如果后续要停止:

docker compose down

如果要更新镜像:

docker compose pull
docker compose up -d

Docker Compose 的好处是配置文件清晰,便于备份和迁移。站长更换服务器时,只需要重新部署 Docker、复制配置文件,再启动即可。


八、Docker 网络场景下的服务访问

很多站长的网站本身也是 Docker 部署的,比如 WordPress、Halo、Nginx、Node.js 应用等。这时需要注意:cloudflared 容器里的 localhost 指的是 cloudflared 容器自身,而不是宿主机,也不是其他容器。

因此,如果你的网站服务也在 Docker 容器中,建议把它们放到同一个 Docker 网络里,通过容器名访问。

1. 创建 Docker 网络

docker network create webnet

2. 示例:Nginx 与 cloudflared 同网络

假设你有一个 Nginx 容器:

docker run -d \
  --name my-nginx \
  --network webnet \
  nginx:latest

运行 cloudflared 时也加入同一个网络:

docker run -d \
  --name cloudflared \
  --network webnet \
  --restart unless-stopped \
  cloudflare/cloudflared:latest \
  tunnel --no-autoupdate run --token 你的TOKEN

然后在 Cloudflare Public Hostname 中填写:

Type: HTTP
URL: my-nginx:80

这样 Cloudflare Tunnel 会把流量转发到同一 Docker 网络下的 my-nginx 容器。


3. Docker Compose 多服务示例

下面是一个更完整的示例,适合站长参考:

services:
  nginx:
    image: nginx:latest
    container_name: site-nginx
    restart: unless-stopped
    networks:
      - webnet

  cloudflared:
    image: cloudflare/cloudflared:latest
    container_name: cloudflared
    restart: unless-stopped
    command: tunnel --no-autoupdate run --token 你的TOKEN
    networks:
      - webnet

networks:
  webnet:
    driver: bridge

此时 Public Hostname 可以填写:

URL: site-nginx:80

如果你的 WordPress、Halo、Typecho 等程序也是 Docker 部署,同样可以通过容器名和端口转发。


九、SSL/TLS 配置建议

Cloudflare 接入网站后,SSL/TLS 配置非常关键。配置不当可能导致:

  • 无限重定向;
  • HTTPS 访问失败;
  • 浏览器提示证书错误;
  • 后台登录异常;
  • WordPress 资源加载混乱。

进入 Cloudflare 域名面板:

SSL/TLS → Overview

常见模式包括:

模式 说明
Off 不启用 HTTPS,不推荐
Flexible 用户到 Cloudflare 是 HTTPS,Cloudflare 到源站是 HTTP
Full 用户到 Cloudflare 是 HTTPS,Cloudflare 到源站可使用自签证书
Full Strict 要求源站证书有效

对于 Tunnel 场景,如果 Public Hostname 使用的是 HTTP 本地服务,例如:

localhost:8080

通常可以正常使用 Cloudflare 提供的 HTTPS 访问用户侧域名。

但如果你同时在源站 Nginx 中做了 HTTPS 跳转,需要注意避免重复跳转。站长常见建议是:

  1. 用户访问层使用 Cloudflare HTTPS;
  2. 源站本地服务可保持 HTTP;
  3. 如果源站应用识别 HTTPS 异常,需要配置反向代理头;
  4. WordPress 等程序要正确设置站点 URL 为 https://你的域名

十、安全配置建议

Cloudflare Tunnel 虽然可以减少源站暴露,但不代表网站就绝对安全。站长还应结合 Cloudflare 的安全功能进行配置。

1. 开启 WAF

进入 Cloudflare 域名后台:

Security → WAF

可以启用托管规则,拦截常见攻击,例如:

  • SQL 注入;
  • XSS;
  • 恶意扫描;
  • WordPress 常见漏洞探测;
  • 可疑爬虫请求。

对于 WordPress 站点,建议重点关注后台登录路径:

/wp-login.php
/wp-admin

可以添加防火墙规则,限制国家、IP 或启用 JS Challenge。


2. 配置速率限制

如果你的网站经常被刷接口、刷搜索、刷登录,可以使用 Rate Limiting。

例如限制登录接口:

当访问 /wp-login.php 的请求频率过高时,执行 Managed Challenge

对于 API 服务,也可以根据路径进行限制:

/api/
/login
/search

这样可以减少暴力破解和恶意消耗资源。


3. 保护后台入口

如果你有管理后台,例如:

admin.example.com

建议使用 Cloudflare Access 增加登录验证。只有通过指定邮箱、验证码、身份提供商认证的用户,才能访问后台。

进入 Zero Trust 后台:

Access → Applications

创建应用后,可以设置允许访问的邮箱,例如:

admin@example.com

这对站长后台、数据库管理面板、监控面板、内网服务非常实用。


4. 不要暴露敏感端口

即使使用 Cloudflare Tunnel,也建议检查服务器防火墙,仅开放必要端口。

如果你的网站完全通过 Tunnel 访问,理论上可以关闭公网 80、443 端口,只保留 SSH 端口,并限制 SSH 登录来源。

常用防火墙工具:

ufw
firewalld
iptables

Ubuntu 可以使用:

ufw allow ssh
ufw enable
ufw status

如需更安全,可以修改 SSH 端口、禁用密码登录、使用密钥登录。


十一、常见问题排查

1. Cloudflare 后台显示 Tunnel 未连接

可以先查看容器是否运行:

docker ps

查看日志:

docker logs -f cloudflared

常见原因包括:

  • Token 填写错误;
  • 服务器无法访问 Cloudflare;
  • Docker 没有正常启动;
  • 容器启动后立即退出;
  • 系统时间异常;
  • 防火墙阻止了出站连接。

解决思路:

docker restart cloudflared

或重新复制 Cloudflare 后台提供的 Docker 命令。


2. 访问域名显示 502 或 1033

常见原因是 Cloudflare 隧道能连接,但找不到后端服务。

检查 Public Hostname 中填写的 URL 是否正确,例如:

localhost:8080

如果服务在 Docker 容器里,不要盲目使用 localhost,应改成容器名:

site-nginx:80

并确保 cloudflared 与网站容器在同一个 Docker 网络。


3. 网站能打开,但样式丢失

通常是网站程序的站点地址配置不正确,或者 HTTP/HTTPS 混用。

以 WordPress 为例,需要在后台设置:

WordPress 地址:https://www.example.com
站点地址:https://www.example.com

也可以检查数据库中的 siteurlhome


4. 后台登录无限跳转

可能是应用没有正确识别 HTTPS。可以检查反向代理头,例如:

X-Forwarded-Proto
X-Forwarded-For
Host

部分程序需要在配置文件中启用反向代理模式。WordPress 可根据实际环境在 wp-config.php 中增加 HTTPS 判断逻辑。


5. Docker 容器无法访问宿主机服务

如果网站服务运行在宿主机,而 cloudflared 在 Docker 容器中,localhost 不一定指向宿主机。

Linux 下可以尝试使用宿主机网关地址,或在 Docker 运行时添加:

--add-host=host.docker.internal:host-gateway

示例:

docker run -d \
  --name cloudflared \
  --restart unless-stopped \
  --add-host=host.docker.internal:host-gateway \
  cloudflare/cloudflared:latest \
  tunnel --no-autoupdate run --token 你的TOKEN

然后 Public Hostname 中填写:

host.docker.internal:8080

十二、站长部署建议

对于长期维护网站的站长,建议不要只追求“能访问”,还要从稳定性、安全性和可维护性出发。

1. 使用 Docker Compose 管理

相比直接 docker run,Docker Compose 更适合长期维护。配置文件可以备份到私有仓库或云盘,迁移服务器时也更方便。

2. 定期更新 cloudflared 镜像

可以定期执行:

docker compose pull
docker compose up -d

保持 cloudflared 客户端更新,有助于获得更好的稳定性和安全性。

3. 监控容器状态

可以使用简单命令查看:

docker ps
docker logs cloudflared

也可以部署 Uptime Kuma、ServerStatus、Prometheus 等监控工具,对站点访问状态进行监控。

4. 备份配置

需要重点备份:

  • docker-compose.yml
  • 网站程序文件;
  • 数据库;
  • Nginx 配置;
  • Cloudflare Tunnel 名称和绑定域名信息;
  • 服务器防火墙规则。

虽然 Tunnel Token 可以重新生成,但配置丢失会增加恢复成本。

5. 谨慎公开后台服务

不要因为 Tunnel 使用方便,就把所有后台都直接暴露到公网。对于数据库管理、服务器面板、监控面板、文件管理器等服务,建议配合 Cloudflare Access 做身份验证。


十三、完整部署流程总结

如果你想快速回顾整个流程,可以按下面步骤执行:

  1. 注册 Cloudflare 账号;
  2. 将域名 NS 接入 Cloudflare;
  3. 在服务器安装 Docker;
  4. 确认网站服务本地可访问;
  5. 进入 Cloudflare Zero Trust;
  6. 创建 Cloudflare Tunnel;
  7. 复制 Docker Token 命令;
  8. 使用 Docker 或 Docker Compose 启动 cloudflared
  9. 在 Public Hostname 中绑定域名和本地服务;
  10. 测试域名访问;
  11. 配置 SSL/TLS、安全规则、WAF;
  12. 关闭不必要的公网端口;
  13. 定期维护和更新。

十四、结语

对于站长来说,Cloudflare 不只是一个 CDN 或 DNS 解析平台。结合 Docker 部署 Cloudflare Tunnel 后,它可以成为网站安全访问、源站隐藏、内网穿透、多站点管理的重要工具。

相比传统开放端口、手动配置反向代理和证书的方式,Cloudflare Tunnel 的优势非常明显:部署简单、维护方便、安全性更高,并且非常适合 Docker 化环境。无论你的网站运行在云服务器、家用 NAS、内网主机,还是多个容器服务中,都可以通过这种方式快速对外提供 HTTPS 访问。

当然,任何工具都不是万能的。Cloudflare Tunnel 能减少源站暴露,但网站程序本身仍然需要及时更新,数据库和后台入口仍然需要保护,服务器权限和备份策略也不能忽视。真正稳定的网站运维,应该是 CDN、安全规则、容器管理、数据备份、监控告警共同配合的结果。

如果你是个人站长,建议先从一个测试子域名开始部署,确认访问、跳转、HTTPS 和后台登录都正常后,再迁移正式站点。熟悉流程后,你会发现 Cloudflare Docker 部署不仅简单,而且非常适合长期维护多个网站服务。

目录结构
全文