CDN 调教指南(二)充分利用 Cloudflare

0、前言

Cloudflare

谈到 DDoS 防御,所有人可能立刻想起的就是 Cloudflare 了。即使是免费版,Cloudflare也提供无上限的 DDoS 防御,强大的控制台更是提供了丰富的功能等待我们去探索。所以,我们在接入任何其他 CDN 前,都应该先考虑充分利用免费版的 Cloudflare(买得起付费计划当然更好,可以省略很多步骤)。

1、接入

接入方式分为两种:

  1. NS 接入;
  2. CNAME 接入。

1.1、NS 接入

使用第一种方法就是把域名 DNS 服务器设置为 Cloudflare 的 DNS 服务器,这是最简单的方法。然而这种方法存在以下问题:

  • 解析 IP 随机

如果 IP 被屏蔽,网站就无法访问。

  • 按计划分配 IP

另外,Free、Pro 计划分配的 IP 往往有很多人,甚至有很多违规站点使用,这对 SEO 可能是非常不利的。

  • 不能自定义 IP

如果不能自定义 IP,很多节点都不会被命中,因为亚洲等地区的流量、带宽费用比欧美等地区高,因此在这些地区可能会命中更远但是对 Cloudflare 而言费用更便宜的地区。

特别是,如果不能自定义 IP,也就无法使用优选 IP 的方法加快访问速度。此外,这种方法也只适用于使用 Cloudflare 作为纯 CDN,而不考虑融合 CDN 的方案。

  • 无 DNS API 支持

使用 Freenom 的免费域名无法使用 Cloudflare 的 DNS API。

1.2、CNAME 接入

这是我抢了推荐的方法,后续教程也将以此方法示例。

参考本站文章:

使用 SaaS 方式接入 Cloudflare
https://blog.tsinbei.com/tw/archives/1315/

使用 CNAME 接入后,就可以把在 DNSPod 等处的 CNAME 记录自行修改为需要的 Cloudflare IP,例如下文提到的优选 IP。

2、绕过备案

参考本站文章:

使用 Cloudflare 自定义回源端口绕过备案阻断
https://blog.tsinbei.com/tw/archives/1281/

3、优选 IP

参考本站文章:

CDN 调教指南(三)优选 Cloudflare IP
https://blog.tsinbei.com/tw/archives/1349/

4、避坑

新手要使用 Cloudflare 还是有很多坑要避开的,我简单说说我自己和朋友们的踩坑经历。

4.1、HTTPS

Too many redirects.

