Cloudflare-HTTPS-WAF-update.jpg

I. 主理人序

这是一个免费的,对所有用户等级开放的防火墙访问规则创建API,使用该API可自由创建IP访问规则;

II. Cloudflare zoneid&keys

首先先明确下会用到的一些授权,包括你的Cloudflare注册邮箱,key(即API keys),zoneid等;

Cloudflare zoneid 在哪里.jpg
Cloudflare keys 在哪里.jpg

查看 API 秘钥

Cloudflare - Api-key.png

查看 API 密钥(Key)
要检索 API 密钥,请执行以下操作:

1.登录 Cloudflare 仪表板。
2.在我的个人资料下拉列表下,单击我的个人资料。
3.单击 API 令牌选项卡。
4.在 API 密钥部分中,选择以下两个选项之一:“全局 API 密钥”或“Origin CA 密钥”。选择您要查看的 API 密钥。

官方文档管理 API 令牌和密钥;(请自行切换语言)

III. 创建防火墙访问规则(示例)

Cloudflare dashboard - 防火墙-工具

正常情况下,我们想要阻止某个IP(或ASN或IP段)访问我们的网站,我们可以在Cloudflare的控制面板-防火墙-工具进行设置,简单,直观;大家可以了解一下自己此时的IP(IP.SB),并创建该IP的访问规则如Block,然后重新访问自己的网站试试(如未生效,可在无痕模式下打开网站);

创建IP访问规则.png

如果我们要批量提交IP并执行Block(禁止访问)的话要怎么做呢?此时就需要使用到Cloudflare提供的免费API了!

什么是API

官方举例

Cloudflare 常用API - 批量提交异常IP并执行相应操作(block, challenge, whitelist, js_challenge)

API功能:Create Access Rule(用户级防火墙访问规则 - 创建访问规则);
适用用户:REE/PRO/BUSINESS/ENTERPRISE;

cURL (example)

curl -X POST "https://api.cloudflare.com/client/v4/user/firewall/access_rules/rules" \
     -H "X-Auth-Email: [email protected]" \
     -H "X-Auth-Key: c2547eb745079dac9320b638f5e225cf483cc5cfdda41" \
     -H "Content-Type: application/json" \
     --data '{"mode":"challenge","configuration":{"target":"ip","value":"198.51.100.4"},"notes":"This rule is on because of an event that occured on date X"}'

现在,我们动手制作一个可执行Shell脚本,假设命名为:cf.block.sh

#!/bin/bash
#cf.block.sh
CFEMAIL="填写你的Cloudflare注册邮箱"
CFAPIKEY="填写你的API Key"

curl -X POST "https://api.cloudflare.com/client/v4/user/firewall/access_rules/rules" \
     -H "X-Auth-Email: $CFEMAIL" \
     -H "X-Auth-Key: $CFAPIKEY" \
     -H "Content-Type: application/json" \
     --data '{"mode":"challenge","configuration":{"target":"ip","value":"198.51.100.4"},"notes":"Xddos-block"}'

PS:最新版本的API文档中似乎隐去了 ZoneID的引用,不用再加以认证;

运行 cf.block.sh,成功的话会返回如下提示

{
  "result": {
    "id": "fbe91b5409724825c2a654d2d8fe6087",
    "paused": false,
    "modified_on": "2021-04-04T02:26:56.373970627Z",
    "allowed_modes": [
      "whitelist",
      "block",
      "challenge",
      "js_challenge"
    ],
    "mode": "challenge",
    "notes": "Xddos-block",
    "configuration": {
      "target": "ip",
      "value": "198.51.100.4"
    },
    "scope": {
      "id": "f2f53e358b09b2502e6d936176206ef3",
      "email": "会显示你的邮箱",
      "type": "user"
    },
    "created_on": "2021-04-04T02:26:56.373870627Z"
  },
  "success": true,
  "errors": [],
  "messages": []
}

如果 "success" 值为 true则代表提交成功,此时可到 Cloudflare dashboard - 防火墙 - 工具 进行查看;

Cloudflare dashboard - 防火墙 - 工具.png

Perfect!

现在,在回过头来看官方示例

curl -X POST "https://api.cloudflare.com/client/v4/user/firewall/access_rules/rules" \
     -H "X-Auth-Email: [email protected]" \
     -H "X-Auth-Key: c2547eb745079dac9320b638f5e225cf483cc5cfdda41" \
     -H "Content-Type: application/json" \
     --data '{"mode":"challenge","configuration":{"target":"ip","value":"198.51.100.4"},"notes":"This rule is on because of an event that occured on date X"}'

其中所使用的命令行工具是 curl,用以模拟发起 HTTP 请求;而 HTTP 请求方法 又有 9 种;

序号 方法 描述
1 GET 请求指定的页面信息,并返回实体主体。
2 HEAD 类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头
3 POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立和/或已有资源的修改。
4 PUT 从客户端向服务器传送的数据取代指定的文档的内容。
5 DELETE 请求服务器删除指定的页面。
6 CONNECT HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。
7 OPTIONS 允许客户端查看服务器的性能。
8 TRACE 回显服务器收到的请求,主要用于测试或诊断。
9 PATCH 是对 PUT 方法的补充,用来对已知资源进行局部更新 。

以上,那么问题来了:之前封禁的IP如何批量解封(删除规则)呢?用的是DELETE,需要进行两个操作,在此不表。(参阅

IV. 批量提交恶意IP(示例)

刚刚是单个IP提交,现在试试批量提交,你需要有:

1.存储这个恶意IP的文本,例如badip.txt
2.badip.txt 内容如下:(大家可以拿来测试用)

62.171.177.80
103.84.71.10
176.119.156.142
103.87.170.115
157.119.50.114
207.74.74.6
110.77.185.83
157.7.142.243
103.124.137.50

3.使用 for 循环进行提交;

#!/bin/bash
#cf.batchban.sh
CFEMAIL="填写你的Cloudflare注册邮箱"
CFAPIKEY="填写你的API Key"
IPADDR=$(</home/badip.txt)

for i in ${IPADDR[@]}; do
curl -X POST "https://api.cloudflare.com/client/v4/user/firewall/access_rules/rules" \
     -H "X-Auth-Email: $CFEMAIL" \
     -H "X-Auth-Key: $CFAPIKEY" \
     -H "Content-Type: application/json" \
     --data '{"mode":"block","configuration":{"target":"ip","value":"'$i'"},"notes":"Xddos-block"}'
done

V. 如何从访问日志捕获恶意IP

搞定!如何捕获恶意IP请听下回分解;(每个人的实现方法不同,在此不表)

VI. 附注

(for 循环脚本,批量提交异常IP表,在此感谢原脚本作者:https://www.9sep.org/

最后修改:2021 年 05 月 11 日 12 : 46 AM