Cloudflare 加固实战:从隐藏源站到 WAF、防火墙与限速配置全流程
Cloudflare 安全加固方案|附完整命令
在现代 Web 架构中,Cloudflare 已经不仅仅是一个 CDN 服务,它同时提供了 DNS 托管、DDoS 防护、WAF 防火墙、Bot 管理、零信任访问、证书管理、边缘规则、缓存加速等一系列能力。对于企业网站、API 服务、SaaS 平台、个人站点以及跨境业务来说,合理使用 Cloudflare 可以显著提升站点的安全性、稳定性与访问体验。
但是,很多人在接入 Cloudflare 后只是简单地把 DNS 解析切换到 Cloudflare,然后开启“小云朵”代理,这种做法只能获得基础防护,并不能充分发挥 Cloudflare 的安全能力。尤其是源站 IP 暴露、SSL 配置不当、WAF 规则缺失、管理后台裸露、API 接口无限制访问、服务器防火墙未限制 Cloudflare IP 等问题,仍然可能导致站点被扫描、攻击甚至绕过 Cloudflare 直接打源站。
本文将从DNS、SSL/TLS、源站保护、防火墙、WAF、自定义规则、管理后台保护、API 限速、缓存策略、日志审计等角度,系统讲解一套 Cloudflare 安全加固方案,并附带可直接使用的 Linux 命令、Nginx 配置、iptables / ufw 规则示例,帮助你快速完成加固。
一、总体加固思路
Cloudflare 安全加固的核心目标可以概括为以下几点:
-
隐藏源站 IP
- 防止攻击者绕过 Cloudflare 直接访问服务器。
- 避免源站被 DDoS、爆破、漏洞扫描。
-
只允许 Cloudflare 回源
- 在服务器防火墙层面限制访问来源。
- 只有 Cloudflare IP 才能访问 80/443 端口。
-
启用 HTTPS 且使用严格 SSL 模式
- 避免中间人攻击。
- 防止用户与 Cloudflare、Cloudflare 与源站之间存在明文传输。
-
开启 WAF 与自定义安全规则
- 拦截常见漏洞攻击、恶意扫描、SQL 注入、XSS、命令执行等行为。
-
保护敏感路径
- 如
/admin、/login、/wp-admin、/api等路径。 - 可增加访问限制、验证码、国家/地区限制、IP 白名单等。
- 如
-
配置速率限制
- 防止登录爆破、短信接口滥用、API 高频请求。
-
持续监控与审计
- 定期检查 Cloudflare 日志、源站日志、防火墙规则、证书状态。
二、接入 Cloudflare 前的准备工作
在正式接入 Cloudflare 前,应先确认以下信息:
- 域名是否已经添加到 Cloudflare。
- DNS 是否托管到 Cloudflare。
- Web 服务是否正常运行。
- 源站是否支持 HTTPS。
- 是否知道服务器真实 IP。
- 是否拥有服务器 SSH 权限。
- 是否可以修改 Nginx / Apache 配置。
假设你的域名为:
example.com
源站服务器 IP 为:
1.2.3.4
服务器系统为 Ubuntu / Debian,Web 服务为 Nginx。
三、DNS 安全配置
1. 开启 Cloudflare 代理
在 Cloudflare DNS 页面,将网站相关记录设置为代理模式,也就是橙色云朵状态。
常见记录如下:
A example.com 1.2.3.4 Proxied
A www.example.com 1.2.3.4 Proxied
AAAA example.com IPv6地址 Proxied
如果你不需要 IPv6,建议不要随意添加 AAAA 记录,避免 IPv6 源站暴露。
2. 避免源站 IP 泄露
很多源站 IP 泄露不是 Cloudflare 导致的,而是历史 DNS 记录、邮件记录、子域名、证书透明日志、GitHub 配置泄露等造成的。
你可以使用以下命令检查域名解析情况:
dig example.com
dig www.example.com
dig +short example.com
dig +short www.example.com
如果已经通过 Cloudflare 代理,返回的应该是 Cloudflare 的 IP,而不是你的真实服务器 IP。
也可以查询所有 DNS 记录:
dig ANY example.com
不过很多 DNS 服务商已经限制 ANY 查询,结果不一定完整。
3. 检查子域名是否暴露源站
建议检查常见子域名:
for sub in www api admin test dev staging cdn static img mail ftp panel; do
echo "===== $sub.example.com ====="
dig +short $sub.example.com
done
如果某些子域名直接解析到源站 IP,应考虑:
- 删除无用记录;
- 改为 Cloudflare 代理;
- 更换源站 IP;
- 对敏感子域名设置访问控制。
四、SSL/TLS 加固配置
1. Cloudflare SSL 模式选择
进入 Cloudflare 后台:
SSL/TLS -> Overview
推荐选择:
Full (strict)
不要使用:
Flexible
原因如下:
- Flexible 模式下,用户到 Cloudflare 是 HTTPS,但 Cloudflare 到源站可能是 HTTP。
- 容易导致重定向循环。
- 源站通信不加密,存在安全隐患。
2. 源站安装证书
你可以使用 Let’s Encrypt 证书,也可以使用 Cloudflare Origin Certificate。
方式一:使用 Certbot 安装 Let’s Encrypt 证书
安装 Certbot:
sudo apt update
sudo apt install -y certbot python3-certbot-nginx
签发证书:
sudo certbot --nginx -d example.com -d www.example.com
测试自动续期:
sudo certbot renew --dry-run
查看证书:
sudo certbot certificates
方式二:使用 Cloudflare Origin Certificate
在 Cloudflare 后台进入:
SSL/TLS -> Origin Server -> Create Certificate
生成证书后,保存为:
sudo mkdir -p /etc/nginx/ssl
sudo nano /etc/nginx/ssl/example.com.pem
sudo nano /etc/nginx/ssl/example.com.key
设置权限:
sudo chmod 600 /etc/nginx/ssl/example.com.key
sudo chmod 644 /etc/nginx/ssl/example.com.pem
Nginx 配置示例:
server {
listen 443 ssl http2;
server_name example.com www.example.com;
ssl_certificate /etc/nginx/ssl/example.com.pem;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers off;
root /var/www/example.com;
index index.html index.htm index.php;
location / {
try_files $uri $uri/ =404;
}
}
测试配置并重载:
sudo nginx -t
sudo systemctl reload nginx
五、源站防火墙:只允许 Cloudflare IP 访问
这是 Cloudflare 加固中最关键的一步。即使 Cloudflare 开启了各种防护,如果源站 IP 被发现,攻击者仍然可以绕过 Cloudflare 直接攻击服务器。因此必须在服务器防火墙层面限制 80/443 端口只允许 Cloudflare IP 访问。
六、获取 Cloudflare 官方 IP 段
Cloudflare 官方 IP 地址列表:
https://www.cloudflare.com/ips-v4
https://www.cloudflare.com/ips-v6
可以使用以下命令下载:
curl -s https://www.cloudflare.com/ips-v4 -o /tmp/cloudflare-ips-v4.txt
curl -s https://www.cloudflare.com/ips-v6 -o /tmp/cloudflare-ips-v6.txt
查看内容:
cat /tmp/cloudflare-ips-v4.txt
cat /tmp/cloudflare-ips-v6.txt
七、使用 UFW 限制源站访问
如果你使用 Ubuntu 默认的 UFW,可以按以下方式配置。
1. 允许 SSH
在配置前务必先允许 SSH,否则可能把自己锁在服务器外面:
sudo ufw allow 22/tcp
如果你的 SSH 端口不是 22,例如 2222:
sudo ufw allow 2222/tcp
2. 默认拒绝入站
sudo ufw default deny incoming
sudo ufw default allow outgoing
3. 允许 Cloudflare IP 访问 80/443
执行以下命令:
for ip in $(curl -s https://www.cloudflare.com/ips-v4); do
sudo ufw allow from $ip to any port 80 proto tcp
sudo ufw allow from $ip to any port 443 proto tcp
done
如果你启用了 IPv6:
for ip in $(curl -s https://www.cloudflare.com/ips-v6); do
sudo ufw allow from $ip to any port 80 proto tcp
sudo ufw allow from $ip to any port 443 proto tcp
done
4. 启用 UFW
sudo ufw enable
查看规则:
sudo ufw status numbered
5. 删除错误规则
如果需要删除某条规则,可以先查看编号:
sudo ufw status numbered
然后删除:
sudo ufw delete 编号
八、使用 iptables 限制源站访问
如果你更习惯 iptables,可以使用如下方式。
1. 清理旧规则前先备份
sudo iptables-save > ~/iptables-backup-$(date +%F-%H%M%S).rules
sudo ip6tables-save > ~/ip6tables-backup-$(date +%F-%H%M%S).rules
2. 允许本地回环和已建立连接
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
3. 允许 SSH
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
如果 SSH 是 2222:
sudo iptables -A INPUT -p tcp --dport 2222 -j ACCEPT
4. 允许 Cloudflare IPv4 访问 80/443
for ip in $(curl -s https://www.cloudflare.com/ips-v4); do
sudo iptables -A INPUT -p tcp -s $ip --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp -s $ip --dport 443 -j ACCEPT
done
5. 拒绝其他来源访问 80/443
sudo iptables -A INPUT -p tcp --dport 80 -j DROP
sudo iptables -A INPUT -p tcp --dport 443 -j DROP
6. 保存规则
Ubuntu / Debian 可以安装持久化工具:
sudo apt install -y iptables-persistent
sudo netfilter-persistent save
sudo netfilter-persistent reload
查看规则:
sudo iptables -L -n -v
九、自动更新 Cloudflare IP 防火墙规则
Cloudflare IP 段偶尔会变化,建议定期更新。下面给出一个 UFW 自动更新脚本示例。
创建脚本:
sudo nano /usr/local/bin/update-cloudflare-ufw.sh
写入以下内容:
#!/bin/bash
set -e
CF_IPV4_URL="https://www.cloudflare.com/ips-v4"
CF_IPV6_URL="https://www.cloudflare.com/ips-v6"
TMP_V4="/tmp/cloudflare-ips-v4.txt"
TMP_V6="/tmp/cloudflare-ips-v6.txt"
curl -s "$CF_IPV4_URL" -o "$TMP_V4"
curl -s "$CF_IPV6_URL" -o "$TMP_V6"
# 允许 SSH,避免误锁
ufw allow 22/tcp
# 添加 IPv4 规则
while read -r ip; do
[ -z "$ip" ] && continue
ufw allow from "$ip" to any port 80 proto tcp
ufw allow from "$ip" to any port 443 proto tcp
done < "$TMP_V4"
# 添加 IPv6 规则
while read -r ip; do
[ -z "$ip" ] && continue
ufw allow from "$ip" to any port 80 proto tcp
ufw allow from "$ip" to any port 443 proto tcp
done < "$TMP_V6"
ufw default deny incoming
ufw default allow outgoing
ufw reload
echo "Cloudflare UFW rules updated."
赋予执行权限:
sudo chmod +x /usr/local/bin/update-cloudflare-ufw.sh
手动执行:
sudo /usr/local/bin/update-cloudflare-ufw.sh
添加定时任务:
sudo crontab -e
加入:
0 3 * * 1 /usr/local/bin/update-cloudflare-ufw.sh >/var/log/update-cloudflare-ufw.log 2>&1
表示每周一凌晨 3 点自动更新。
十、Nginx 获取真实访客 IP
接入 Cloudflare 后,源站看到的访问 IP 默认是 Cloudflare 节点 IP,而不是真实访客 IP。为了日志审计、限速、防刷,需要配置 Nginx 获取真实 IP。
1. 创建 Cloudflare Real IP 配置
sudo nano /etc/nginx/conf.d/cloudflare-real-ip.conf
写入:
real_ip_header CF-Connecting-IP;
set_real_ip_from 173.245.48.0/20;
set_real_ip_from 103.21.244.0/22;
set_real_ip_from 103.22.200.0/22;
set_real_ip_from 103.31.4.0/22;
set_real_ip_from 141.101.64.0/18;
set_real_ip_from 108.162.192.0/18;
set_real_ip_from 190.93.240.0/20;
set_real_ip_from 188.114.96.0/20;
set_real_ip_from 197.234.240.0/22;
set_real_ip_from 198.41.128.0/17;
set_real_ip_from 162.158.0.0/15;
set_real_ip_from 104.16.0.0/13;
set_real_ip_from 104.24.0.0/14;
set_real_ip_from 172.64.0.0/13;
set_real_ip_from 131.0.72.0/22;
set_real_ip_from 2400:cb00::/32;
set_real_ip_from 2606:4700::/32;
set_real_ip_from 2803:f800::/32;
set_real_ip_from 2405:b500::/32;
set_real_ip_from 2405:8100::/32;
set_real_ip_from 2a06:98c0::/29;
set_real_ip_from 2c0f:f248::/32;
测试并重载 Nginx:
sudo nginx -t
sudo systemctl reload nginx
2. 查看访问日志
sudo tail -f /var/log/nginx/access.log
如果配置正确,日志中应显示真实访客 IP。
十一、Cloudflare WAF 基础加固
进入 Cloudflare 后台:
Security -> WAF
建议启用以下内容:
-
Managed Rules
- Cloudflare Managed Ruleset
- OWASP Core Ruleset
-
Security Level
- 普通站点可设置为 Medium
- 经常被攻击的站点可设置为 High
- 被攻击期间可临时设置为 Under Attack
-
Browser Integrity Check
- 建议开启。
-
Challenge Passage
- 可设置为 15 到 30 分钟,根据业务调整。
十二、自定义 WAF 规则示例
1. 拦截非目标国家访问后台
如果后台只允许中国大陆或固定地区访问,可以创建规则:
(http.request.uri.path contains "/admin" and ip.geoip.country ne "CN")
动作选择:
Block
如果不想直接拦截,也可以选择:
Managed Challenge
2. 后台路径启用验证码挑战
http.request.uri.path starts_with "/admin"
动作:
Managed Challenge
适用于:
/admin/wp-admin/login/user/login/dashboard
3. 拦截常见扫描路径
(
http.request.uri.path contains "/.env" or
http.request.uri.path contains "/wp-config.php" or
http.request.uri.path contains "/config.php" or
http.request.uri.path contains "/phpinfo" or
http.request.uri.path contains "/server-status" or
http.request.uri.path contains "/.git"
)
动作:
Block
4. 拦截异常 User-Agent
(
http.user_agent contains "sqlmap" or
http.user_agent contains "nikto" or
http.user_agent contains "acunetix" or
http.user_agent contains "nessus" or
http.user_agent contains "masscan" or
http.user_agent contains "nmap"
)
动作:
Block
5. 只允许特定 IP 访问后台
如果你的办公 IP 是:
8.8.8.8
规则可以写为:
(http.request.uri.path starts_with "/admin" and ip.src ne 8.8.8.8)
动作:
Block
多个 IP 可以这样写:
(
http.request.uri.path starts_with "/admin" and
not (ip.src in {8.8.8.8 1.1.1.1})
)
动作:
Block
十三、登录与 API 限速
对于登录接口、注册接口、短信接口、评论接口、搜索接口、API 接口,必须配置速率限制,否则很容易遭遇撞库、爆破、刷接口或资源消耗攻击。
1. 登录接口限速示例
路径:
/login
规则表达式:
http.request.uri.path eq "/login"
建议策略:
10 requests per 1 minute per IP
动作:
Managed Challenge
或:
Block
2. API 接口限速示例
路径:
/api/
规则表达式:
http.request.uri.path starts_with "/api/"
建议策略:
60 requests per 1 minute per IP
如果是公开 API,可以根据业务设置更高阈值。
3. Nginx 本地限速兜底
Cloudflare 层限速之外,源站也可以配置 Nginx 限速,作为兜底措施。
在 Nginx http 块中加入:
limit_req_zone $binary_remote_addr zone=login_limit:10m rate=5r/m;
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=60r/m;
在 server 中配置:
location = /login {
limit_req zone=login_limit burst=5 nodelay;
proxy_pass http://127.0.0.1:3000;
}
location /api/ {
limit_req zone=api_limit burst=30 nodelay;
proxy_pass http://127.0.0.1:3000;
}
测试并重载:
sudo nginx -t
sudo systemctl reload nginx
十四、缓存与安全规则配合
缓存不只是性能优化,也能降低源站压力,提高抗攻击能力。
1. 静态资源缓存
建议缓存以下类型文件:
css、js、jpg、jpeg、png、gif、webp、svg、ico、woff、woff2、ttf、mp4
Cloudflare Cache Rules 示例:
(http.request.uri.path matches "\.(css|js|jpg|jpeg|png|gif|webp|svg|ico|woff|woff2|ttf|mp4)$")
设置:
Cache eligibility: Eligible for cache
Edge TTL: 1 month
Browser TTL: 1 week
2. 不缓存后台和用户接口
以下路径应避免缓存:
/admin
/login
/logout
/user
/account
/api
/cart
/checkout
规则表达式:
(
http.request.uri.path starts_with "/admin" or
http.request.uri.path starts_with "/api" or
http.request.uri.path starts_with "/login" or
http.request.uri.path starts_with "/account"
)
设置:
Cache eligibility: Bypass cache
十五、开启 HSTS
HSTS 可以强制浏览器使用 HTTPS 访问站点,防止协议降级攻击。
Cloudflare 后台路径:
SSL/TLS -> Edge Certificates -> HTTP Strict Transport Security
推荐配置:
Enable HSTS: On
Max Age: 6 months
Include subdomains: 根据业务情况选择
Preload: 谨慎开启
No-Sniff Header: On
如果你有大量子域名,且部分子域名不支持 HTTPS,不建议立即开启 Include subdomains,否则可能导致访问异常。
Nginx 也可以添加:
add_header Strict-Transport-Security "max-age=15552000; includeSubDomains" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-XSS-Protection "1; mode=block" always;
十六、管理后台额外保护
Cloudflare 可以保护边缘流量,但后台账号安全仍然必须加强。
建议:
- 后台启用 MFA / 2FA;
- 禁用弱密码;
- 限制管理员登录 IP;
- 登录失败超过阈值自动锁定;
- 后台路径不要使用默认路径;
- 不要将管理面板暴露在公网;
- SSH 禁止密码登录,仅允许密钥登录。
SSH 安全加固命令
编辑 SSH 配置:
sudo nano /etc/ssh/sshd_config
建议配置:
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
Port 2222
重启 SSH:
sudo systemctl restart ssh
放行新端口:
sudo ufw allow 2222/tcp
注意:修改 SSH 端口和禁用密码登录前,务必确认密钥登录可用,并保留一个已登录终端,避免无法连接服务器。
十七、隐藏源站的其他建议
除了防火墙限制 Cloudflare IP,还应注意以下问题:
1. 邮件服务不要和 Web 源站共用 IP
如果你使用同一台服务器发送邮件,邮件头可能暴露源站 IP。建议:
- 使用第三方邮件服务;
- 邮件服务器与 Web 服务器分离;
- MX 记录不要指向 Web 源站;
- SPF/DKIM/DMARC 正确配置。
2. 不要在 GitHub 泄露配置
检查仓库中是否存在:
.env
config.php
database.yml
application.properties
docker-compose.yml
nginx.conf
可以使用:
grep -R "1.2.3.4" .
grep -R "DB_PASSWORD" .
grep -R "SECRET_KEY" .
3. 检查证书透明日志
攻击者可能通过历史证书记录发现子域名。可以在以下平台搜索:
https://crt.sh
搜索:
%.example.com
发现无用子域名后及时删除或加固。
十八、安全审计常用命令
1. 查看监听端口
sudo ss -tulnp
或:
sudo netstat -tulnp
2. 查看 Nginx 错误日志
sudo tail -f /var/log/nginx/error.log
3. 查看访问最多的 IP
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head
4. 查看访问最多的路径
awk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head
5. 查看 404 最多的请求
awk '$9==404 {print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head
6. 查看登录接口访问情况
grep "/login" /var/log/nginx/access.log | tail -n 50
7. 查看异常 User-Agent
awk -F\" '{print $6}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head
十九、推荐的 Cloudflare 安全配置清单
下面是一份实用的 Cloudflare 加固清单:
| 模块 | 推荐配置 |
|---|---|
| DNS | Web 记录开启代理,删除无用记录 |
| SSL/TLS | Full strict |
| Always Use HTTPS | 开启 |
| Automatic HTTPS Rewrites | 开启 |
| HSTS | 谨慎开启,先测试 |
| WAF Managed Rules | 开启 |
| OWASP Ruleset | 开启 |
| Security Level | Medium 或 High |
| Bot Fight Mode | 根据业务开启 |
| Browser Integrity Check | 开启 |
| Rate Limiting | 登录、API、搜索、短信接口配置 |
| Cache Rules | 静态资源缓存,后台和接口绕过 |
| Firewall Rules | 后台路径限制、扫描路径拦截 |
| Origin Firewall | 只允许 Cloudflare IP 访问源站 |
| Logs | 定期审计 |
二十、完整加固命令汇总
以下是一组适合 Ubuntu + Nginx + UFW 的基础加固命令。执行前请根据实际情况修改 SSH 端口和域名。
# 更新系统
sudo apt update && sudo apt upgrade -y
# 安装基础工具
sudo apt install -y curl wget vim ufw nginx certbot python3-certbot-nginx
# 放行 SSH,避免锁死
sudo ufw allow 22/tcp
# 设置默认策略
sudo ufw default deny incoming
sudo ufw default allow outgoing
# 允许 Cloudflare IPv4 访问 HTTP/HTTPS
for ip in $(curl -s https://www.cloudflare.com/ips-v4); do
sudo ufw allow from $ip to any port 80 proto tcp
sudo ufw allow from $ip to any port 443 proto tcp
done
# 允许 Cloudflare IPv6 访问 HTTP/HTTPS
for ip in $(curl -s https://www.cloudflare.com/ips-v6); do
sudo ufw allow from $ip to any port 80 proto tcp
sudo ufw allow from $ip to any port 443 proto tcp
done
# 启用防火墙
sudo ufw enable
# 查看防火墙状态
sudo ufw status numbered
# 签发 Let's Encrypt 证书
sudo certbot --nginx -d example.com -d www.example.com
# 测试证书自动续期
sudo certbot renew --dry-run
# 测试 Nginx 配置
sudo nginx -t
# 重载 Nginx
sudo systemctl reload nginx
二十一、注意事项
-
不要直接复制生产环境规则不测试
- WAF、缓存、限速规则都可能影响业务,应先观察再加强。
-
防火墙配置前必须确认 SSH 可用
- 建议保持一个已登录 SSH 窗口,不要立即关闭。
-
Cloudflare 代理并不等于绝对安全
- 应用自身漏洞、弱密码、越权访问、代码缺陷仍然需要修复。
-
API 不适合盲目开启强验证码
- 对 API 使用 Challenge 可能导致正常客户端无法访问,应优先使用 Token、签名、限速、鉴权。
-
HSTS Preload 谨慎开启
- 一旦提交 Preload 列表,回退较麻烦,必须确保所有子域名长期支持 HTTPS。
结语
Cloudflare 的价值不只是“隐藏 IP”和“抗 DDoS”,更重要的是它提供了一套位于边缘层的安全治理能力。真正有效的加固方案,应当同时覆盖 Cloudflare 边缘配置、源站防火墙、Web 服务配置、应用登录安全、API 限速、缓存策略和日志审计。
如果只开启 Cloudflare 代理,而源站仍然对公网开放,那么攻击者一旦发现真实 IP,就可以绕过所有边缘防护。因此,只允许 Cloudflare IP 回源是整套方案中最关键的一步。随后再结合 Full strict HTTPS、WAF Managed Rules、自定义规则、后台访问控制、接口限速和日志监控,才能形成较完整的安全防线。
建议你按照本文清单逐项检查并实施,先完成基础安全闭环,再根据业务情况逐步强化规则。安全加固不是一次性操作,而是一个持续维护、持续优化的过程。