如果源站使用了强制 SSL 或者 HTTP 跳转 HTTPS 等 HTTPS 重定向,则 SSL 一定要设置“完全”;如果源站设置了有效的证书(例如我在源站也配了 Let's Encrypt 的证书,或者你使用 Cloudflare Origin CA 的证书)就可以设置为“完全(严格)”。

说明:“完全”就是 HTTPS 回源,“灵活”就是 HTTP 回源。如果开启了跳转,HTTP 回源就会把用户跳转到 HTTPS,但是只是使用 HTTPS 访问 Cloudflare,回源仍然是 HTTP,然后就死循环了。

其实考虑速度的话可以关闭源站的强制 SSL,使用 HTTP 回源。

证书不受信任。

可能是你使用了 Cloudflare Origin CA 的证书作为源站证书,并且在 DNS 那里没有开启“代理”。这个证书不是直接用来访问的,只能用于回源。

4.2、隐藏源站 IP

不少人认为网站挂到 Cloudflare 上,勾选“代理”就可以隐藏源站IP了。其实不完全正确,因为还有 Censys、SecurityTrail 这种扫描器,会扫描 0.0.0.0/0 即所有主机,然后放到他们的搜索引擎上供所有人查询。因此正确的隐藏源站 IP 方法是:

1、默认网站设置空证书

以宝塔面板为例,添加一个网站并设为默认,并且设置空白证书

(私钥)

Text
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQDXyF6m81zOeoOPvfk6nGKtyfczRG6/yeSkcc+66vGvq0s8oB7V
cCzLl1YcNsru3ixelPR2z1zvjKqa9/Aqh8+TvP1kGGbLD/mynjnj8l+0vVzZ+vnz
AH0RN9fpqzlpHmFBHQzQ25AtIAH8pXOL1541YN0TNPRA3kHUCL0FH8CkwwIDAQAB
AoGAQ4ejh6AV5VCWJ8AOZXdXsofIYzUBa+glNAmiNx8b8BwteZWq0KVAf56nBkFn
lQXW4OrA7wXKUfW11rXNZaIHJePJXv1swkN9+Em18Hon6BrtcqnKAwzAbhok3SzY
IVjI/zrgOABH6+ii77xCRBzI1itVPNN88DAUHC7PYLYiaaECQQD7PSoij37+kMc/
wPeEkl9r3vzU0OrsCsjU8Ev714OaoL/SIuAh6nsiRh9rcbUrrpGSSzIcmsk9HMDa
hXBNkNl5AkEA298yQvssaUc4tbEWxAVfd9DsHJdCdbXfgf9Dy5/tpCzYncY7T0du
VVHqKu3jXWoMc5XlesiCOerU/DIlMM8dGwJBANQn7GLO5iC1xWvS2bF7oVSIMtzL
pvW4jaszWBbNAPccc59RkA9T4LMqn/GtTZ4bhhYRpbl+BB21IC3nrNPzU5ECQG8T
Ln0QDruQs2F2eR3F6RjKfr1i3LxCiQtPPZycypzp2vS5tDS0zVRk8XuGehoy/N9X
lnqU2NURgU92tbsWpokCQQDdc9tU3B/OM/YfzUNwvOLmUVwrJX6PFSFsOn+XHrCC
q9LcGEAHyzaf5GEWje84ee4rkv5oaZcwll3dg4IioBnC
-----END RSA PRIVATE KEY-----

(证书)

Text
1
2
3
4
5
6
7
8
9
10
11
-----BEGIN CERTIFICATE-----
MIIBkjCB/AIJAI3bCYqa39hiMA0GCSqGSIb3DQEBBQUAMA0xCzAJBgNVBAYTAiAg
MCAXDTE4MTEyNDA5MDMzOFoYDzIwOTkxMjMxMDkwMzM4WjANMQswCQYDVQQGEwIg
IDCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA18hepvNcznqDj735Opxircn3
M0Ruv8nkpHHPuurxr6tLPKAe1XAsy5dWHDbK7t4sXpT0ds9c74yqmvfwKofPk7z9
ZBhmyw/5sp454/JftL1c2fr58wB9ETfX6as5aR5hQR0M0NuQLSAB/KVzi9eeNWDd
EzT0QN5B1Ai9BR/ApMMCAwEAATANBgkqhkiG9w0BAQUFAAOBgQBiqHZsuVP09ubT
GzBSlAFEoqbM63sU51nwQpzkVObgGm9v9nnxS8Atid4be0THsz8nVjWcDym3Tydp
lznrhoSrHyqAAlK3/WSMwyuPnDCNM5g1RdsV40TjZXk9/md8xWxGJ6n1MoBdlK8T
H6h2ROkf59bb096TttB8lxXiT0uiDQ==
-----END CERTIFICATE-----

效果:

空白证书

然后在伪静态(或者配置文件,找个空白行)填入:

Nginx
1
return 444;

如果是 Apache:

Text
1
2
RewriteEngine On
RewriteRule .* - [R=404,L]

2、屏蔽其他 IP 访问

这个是一劳永逸的方法,除了使用 Cloudflare CDN,其他 CDN 也通用。

原理:查询 CDN 的所有 IP 段,然后放入访问白名单;其他 IP 禁止访问。

如果整个服务器的网站都使用了 CDN,可以直接在安全组仅放行 CDN IP 段的 80、443 端口,如果是个别网站使用,则可编辑配置文件(下面以 Nginx 为例)。

首先查看 Cloudflare IP 段:

IPv4
https://www.cloudflare.com/ips-v4
IPv6
https://www.cloudflare.com/ips-v6

然后粘贴以下内容到配置文件空白处:

Nginx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# IPv4
allow 103.21.244.0/22;
allow 103.22.200.0/22;
allow 103.31.4.0/22;
allow 104.16.0.0/12;
allow 108.162.192.0/18;
allow 131.0.72.0/22;
allow 141.101.64.0/18;
allow 162.158.0.0/15;
allow 172.64.0.0/13;
allow 173.245.48.0/20;
allow 188.114.96.0/20;
allow 190.93.240.0/20;
allow 197.234.240.0/22;
allow 198.41.128.0/17;

# IPv6
allow 2400:cb00::/32;
allow 2405:8100::/32;
allow 2405:b500::/32;
allow 2606:4700::/32;
allow 2803:f800::/32;
allow 2c0f:f248::/32;
allow 2a06:98c0::/29;

# Block
deny all;

按需设置,如果服务器只有 IPv4(或 IPv6)可以删除 IPv6(或 IPv4)的那部分。

5、其它配置

启用 WebSocket、gRPC 才能反向代理某些网站:

WebSocket

Cloudflare 不只是 CDN,也是一个免费的 DNS,并且支持免费的 DNSSEC:

DNSSEC

需要顶级域名支持,一般而言,通用顶级(例如.com)、新顶级(例如.top)都支持,部分国家域名(例如.al)不支持。

其它配置如页面规则、缓存在之后的文章中会和所有 CDN 的通用配置一同讲解。

6、写在最后

国内虽然访问 Cloudflare 慢:

加速前后对比

并且时常被阻断,但是 Cloudflare 的防御能力确实强大。在被攻击时,不妨切换到 Cloudflare 上试试,或者像我一样,把境外、云厂商都 CNAME 到 Cloudflare SaaS,而把境内解析到更快的 CDN。

另外,网站访问速度是较主观的,因为网页加载速度也会影响“访问速度”。例如由清北科技和 IURT 合作运营的 思刻问答 就托管于 Cloudflare 并且未自选任何 IP,用的就是默认的 IP,但是访问速度依然较好,这就是因为前后端分离,加载、切换页面的动画流畅,给用户一种近似于手机App 的使用体验。

CDN 调教指南(二)充分利用 Cloudflare

https://blog.tsinbei.com/tw/archives/1313/

文章作者
Hsukqi Lee
发布于

2023-06-24

修改于

2023-11-19

许可协议

CC BY-NC-ND 4.0

# DNSPod  DNS  Cloudflare  CDN

评论

昵称
邮箱
网址
暂无