为typecho启用cloudflare
本文适用于 Typecho 站点接入 Cloudflare 后加固源站 nginx 的场景。你会学到:如何让 nginx 只响应已知域名、只接受来自 Cloudflare 的访问,避免攻击者绕过 CDN 直接打源站。
站点启用 Cloudflare 后,源站 IP 仍然公网可达。需要做两层限制:
- 只允许特定的
sni或host访问特定的服务,其他未知sni或host直接返回 404。 - 只允许
cloudflare的 IP 访问80端口。
配置 nginx
默认 server:拒绝未知 Host
编辑 /etc/nginx/conf.d/default.conf:
vim /etc/nginx/conf.d/default.conf
# 默认 server,匹配所有未定义的 Host
server {
listen 80 default_server;
server_name _; # 匹配任意 Host
include /etc/nginx/conf.d/cf-ip.conf;
deny all;
return 404;
}
include /etc/nginx/conf.d/cf-ip.conf;引入了 Cloudflare IP 白名单配置(见下文),让非 Cloudflare 来源直接被拒绝。
Typecho 站点配置
编辑 /etc/nginx/conf.d/typecho.conf:
vim /etc/nginx/conf.d/typecho.conf
server {
listen 80;
server_name yourservername;
root /var/www/html/typecho;
index index.html index.htm index.php;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:5050;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
生成 Cloudflare IP 白名单
cf-ip.conf 需要从 Cloudflare 官方 IP 列表生成。参考 Cloudflare IP 列表:
# IPv4
curl -s https://www.cloudflare.com/ips-v4 -o /tmp/cf-ips-v4
# IPv6
curl -s https://www.cloudflare.com/ips-v6 -o /tmp/cf-ips-v6
将 allow <ip>; 逐行写入 /etc/nginx/conf.d/cf-ip.conf,并在末尾加 deny all;。注意此文件只能用于「仅 Cloudflare 可访问」的端口(如 80),否则会阻断真实用户。
验证与自查
nginx -t
nginx -s reload
curl -H "Host: yourservername" http://<源站IP>/能正常返回 Typecho 页面- 直接访问源站 IP(不带正确 Host)应返回 404
- 非 Cloudflare IP 直接请求 80 端口应被拒绝(
403或连接失败) - 经 Cloudflare 域名访问站点一切正常