站长实战:用 Docker 部署 Cloudflare Tunnel,隐藏源站 IP 并安全建站
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 服务映射到域名,实现安全访问。
这种方式适合以下几类站长:
-
不想暴露源站 IP 的站长
传统部署方式下,站点通常需要在服务器上开放 80、443 等端口。如果源站 IP 泄露,可能会被直接攻击。使用 Cloudflare Tunnel 后,访问流量先进入 Cloudflare,再通过加密隧道回源,源站无需直接对公网开放 Web 端口。 -
使用家庭宽带或内网服务器建站的用户
如果你的网站部署在家用 NAS、内网服务器、软路由、开发机上,没有公网 IP 或无法配置端口转发,可以通过 Cloudflare Tunnel 实现公网访问。 -
希望简化 HTTPS 证书配置的站长
Cloudflare 可以在边缘节点提供 HTTPS。源站与 Cloudflare Tunnel 之间通过安全连接通信,减少手动配置证书的复杂度。 -
多个站点统一管理的运维人员
Docker 部署方式更方便迁移、升级和管理。对于多站点、多服务场景,可以结合 Docker Compose 进行统一编排。 -
重视安全但不想复杂配置防火墙的用户
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 的原理是:
- 服务器上运行
cloudflared客户端; cloudflared主动向 Cloudflare 建立加密连接;- 用户访问你的域名;
- 请求先到 Cloudflare;
- Cloudflare 通过已建立的隧道,把请求转发到你的服务器本地服务;
- 服务器响应后,再通过隧道返回给用户。
由于连接是由服务器主动发起到 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 跳转,需要注意避免重复跳转。站长常见建议是:
- 用户访问层使用 Cloudflare HTTPS;
- 源站本地服务可保持 HTTP;
- 如果源站应用识别 HTTPS 异常,需要配置反向代理头;
- 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
也可以检查数据库中的 siteurl 和 home。
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 做身份验证。
十三、完整部署流程总结
如果你想快速回顾整个流程,可以按下面步骤执行:
- 注册 Cloudflare 账号;
- 将域名 NS 接入 Cloudflare;
- 在服务器安装 Docker;
- 确认网站服务本地可访问;
- 进入 Cloudflare Zero Trust;
- 创建 Cloudflare Tunnel;
- 复制 Docker Token 命令;
- 使用 Docker 或 Docker Compose 启动
cloudflared; - 在 Public Hostname 中绑定域名和本地服务;
- 测试域名访问;
- 配置 SSL/TLS、安全规则、WAF;
- 关闭不必要的公网端口;
- 定期维护和更新。
十四、结语
对于站长来说,Cloudflare 不只是一个 CDN 或 DNS 解析平台。结合 Docker 部署 Cloudflare Tunnel 后,它可以成为网站安全访问、源站隐藏、内网穿透、多站点管理的重要工具。
相比传统开放端口、手动配置反向代理和证书的方式,Cloudflare Tunnel 的优势非常明显:部署简单、维护方便、安全性更高,并且非常适合 Docker 化环境。无论你的网站运行在云服务器、家用 NAS、内网主机,还是多个容器服务中,都可以通过这种方式快速对外提供 HTTPS 访问。
当然,任何工具都不是万能的。Cloudflare Tunnel 能减少源站暴露,但网站程序本身仍然需要及时更新,数据库和后台入口仍然需要保护,服务器权限和备份策略也不能忽视。真正稳定的网站运维,应该是 CDN、安全规则、容器管理、数据备份、监控告警共同配合的结果。
如果你是个人站长,建议先从一个测试子域名开始部署,确认访问、跳转、HTTPS 和后台登录都正常后,再迁移正式站点。熟悉流程后,你会发现 Cloudflare Docker 部署不仅简单,而且非常适合长期维护多个网站服务。