跳到主要内容
版本:v6.x

CC规则

路径:管理后台 → 网站管理 → CC规则,分 规则组 / 匹配器 / 过滤器 三个选项卡。

Cdnfly 的防CC规则主要由三部分组成:匹配器、过滤器、动作。

  • 匹配器:用来匹配用户的请求。一个匹配器可以添加多个匹配条件,所有条件都满足时该匹配器才为真(条件之间为"且"关系)。匹配上请求后,交给过滤器验证。
  • 过滤器:用来对客户请求进行验证,比如统计请求数是否超限、是否通过滑动验证、是否跳转到正确的URL等。验证失败超过指定次数,就执行规则指定的动作。
  • 动作:当请求无法通过过滤器时,执行相应的动作(拉黑或仅记录)。

匹配器

路径:CC规则 → 匹配器 → 添加匹配器。

匹配器由匹配项、操作符、匹配值组成。比如匹配项是"IP地址",操作符是"=",匹配值是 192.168.0.1,表示客户端IP是 192.168.0.1 才算匹配。

添加匹配器

匹配项

  • IP地址 - 客户端IP地址
  • 域名 - 客户请求的域名
  • 请求URI - 请求的url,如 /123.php?a=1,保留参数匹配
  • 请求URI(不带参数) - 去除参数的url,如原始 /123.php?a=1,处理后变成 /123.php 再匹配
  • 请求头 - 指定某个HTTP请求头的值
  • 独立UA数量 - 统计该客户端使用过的不同UA数量
  • 404状态码数量 - 统计该客户端触发404的次数
  • 请求方法 - 如 GET、POST 等
  • 浏览器UA - 如 Mozilla/5.0 ... Chrome/83.0.4103.116 Safari/537.36
  • 请求来源 - 即 Referer
  • 国家代码 - 两位字母国家代码,如 CN,完整列表见 https://www.iban.com/country-codes
  • AS号码 - 客户端IP所属的自治系统号
  • 省份 - 客户端IP所属省份
  • 城市 - 客户端IP所属城市
  • 运营商 - 客户端IP所属运营商
  • HTTP版本 - 请求协议版本,如 HTTP/1.1、HTTP/2
  • 请求头accept_language - 客户端接受语言
  • TLS指纹 - 客户端TLS握手指纹
  • 独立TLS指纹数量 - 统计该客户端使用过的不同TLS指纹数量

操作符

  • 等于(=) - 与匹配值完全一致条件才成立
  • 不等于(!=) - 参考等于
  • 大于(>) - 用于数量类匹配项,如独立UA数量、404状态码数量
  • 包含 - 要匹配的值包含有匹配值条件就成立,如请求URI为 /index.php,匹配值为 php 时条件成立
  • 不包含 - 参考包含
  • 前缀匹配 - 从前面开始匹配,如请求URI为 /api/index,匹配值为 /api 时条件成立
  • 后缀匹配 - 从尾部开始匹配,如请求URI为 /api/index,匹配值为 index 时条件成立
  • 正则匹配 - 如 ^/[0-9]+,匹配以 / 开头后接数字的URI
  • 正则不匹配 - 参考正则匹配
  • 存在 / 不存在 - 用于判断某个匹配项(如请求头)是否存在
  • IP段匹配 / IP段不匹配 - 判断IP是否属于某个CIDR段,如 192.168.0.0/24

过滤器

路径:CC规则 → 过滤器 → 添加过滤器。

添加过滤器

过滤器分为系统规则(全局可用)和用户规则(只归属选中用户)。v6 支持的防护类型:

  • 请求频率 - 限制客户在一定时间内的总请求次数,可以限制总的URL请求数,也可以限制同一个URL累积的请求数
  • 无感验证 - 浏览器自动识别,客户无感知完成验证
  • 5秒盾 - 类似无感验证的延时跳转验证,约5秒后自动放行
  • 点击验证 - 客户需要点击页面完成验证
  • 点击验证(简单) - 简化版点击验证
  • 滑动验证 - 客户需要拖动滑动条才算验证通过
  • 滑动验证(简单) - 简化版滑动验证
  • 验证码 - 客户需要输入正确的验证码提交才算验证通过
  • 旋转图片 - 客户需要把旋转的图片摆正才算验证通过
  • 302跳转 - cdnfly 302返回一个url,客户跟随访问这个URL才算验证通过
  • URL鉴权 - 适用API类防CC攻击,见下文

