Cloudflare 不能私有化?这套一键部署方案给你平替架构
Cloudflare 私有化部署方案|一键部署
在企业上云、出海业务、内部系统统一接入以及多地域访问加速的场景中,Cloudflare 常常被作为一套“边缘安全与加速平台”来使用。它提供了 DNS 托管、CDN 加速、WAF 防护、DDoS 缓解、HTTPS 证书、访问控制、Zero Trust、隧道接入、边缘缓存等能力。对于大多数互联网业务而言,Cloudflare 的托管式服务非常方便,接入成本也较低。
但是,在一些特殊场景下,企业可能无法直接使用公有 Cloudflare 服务,例如:
- 数据合规要求较高,流量不能经过第三方公网平台;
- 内部系统需要在专有云、私有云或本地机房中统一接入;
- 对 DNS、证书、访问控制、日志审计有完全自主可控要求;
- 希望搭建一套类似 Cloudflare 的边缘代理、安全防护和加速平台;
- 需要在离线环境、内网环境、政企专网中部署统一网关。
需要提前说明的是:Cloudflare 本身是商业化 SaaS 平台,并不提供完整的“私有化部署版本”供用户直接安装。 因此,本文所说的“Cloudflare 私有化部署方案”,并不是把官方 Cloudflare 原样部署到本地,而是基于开源组件组合搭建一套“类 Cloudflare 能力”的私有化边缘网关平台。
本文将围绕私有化部署架构、核心组件选型、功能映射、一键部署脚本、Docker Compose 示例、安全配置、运维建议等内容展开,帮助你快速构建一套可落地的私有化 Cloudflare 替代方案。
一、方案目标
本方案的目标是构建一套可私有化部署的统一入口平台,具备以下能力:
-
反向代理能力
支持 HTTP、HTTPS、WebSocket、gRPC 等流量转发。 -
HTTPS 自动化管理
支持自签证书、内部 CA 证书,也可对接 ACME 自动签发证书。 -
域名统一接入
支持通过不同域名、子域名、路径规则转发到不同后端服务。 -
基础 WAF 防护
支持常见 Web 攻击拦截,如 SQL 注入、XSS、路径穿越、恶意 User-Agent 等。 -
访问控制
支持 IP 白名单、黑名单、基础认证、OAuth2/OIDC 单点登录等。 -
缓存加速
对静态资源进行缓存,提高访问速度,减少源站压力。 -
日志与监控
采集访问日志、错误日志、性能指标,并接入可视化平台。 -
一键部署
使用 Docker Compose 或 Shell 脚本快速部署,降低实施难度。
二、整体架构设计
一套私有化“类 Cloudflare”平台通常可以分为以下几层:
用户请求
|
v
DNS / 内部域名解析
|
v
边缘入口网关
|
|-- HTTPS 终止
|-- WAF 防护
|-- 访问控制
|-- 缓存加速
|-- 限流熔断
|-- 日志采集
|
v
后端业务服务
在实际部署中,可以采用如下组件组合:
| 能力模块 | 推荐组件 |
|---|---|
| 反向代理 / 入口网关 | Nginx、OpenResty、Traefik、Caddy |
| WAF 防护 | ModSecurity、Coraza、OpenResty Lua WAF |
| HTTPS 证书 | ACME、Let’s Encrypt、step-ca、内部 CA |
| DNS 服务 | CoreDNS、PowerDNS、Bind9 |
| 身份认证 | Authelia、OAuth2 Proxy、Keycloak |
| 缓存加速 | Nginx Cache、Varnish |
| 日志采集 | Fluent Bit、Vector、Filebeat |
| 指标监控 | Prometheus、Grafana |
| 可视化面板 | Grafana、Nginx Proxy Manager、Traefik Dashboard |
为了保证部署简单,本文推荐使用以下组合:
- OpenResty / Nginx:作为核心反向代理网关;
- ModSecurity + OWASP CRS:提供基础 WAF 能力;
- Authelia:提供统一身份认证与访问控制;
- Prometheus + Grafana:提供监控和可视化;
- Docker Compose:实现一键部署;
- CoreDNS:可选,用于内网 DNS 管理。
三、Cloudflare 能力与私有化组件映射
下面是 Cloudflare 常见功能与私有化替代组件的对应关系:
| Cloudflare 功能 | 私有化替代方案 |
|---|---|
| DNS 托管 | CoreDNS / PowerDNS / Bind9 |
| CDN 加速 | Nginx Cache / Varnish / 多节点网关 |
| SSL/TLS | Nginx + ACME / 内部 CA |
| WAF | ModSecurity + OWASP CRS |
| DDoS 防护 | 防火墙 / 云清洗 / Anycast / 限流 |
| Zero Trust | Authelia / Keycloak / OAuth2 Proxy |
| Access | Authelia + Nginx auth_request |
| Tunnel | frp / rathole / WireGuard / Cloudflare Tunnel 替代 |
| Bot 防护 | WAF 规则 / JS Challenge / 速率限制 |
| Analytics | Prometheus + Grafana + 日志平台 |
| Page Rules | Nginx location / Traefik Middleware |
| Workers | OpenResty Lua / Nginx njs / Envoy WASM |
需要注意,私有化方案可以覆盖大量常规能力,但如果要达到 Cloudflare 全球 Anycast 网络、超大规模 DDoS 清洗、边缘计算生态和全球 CDN 节点覆盖能力,则需要极高的网络、带宽和运维投入。对于企业内部系统、专有云统一入口、中小规模业务加速和安全防护来说,本文方案已经具备较强实用价值。
四、部署环境要求
建议准备一台或多台 Linux 服务器,基础要求如下:
1. 单节点测试环境
| 配置项 | 建议 |
|---|---|
| CPU | 2 核及以上 |
| 内存 | 4GB 及以上 |
| 磁盘 | 40GB 及以上 |
| 系统 | Ubuntu 22.04 / Debian 12 / Rocky Linux 9 |
| 网络 | 开放 80、443、9090、3000 等端口 |
2. 生产环境建议
| 配置项 | 建议 |
|---|---|
| CPU | 4 核及以上 |
| 内存 | 8GB 及以上 |
| 磁盘 | SSD 100GB 及以上 |
| 网络 | 独立公网 IP 或内网 VIP |
| 高可用 | 至少 2 台网关节点 |
| 负载均衡 | LVS / HAProxy / 云 LB |
| 日志存储 | 单独日志服务器或对象存储 |
| 监控告警 | Prometheus + Alertmanager |
五、目录结构设计
为了方便维护,建议项目目录如下:
cloudflare-private/
├── docker-compose.yml
├── .env
├── nginx/
│ ├── nginx.conf
│ ├── conf.d/
│ │ ├── app.example.com.conf
│ │ └── auth.conf
│ ├── certs/
│ ├── cache/
│ └── logs/
├── modsecurity/
│ ├── modsecurity.conf
│ └── crs/
├── authelia/
│ ├── configuration.yml
│ └── users_database.yml
├── prometheus/
│ └── prometheus.yml
├── grafana/
│ └── data/
└── scripts/
├── install.sh
├── start.sh
├── stop.sh
└── reload.sh
这样的目录结构清晰地将网关配置、WAF 配置、身份认证配置、监控配置和运维脚本分开,后续升级和排障都更加方便。
六、Docker Compose 一键部署方案
下面给出一个简化版的 docker-compose.yml,用于部署网关、认证、监控等核心服务。
version: "3.9"
services:
gateway:
image: nginx:1.25
container_name: private-cloudflare-gateway
restart: always
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
- ./nginx/conf.d:/etc/nginx/conf.d:ro
- ./nginx/certs:/etc/nginx/certs:ro
- ./nginx/cache:/var/cache/nginx
- ./nginx/logs:/var/log/nginx
networks:
- edge
authelia:
image: authelia/authelia:latest
container_name: private-cloudflare-authelia
restart: always
volumes:
- ./authelia:/config
networks:
- edge
expose:
- "9091"
prometheus:
image: prom/prometheus:latest
container_name: private-cloudflare-prometheus
restart: always
volumes:
- ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml:ro
ports:
- "9090:9090"
networks:
- edge
grafana:
image: grafana/grafana:latest
container_name: private-cloudflare-grafana
restart: always
ports:
- "3000:3000"
volumes:
- ./grafana/data:/var/lib/grafana
networks:
- edge
networks:
edge:
driver: bridge
该 Compose 文件实现了四个核心服务:
gateway:统一流量入口;authelia:统一登录认证;prometheus:指标采集;grafana:可视化监控面板。
如果需要 WAF,可使用支持 ModSecurity 的 Nginx 镜像,或者将 WAF 独立部署为前置网关。
七、Nginx 网关核心配置
下面是一个基础 nginx.conf 示例:
user nginx;
worker_processes auto;
events {
worker_connections 4096;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" '
'rt=$request_time uct="$upstream_connect_time" '
'uht="$upstream_header_time" urt="$upstream_response_time"';
access_log /var/log/nginx/access.log main;
error_log /var/log/nginx/error.log warn;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
server_tokens off;
client_max_body_size 100m;
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=edge_cache:100m
max_size=10g inactive=60m use_temp_path=off;
include /etc/nginx/conf.d/*.conf;
}
示例站点配置 app.example.com.conf:
server {
listen 80;
server_name app.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name app.example.com;
ssl_certificate /etc/nginx/certs/app.example.com.crt;
ssl_certificate_key /etc/nginx/certs/app.example.com.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
add_header X-Frame-Options SAMEORIGIN always;
add_header X-Content-Type-Options nosniff always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy no-referrer-when-downgrade always;
location / {
proxy_pass http://backend-app:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_cache edge_cache;
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
proxy_connect_timeout 10s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
}
}
通过该配置,平台即可实现 HTTPS 终止、反向代理、静态缓存、安全响应头等基础能力。
八、访问认证与 Zero Trust 能力
Cloudflare Access 的核心价值是:用户访问内部应用时,不再直接暴露应用登录页,而是先经过统一身份认证、策略校验,再转发到后端服务。
私有化环境中可以使用 Authelia 实现类似能力。Nginx 可通过 auth_request 与 Authelia 集成。
示例配置:
location /authelia {
internal;
proxy_pass http://authelia:9091/api/verify;
proxy_set_header X-Original-URL $scheme://$http_host$request_uri;
proxy_set_header X-Forwarded-Method $request_method;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header X-Forwarded-Uri $request_uri;
}
location / {
auth_request /authelia;
error_page 401 =302 https://auth.example.com;
proxy_pass http://backend-app:8080;
}
Authelia 支持:
- 用户名密码登录;
- 双因素认证;
- LDAP 对接;
- OIDC 集成;
- 基于域名、路径、用户组的访问策略;
- Session 管理;
- 登录审计。
对于企业内网系统来说,这可以有效减少系统暴露面,将所有应用统一纳入访问控制体系。
九、WAF 防护设计
Cloudflare 的 WAF 是其重要能力之一。在私有化方案中,可以使用 ModSecurity + OWASP Core Rule Set 实现基础防护。
常见防护场景包括:
- SQL 注入;
- XSS 跨站脚本;
- 命令注入;
- 文件包含;
- 路径穿越;
- 恶意爬虫;
- 异常请求头;
- 大量异常参数。
生产环境建议 WAF 分阶段启用:
第一阶段:检测模式
先将 WAF 配置为只记录不拦截,观察是否有误报。
SecRuleEngine DetectionOnly
第二阶段:低风险拦截
对明显恶意请求启用拦截,例如常见扫描器、恶意路径、危险参数。
SecRuleEngine On
第三阶段:按业务调优
根据日志中的误报情况,为特定接口添加白名单或降低规则等级。
WAF 的核心不是“一开即安全”,而是持续调优。对于复杂业务系统,如果不做规则优化,可能会出现误拦截。因此上线前必须经过压测和灰度验证。
十、一键部署脚本
为了降低部署门槛,可以编写 install.sh 脚本完成 Docker、Docker Compose、目录初始化和服务启动。
#!/usr/bin/env bash
set -e
PROJECT_DIR="/opt/cloudflare-private"
echo "==> 创建部署目录"
mkdir -p ${PROJECT_DIR}
cd ${PROJECT_DIR}
echo "==> 创建基础目录"
mkdir -p nginx/conf.d nginx/certs nginx/cache nginx/logs
mkdir -p authelia prometheus grafana/data scripts
echo "==> 检查 Docker"
if ! command -v docker >/dev/null 2>&1; then
echo "Docker 未安装,开始安装 Docker..."
curl -fsSL https://get.docker.com | bash
systemctl enable docker
systemctl start docker
else
echo "Docker 已安装"
fi
echo "==> 检查 Docker Compose"
if ! docker compose version >/dev/null 2>&1; then
echo "Docker Compose 不可用,请确认 Docker 版本是否支持 compose 插件"
exit 1
fi
echo "==> 写入 docker-compose.yml"
cat > docker-compose.yml <<'EOF'
version: "3.9"
services:
gateway:
image: nginx:1.25
container_name: private-cloudflare-gateway
restart: always
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
- ./nginx/conf.d:/etc/nginx/conf.d:ro
- ./nginx/certs:/etc/nginx/certs:ro
- ./nginx/cache:/var/cache/nginx
- ./nginx/logs:/var/log/nginx
networks:
- edge
prometheus:
image: prom/prometheus:latest
container_name: private-cloudflare-prometheus
restart: always
ports:
- "9090:9090"
volumes:
- ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml:ro
networks:
- edge
grafana:
image: grafana/grafana:latest
container_name: private-cloudflare-grafana
restart: always
ports:
- "3000:3000"
volumes:
- ./grafana/data:/var/lib/grafana
networks:
- edge
networks:
edge:
driver: bridge
EOF
echo "==> 写入 nginx.conf"
cat > nginx/nginx.conf <<'EOF'
user nginx;
worker_processes auto;
events {
worker_connections 4096;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
error_log /var/log/nginx/error.log warn;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
server_tokens off;
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=edge_cache:100m
max_size=10g inactive=60m use_temp_path=off;
include /etc/nginx/conf.d/*.conf;
}
EOF
echo "==> 写入默认站点配置"
cat > nginx/conf.d/default.conf <<'EOF'
server {
listen 80 default_server;
server_name _;
location / {
return 200 "Private Cloudflare Gateway is running.\n";
}
}
EOF
echo "==> 写入 Prometheus 配置"
cat > prometheus/prometheus.yml <<'EOF'
global:
scrape_interval: 15s
scrape_configs:
- job_name: "prometheus"
static_configs:
- targets: ["localhost:9090"]
EOF
echo "==> 启动服务"
docker compose up -d
echo "==> 部署完成"
echo "访问测试:http://服务器IP"
echo "Grafana:http://服务器IP:3000 默认账号:admin/admin"
echo "Prometheus:http://服务器IP:9090"
使用方式:
chmod +x install.sh
sudo ./install.sh
部署完成后,访问服务器 IP,如果看到:
Private Cloudflare Gateway is running.
说明网关服务已经启动成功。
十一、域名接入流程
部署完成后,可以按照以下流程接入业务:
1. 配置 DNS
如果是公网业务,将域名解析到网关服务器公网 IP。
app.example.com A 1.2.3.4
如果是内网业务,可以在内部 DNS 中添加解析:
app.internal.example.com A 10.0.0.10
2. 准备证书
可以使用以下几种方式:
- 公网域名使用 Let’s Encrypt;
- 内网域名使用企业内部 CA;
- 测试环境使用自签证书;
- 多域名使用通配符证书。
3. 新增 Nginx 站点配置
例如:
server {
listen 80;
server_name app.example.com;
location / {
proxy_pass http://10.0.0.20:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
4. 重载网关
docker exec private-cloudflare-gateway nginx -t
docker exec private-cloudflare-gateway nginx -s reload
十二、生产环境高可用设计
单节点部署适合测试和小规模业务,生产环境建议至少采用双节点架构:
用户
|
DNS / 负载均衡
|
+---------------------+
| |
v v
网关节点 1 网关节点 2
| |
+----------+----------+
|
v
后端服务集群
高可用方案可以采用:
-
DNS 多 A 记录
简单易用,但故障切换依赖 DNS 缓存,实时性一般。 -
LVS / Keepalived
适合内网或自建机房,使用 VIP 漂移实现高可用。 -
云负载均衡 SLB
如果部署在云环境中,可以使用云厂商负载均衡。 -
HAProxy 前置负载均衡
可以提供更灵活的健康检查与流量调度。
同时,多个网关节点之间需要保证配置一致。可以使用 Git 管理配置文件,再通过 CI/CD 或 Ansible 批量同步。
十三、安全加固建议
私有化网关是企业业务入口,安全加固非常重要。
1. 最小化端口开放
公网只建议开放:
- 80;
- 443;
- 必要的 VPN 或堡垒机端口。
Prometheus、Grafana、管理后台等不建议直接暴露公网。
2. 禁用版本暴露
Nginx 中设置:
server_tokens off;
3. 启用 HTTPS
生产环境必须启用 HTTPS,并建议关闭 TLS 1.0 和 TLS 1.1。
4. 配置限流
limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s;
server {
location / {
limit_req zone=req_limit burst=20 nodelay;
proxy_pass http://backend;
}
}
5. 配置 IP 黑白名单
allow 10.0.0.0/8;
allow 192.168.0.0/16;
deny all;
6. 日志审计
建议保留至少 30 天访问日志,并对异常状态码、异常路径、异常 IP 进行统计分析。
十四、运维与监控
一个可长期运行的私有化平台,不能只关注部署,还需要关注运维。
建议监控以下指标:
- 网关 QPS;
- 4xx / 5xx 状态码比例;
- 上游服务响应时间;
- Nginx 连接数;
- 缓存命中率;
- CPU、内存、磁盘、网络流量;
- WAF 拦截次数;
- 登录失败次数;
- TLS 证书到期时间。
日志方面建议采集:
- Nginx access.log;
- Nginx error.log;
- WAF audit log;
- Authelia 登录日志;
- Docker 容器日志;
- 系统安全日志。
对于生产系统,应配置告警规则,例如:
- 5xx 比例连续 5 分钟超过 5%;
- 某 IP 1 分钟内请求超过阈值;
- 证书将在 15 天内过期;
- 网关磁盘使用率超过 80%;
- 后端服务健康检查失败。
十五、适用场景与限制
适用场景
该方案适合:
- 企业内部系统统一入口;
- 私有云 / 专有云业务网关;
- 开发、测试、预生产环境统一代理;
- 中小规模网站安全加速;
- 需要自主可控的反向代理与访问控制平台;
- 不方便使用公有 Cloudflare 的合规场景。
不适用场景
该方案不适合:
- 需要全球级 Anycast CDN 的超大规模业务;
- 需要 Tbps 级 DDoS 清洗能力的高风险业务;
- 希望完全复制 Cloudflare Workers 生态的边缘计算场景;
- 没有任何运维能力却要求高安全等级的场景。
私有化部署的优势是自主可控,缺点是需要自行负责安全、监控、升级、容量规划和故障处理。
十六、总结
Cloudflare 是优秀的边缘网络与安全平台,但它本质上是 SaaS 服务,并不能被完整私有化安装。对于有合规、安全、内网接入或自主可控需求的企业,可以通过开源组件组合实现一套“类 Cloudflare”的私有化部署方案。
本文方案以 Nginx / OpenResty 为核心入口,结合 WAF、Authelia、Prometheus、Grafana、内部 DNS、证书管理等组件,实现了反向代理、HTTPS、访问控制、缓存加速、安全防护和监控可视化等能力。通过 Docker Compose 和一键部署脚本,可以在较短时间内搭建出一个可用的私有化边缘网关平台。
如果用于生产环境,建议进一步补充高可用架构、集中日志、配置管理、自动化证书、WAF 调优、限流策略和灾备方案。只要规划合理,这套方案不仅可以作为 Cloudflare 的私有化替代架构,也可以成为企业统一应用入口、内外网安全接入和零信任访问控制的基础平台。