[TOC]
Cdnfly的防cc规则主要由三部分组成匹配器,过滤器,动作。
* **匹配器**: 用来匹配用户的请求,可以匹配用户IP,Host,req\_uri(带参数),uri(不带参数),user\_agent和referer。一个匹配器可以有多个匹配项,添加多个匹配项时,此匹配器所有的匹配项都满足时,这个匹配器才为真。如果匹配了请求,就使用下面的过滤器来对请求进行验证。
* **过滤器**: 用来对客户请求进行验证,比如统计请求数是否超限,是否输入对验证码,是否跳转到正确的URL等,如果验证次数超过指定次数,那么就执行下面指定的动作来拦截。
* **动作**: 当请求无法通过过滤器时,执行相应的动作。
## 匹配器
匹配器由匹配项,操作符,匹配值组成。比如匹配项是IP,操作符是=,匹配值是192.168.0.1,表示客户端IP是192.168.0.1才算匹配。
### 匹配项

* ip - 客户端IP地址
* host - 客户请求的域名
* req_uri - 保留参数的url,如原始123.php?a=1,经处理,还是123.php?a=1;或者123.php,经处理还是123.php
* uri - 去除参数的url,如原始123.php?a=1,经处理变成123.php;或者123.php,经处理还是123.php
* user_agent - 浏览器名称,如Mozilla/5.0 (Macintosh; Intel Mac OS X 10\_14\_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36
* referer - 请求url的来源
* content_type - 客户请求url返回内容的类型;由于需要请求一次,才知道内容类型,所以当一个url第一次请求时,这个的值将为空,第二次才会有具体的类型值。如首次请求1.html,content_type值为空,第二次请求时,content_type为text/html; charset=UTF-8
* country_iso_code - 由于两位字母表示某个国家的客户,比如CN表示在中国网络下请求网站的客户,完整的国家代码列表[https://www.iban.com/country-codes](https://www.iban.com/country-codes)
### 操作符

* = - 全匹配,比如匹配项是user_agent(Chrome/83.0.4103.116),操作符是=,匹配值为Chrome,这样是不匹配的,只有匹配值完全等于匹配项的值Chrome/83.0.4103.116时,才算匹配。
* != - 全匹配取反
* contain - 是否包含某个字符串,比如匹配项是user_agent(Chrome/83.0.4103.116),操作符是contain,匹配值为Chrome,这样是匹配的。
* !contain - contain取反
* AC - Aho-Corasick算法匹配,简称AC,可以同时对多个值进行匹配,任意一个值匹配成功就算匹配了。多个值以逗号分隔,如匹配项为ip,操作符为AC,匹配值192.168.0.1,192.168.0.2,表示匹配客户端的IP是否为192.168.0.1或者192.168.0.2,如果是其中一个,就算匹配了。
* !AC - AC取反
## 过滤器

### 请求速率

限制客户在一定时间内的总请求次数。可以限制总的URL请求数,也可以限制同一个URL累积的请求数。
### 302跳转
当客户请求cdnfly节点时,cdnfly会302返回一个url,客户跟随访问这个URL才算验证通过,否则算失败。
### 浏览器识别
客户请求cdnfly节点时,cdnfly返回一段带跳转功能的js代码,客户跟随访问这个URL才算验证通过,否则算失败。
### 滑动验证
客户请求cdnfly节点时,cdnfly返回一个滑动条,客户需要拖动滑动条才算验证通过,否则算失败。
### 验证码
客户请求cdnfly节点时,cdnfly返回一个验证码,客户需要输入正确的验证码提交才算验证通过,否则算失败。
### URL鉴权
url鉴权过滤器适用时API类防cc攻击。需要与客户端配合,cdn定义一个密钥,客户端md5如uri,时间戳,随机数,密钥,得出的值传给cdn验证,验证失败到一定次数将拉黑这个IP。URL鉴权提供两种鉴权方式,A和B。
* 方式A
URL格式为http://DomainName/img/FileName?sign=md5hash&t=timestamp
timestamp为当前时间戳,如1598342331,md5hash为md5(密钥uri时间戳),其中密钥为在cdn定义好的密钥,uri为不带参数的路径,且要转为**小写**再做md5,如/img/filename,时间戳为1598342331(精确到秒就行)
方式A的设置如下

**n秒内,最大失败次数** - 即如果在60秒内,验证失败超过5次的话,拉黑IP
**鉴权方式** - 这里选TypeA
**密钥** - 与其它数据一起md5得到的hash,客户端同样使用这里定义的密钥来md5
**签名参数名** - 默认为sign
**时间戳参数名** - 默认t
**最大时间相差(秒)** - 允许上下相关多少秒,超过此范围签名认为无效
**签名使用次数** - 带同一个签名的url允许访问的次数,0为不限制,越过限制则拉黑IP
* 方式B
URL格式为http://DomainName/img/Filename?sign=timestamp-rand-uid-md5hash
timestamp为当前时间戳,如1598342331,rand为随机字符串(只需要取一次,之后都是用这个),uid用户id暂时不用,设置为0,md5hash为md5(uri-时间戳-随机字符串-uid-密钥),uri转为小写再md5,md5的计算包含连接符-
方式B设置如下:

方式B与方式A的设置不一样的方式在于,方式B不需要传时间戳的参数,因为已经包括在签名参数里了。
其中的设置与方式A一样。
### 点击验证
待开发
## 动作
### ipset
使用iptables的ipset模块拦黑ip,拉黑IP后,此IP不再能够消耗资源,效果最好
### exit
cdn自己主动断开连接,此IP还是能够与cdn建立连接来消耗资源
### log
不拦黑,不断开,一直使用过滤器过滤
## 规则
规则由匹配器,过滤器,动作组成。

这里需要说明的是可以指定一个或两个过滤器。
当指定一个过滤器时,当这个过滤器验证失败时,直接执行动作;
当指定两个过滤器时,即指定过滤器1和过滤器2,那么当过滤器1验证失败,这时还不会执行动作,而是继续使用过滤器2验证,只有当两个过滤器都验证失败时,才执行动作。这样可以有效减少误封,比如过滤器1使用请求频率,过滤器2使用滑动验证,这样可以防止误封请求量比较大的客户。
## 规则组
一个或多个规则组成一个。网站就是绑定的规则组。
- Cdnfly介绍
- 功能介绍
- 性能数据
- 安装说明
- 管理员文档
- 快速开始
- 节点管理
- DNS设置
- 线路分组
- CC参数配置
- 套餐管理
- 全局配置
- 充值设置
- SMTP设置
- 用户文档
- 网站管理
- 新增网站
- 网站编辑
- 缓存配置
- 刷新预热
- 证书管理
- CC规则
- ACL管理
- 四层转发
- 新增转发
- 转发编辑
- API文档
- 使用介绍
- 用户端
- 用户相关
- 帐号登录 /v1/login
- 重置用户密码 /v1/reset-pass
- 获取邮箱验证码 /v1/email-captcha
- 获取手机验证码 /v1/phone-captcha
- 获取、修改用户信息、注册用户 /v1/user
- 实名认证 /v1/user/certify
- 网站相关
- 网站管理 /v1/sites
- 网站分组 /v1/site-groups
- 网站证书 /v1/certs
- 申请证书的dnsapi /v1/dnsapis
- 网站ACL /v1/acls
- CC规则匹配器 /v1/cc-matchs
- CC规则过滤器 /v1/cc-filters
- CC规则组 /v1/cc-rules
- 网站任务(刷新预热、解锁、日志下载) /v1/jobs
- 四层相关
- 四层转发 /v1/streams
- 转发分组 /v1/stream-groups
- 套餐相关
- 在售套餐分组 /v1/package-groups
- 在售套餐 /v1/packages
- 在售升级包 /v1/package-ups
- 用户套餐 /v1/user-packages
- 用户套餐升级包 /v1/user-package/<package_id>/upgrades
- 套餐用量查询 /v1/user-package/<package_id>/usage
- 监控数据
- 网站实时统计 /v1/monitor/site/realtime
- 网站资源排行 /v1/monitor/site/top
- 网站黑名单 /v1/monitor/site/blackip
- 网站实时访问日志 /v1/monitor/site/access-log
- 用量查询 /v1/monitor/usage
- 转发实时统计 /v1/monitor/stream/realtime
- 转发资源排行 /v1/monitor/stream/top
- 消息相关
- 订阅消息 /v1/messages/sub
- 消息已读 /v1/messages/read
- 消息列表 /v1/messages
- 充值相关
- 微信充值 /v1/wxpay/preorder
- 支付宝充值 /v1/alipay/preorder
- 其它
- 订单查询 /v1/orders
- 获取系统配置 /v1/configs
- 登录日志 /v1/log/login
- 操作日志 /v1/log/op
- 用户端数据概览 /v1/user/overview
- api key管理 /v1/api-key
- 显示图片验证码 /v1/common/captcha
- 显示系统信息 /v1/common/sysinfo
- 注册信息 /v1/common/register-info
- 管理端
- 用户管理 /v1/users
- 用户充值 /v1/user/<用户ID>/recharge
- 区域管理 /v1/regions
- 节点管理 /v1/nodes
- 线路组管理 /v1/node-groups
- 线路管理 /v1/lines
- 基础套餐管理 /v1/packages
- 套餐组管理 /v1/package-groups
- 升级包管理 /v1/package-ups
- 用户套餐管理 /v1/user-packages
- api key管理 /v1/api-key
- FAQ