验证类过滤器需要设置触发阈值:统计周期(秒)+ 允许验证失败次数。比如统计周期60秒、允许失败5次,表示60秒内验证失败超过5次就执行动作。

URL鉴权

URL鉴权过滤器适用API类防CC攻击。需要与客户端配合:cdn 定义一个密钥,客户端对 uri、时间戳、随机数、密钥做 md5,得出的值传给 cdn 验证,验证失败到一定次数将拉黑这个IP。URL鉴权提供两种鉴权方式:A 和 B。

URL鉴权配置

方式A

URL格式为 http://DomainName/img/FileName?sign=md5hash&t=timestamp

timestamp 为当前时间戳,如 1598342331(签名用的时间戳与参数 t 的时间戳需要一致),md5hash 为 md5(密钥+uri+时间戳);如果开启 IP鉴权(客户端IP地址为 192.168.0.8),那么 md5hash 为 md5(密钥+uri+时间戳+IP地址)。其中密钥为在 cdn 定义好的密钥,md5hash 为 32 位,uri 为不带参数的路径,且要转为小写再做 md5,如 /img/filename,时间戳精确到秒即可。

方式A的设置说明:

  • 统计周期 / 允许验证失败 - 即如果在60秒内验证失败超过5次,拉黑IP
  • 鉴权方式 - 这里选方式A
  • 密钥 - 与其它数据一起 md5 得到 hash,客户端同样使用这里定义的密钥来 md5
  • 签名参数名 - 默认为 sign
  • 时间戳参数名 - 默认为 t
  • 最大时间差(秒) - 允许上下相差多少秒,超过此范围签名认为无效
  • 签名可用次数 - 带同一个签名的url允许访问的次数,0为不限制,超过限制则拉黑IP

javascript 示例代码:

// 获取时间戳
let timeStamp = Date.parse(new Date()) / 1000;

// 将要请求的原始url
let url = "http://for-test.cdnfly.cn/index.php?model=abc"

// 从原始url中获取其路径
let urlObj = new URL(url)
let path = urlObj.pathname.toLowerCase()

// cdn后台配置的密钥
let key = "KRcz58Wn4yBprtc2"

// 对密钥、路径、时间戳md5签名
let sign = md5(key+path+timeStamp)

// 生成新的请求url
if (urlObj.search == "") {
let newUrl = url+"?sign=" + sign+"&t="+timeStamp
} else {
let newUrl = url+"&sign=" + sign+"&t="+timeStamp
}
console.log(newUrl)

方式B

URL格式为 http://DomainName/img/Filename?sign=timestamp-rand-uid-md5hash

timestamp 为当前时间戳,如 1598342331;rand 为随机字符串(只需要取一次,之后都用这个);uid 用户id暂时不用,设置为 0;md5hash 为 md5(uri-时间戳-随机字符串-uid-密钥),如果开启 IP鉴权(客户端IP地址为 192.168.0.8),那么 md5hash 为 md5(uri-时间戳-随机字符串-uid-密钥-IP地址)。uri 转为小写再 md5,md5 的计算包含连接符 -

方式B与方式A的设置不同之处在于,方式B不需要单独传时间戳参数,因为已经包含在签名参数里了。其余设置与方式A一样。

动作

v6 的动作在新增规则时选择,有两种:

  • 拉黑(block) - 拦截该IP,被拉黑的IP无法再消耗节点资源,效果最好
  • 仅记录(log) - 不拉黑、不断开,只记录日志,请求继续被过滤器过滤

规则

路径:CC规则 → 规则组 → 选中规则组 → 新增规则。

规则由匹配器、过滤器、动作组成。

新增规则
  • 可以指定一个或两个过滤器:
    • 当指定一个过滤器时,这个过滤器验证失败就直接执行动作;
    • 当指定两个过滤器时(过滤器1和过滤器2),过滤器1验证失败还不会执行动作,而是继续用过滤器2验证,只有两个过滤器都验证失败时才执行动作。这样可以有效减少误封,比如过滤器1用请求频率、过滤器2用滑动验证,可以防止误封请求量比较大的客户。
  • 匹配模式
    • 继续下一条规则 - 执行当前过滤器后,继续匹配下一条规则;
    • 停止匹配 - 执行当前过滤器后,不再继续匹配下一条规则。

规则组

一个或多个规则组成一个规则组,网站绑定的是规则组。规则组中的规则按排序顺序依次匹配。