为typecho启用cloudflare

本文适用于 Typecho 站点接入 Cloudflare 后加固源站 nginx 的场景。你会学到:如何让 nginx 只响应已知域名、只接受来自 Cloudflare 的访问,避免攻击者绕过 CDN 直接打源站。

站点启用 Cloudflare 后,源站 IP 仍然公网可达。需要做两层限制:

  1. 只允许特定的 snihost 访问特定的服务,其他未知 snihost 直接返回 404。
  2. 只允许 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
  1. curl -H "Host: yourservername" http://<源站IP>/ 能正常返回 Typecho 页面
  2. 直接访问源站 IP(不带正确 Host)应返回 404
  3. 非 Cloudflare IP 直接请求 80 端口应被拒绝(403 或连接失败)
  4. 经 Cloudflare 域名访问站点一切正常

参考