0、前言
谈到 DDoS 防御,所有人可能立刻想起的就是 Cloudflare 了。即使是免费版,Cloudflare也提供无上限的 DDoS 防御,强大的控制台更是提供了丰富的功能等待我们去探索。所以,我们在接入任何其他 CDN 前,都应该先考虑充分利用免费版的 Cloudflare(买得起付费计划当然更好,可以省略很多步骤)。
1、接入
接入方式分为两种:
- NS 接入;
- 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/archives/1315/
使用 CNAME 接入后,就可以把在 DNSPod 等处的 CNAME 记录自行修改为需要的 Cloudflare IP,例如下文提到的优选 IP。
2、绕过备案
参考本站文章:
使用 Cloudflare 自定义回源端口绕过备案阻断
https://blog.tsinbei.com/archives/1281/
3、优选 IP
参考本站文章:
CDN 调教指南(三)优选 Cloudflare IP
https://blog.tsinbei.com/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、默认网站设置空证书
以宝塔面板为例,添加一个网站并设为默认,并且设置空白证书:
(私钥)
1 | -----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----- |
(证书)
1 | -----BEGIN CERTIFICATE----- MIIBkjCB/AIJAI3bCYqa39hiMA0GCSqGSIb3DQEBBQUAMA0xCzAJBgNVBAYTAiAg MCAXDTE4MTEyNDA5MDMzOFoYDzIwOTkxMjMxMDkwMzM4WjANMQswCQYDVQQGEwIg IDCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA18hepvNcznqDj735Opxircn3 M0Ruv8nkpHHPuurxr6tLPKAe1XAsy5dWHDbK7t4sXpT0ds9c74yqmvfwKofPk7z9 ZBhmyw/5sp454/JftL1c2fr58wB9ETfX6as5aR5hQR0M0NuQLSAB/KVzi9eeNWDd EzT0QN5B1Ai9BR/ApMMCAwEAATANBgkqhkiG9w0BAQUFAAOBgQBiqHZsuVP09ubT GzBSlAFEoqbM63sU51nwQpzkVObgGm9v9nnxS8Atid4be0THsz8nVjWcDym3Tydp lznrhoSrHyqAAlK3/WSMwyuPnDCNM5g1RdsV40TjZXk9/md8xWxGJ6n1MoBdlK8T H6h2ROkf59bb096TttB8lxXiT0uiDQ== -----END CERTIFICATE----- |
效果:
然后在伪静态(或者配置文件,找个空白行)填入:
1 | return 444; |
如果是 Apache:
1 | 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
然后粘贴以下内容到配置文件空白处:
1 | # 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 才能反向代理某些网站:
Cloudflare 不只是 CDN,也是一个免费的 DNS,并且支持免费的 DNSSEC:
需要顶级域名支持,一般而言,通用顶级(例如.com)、新顶级(例如.top)都支持,部分国家域名(例如.al)不支持。
其它配置如页面规则、缓存在之后的文章中会和所有 CDN 的通用配置一同讲解。
6、写在最后
国内虽然访问 Cloudflare 慢:
并且时常被阻断,但是 Cloudflare 的防御能力确实强大。在被攻击时,不妨切换到 Cloudflare 上试试,或者像我一样,把境外、云厂商都 CNAME 到 Cloudflare SaaS,而把境内解析到更快的 CDN。
另外,网站访问速度是较主观的,因为网页加载速度也会影响“访问速度”。例如由清北科技和 IURT 合作运营的 思刻问答 就托管于 Cloudflare 并且未自选任何 IP,用的就是默认的 IP,但是访问速度依然较好,这就是因为前后端分离,加载、切换页面的动画流畅,给用户一种近似于手机App 的使用体验。
CDN 调教指南(二)充分利用 Cloudflare
评论