说明
rrl 插件会按响应类别跟踪响应速率。给定响应的类别由以下内容组成
- 客户端 IP 的前缀(根据 ipv4/6-prefix-length)
- 请求的名称 (qname),不包括错误响应类型(请参见以下响应类型)
- 请求的类型 (qtype),不包括错误响应类型(请参见以下响应类型)
- 响应类型(每个响应类型对应一个可配置的每秒津贴)
- response - 针对包含答案的积极响应
- nodata - 针对 NODATA 响应
- nxdomain - 针对 NXDOMAIN 响应
- referrals - 针对引荐或委派
- error - 针对所有 DNS 错误(除了 NXDOMAIN)
为了更好地防范使用无效请求发起的攻击,对于错误类型请求,请求的名称和类型不会分别归类。换句话说,所有错误响应均按客户端汇总限制,与 qname 或 qtype 无关。
每个类别都有一个帐户余额,该余额按该响应类型的已配置的每秒津贴记入,并且每向客户端发送该类别中的响应时都会扣除该金额。当帐户余额为负数时,将丢弃该类别中的响应,直到余额变为非负数为止。帐户余额不能大于每秒津贴,也不能小于窗口 * 每秒津贴。
响应速率限制实施的目的是复制 BIND 9 的响应速率限制功能的行为。
限制请求时,每个请求的类别由客户端 IP 的前缀决定(根据 ipv4/6-prefix-length)。
语法
rrl [ZONES...] {
window SECONDS
ipv4-prefix-length LENGTH
ipv6-prefix-length LENGTH
responses-per-second ALLOWANCE
nodata-per-second ALLOWANCE
nxdomains-per-second ALLOWANCE
referrals-per-second ALLOWANCE
errors-per-second ALLOWANCE
requests-per-second ALLOWANCE
max-table-size SIZE
report-only
}
-
window 秒数
- 进行响应速率跟踪的秒数滚动窗口。默认值为 15。 -
ipv4-prefix-length 长度
- 用于标识 ipv4 客户端的长度(以位为单位)。默认值为 24。 -
ipv6-prefix-length 长度
- 用于标识 ipv6 客户端的长度(以位为单位)。默认值为 56。 -
responses-per-second 津贴
- 每秒允许的积极响应数量。津贴为 0 表示禁用积极响应的速率限制。默认值为 0。 -
nodata-per-second 津贴
- 每秒允许的NODATA
响应数量。津贴为 0 表示禁用 NODATA 响应的速率限制。默认为 responses-per-second。 -
nxdomain-per-second 许可
- 每秒允许的NXDOMAIN
响应数。许可为 0 将禁用 NXDOMAIN 响应的速率限制。默认为 responses-per-second。 -
referrals-per-second 许可
- 每秒允许的引荐响应数。许可为 0 将禁用引荐响应的速率限制。默认为 responses-per-second。 -
errors-per-second 许可
- 每秒允许的错误响应数(不包括 NXDOMAIN)。许可为 0 将禁用错误响应的速率限制。默认为 responses-per-second。 -
requests-per-second 许可
- 每秒允许的请求数。许可为 0 将禁用请求的速率限制。默认为 0。 -
max-table-size 大小
- 同时跟踪的最大响应数。当超出时,rrl 将停止对新响应进行速率限制。默认为 100000。 -
仅报告
- 当超出速率时,不丢弃请求/响应,仅记录指标。默认为 false。
指标
如果启用了监控(通过 prometheus 插件),则会导出以下指标
coredns_rrl_responses_exceeded_total{client_ip}
- 超过 QPS 限制的响应计数器。coredns_rrl_requests_exceeded_total{client_ip}
- 超过 QPS 限制的请求计数器。
示例
示例 1
. {
rrl . {
responses-per-second 10
}
}
错误/已知问题/限制
BIND9 的响应速率限制实现将以通配符基本域为单位为每个帐户中的所有生成通配符记录限制速率。例如 a.dom.com.
和 b.dom.com.
都将计为 dom.com.
,如果它们是由通配符记录 *.dom.com.
生成的。
根据 BIND 9.11 ARM...
从局部通配符生成的响应将被计入并限制,就好像它们是父域名一样。这控制使用 random.wild.example.com 进行泛滥攻击。
在 CoreDNS 中,rrl 通配符响应被单独计入。