10.16. DNS 关键词¶
Suricata 支持粘性缓冲区以及针对 DNS 消息中特定字段进行高效匹配的关键词。
请注意,粘性缓冲区通常后接一个或多个 有效载荷关键词。
10.16.1. dns.opcode¶
该关键词匹配 DNS 头部标志中的 opcode 字段。
dns.opcode 使用 无符号8位整数。
10.16.1.1. 语法¶
dns.opcode:[!]<数字>
dns.opcode:[!]<数字1>-<数字2>
10.16.1.2. 示例¶
匹配 opcode 为 4 的 DNS 请求和响应:
dns.opcode:4;
匹配 opcode 不为 0 的 DNS 请求:
dns.opcode:!0;
匹配 opcode 在 7 到 15 之间(不含边界)的 DNS 请求:
dns.opcode:7-15;
匹配 opcode 不在 7 到 15 之间的 DNS 请求:
dns.opcode:!7-15;
10.16.2. dns.rcode¶
该关键词匹配 DNS 头部标志中的 rcode 字段。
dns.rcode 使用 无符号8位整数。 也可以通过枚举文本指定。
当前 Suricata 仅支持 [0-15] 范围内的 rcode 值,而当前 DNS 版本根据 RFC 6895 支持 [0-23] 的 rcode 值。
我们计划根据 RFC 6895 扩展 Suricata 支持的 rcode 值,相关进展可通过工单跟踪:https://redmine.openinfosecfoundation.org/issues/6650
10.16.2.1. 语法¶
dns.rcode:[!]<数字>
dns.rcode:[!]<数字1>-<数字2>
10.16.2.2. 示例¶
匹配 rcode 为 4 的 DNS 请求和响应:
dns.rcode:4;
匹配 rcode 不为 0 的 DNS 请求和响应:
dns.rcode:!0;
10.16.3. dns.rrtype¶
该关键词匹配 DNS 消息中的 **rrtype**(整数)字段。
dns.rrtype 使用 无符号16位整数。
也可以通过枚举文本指定。
10.16.3.1. 语法¶
dns.rrtype:[!]<数字>
10.16.3.2. 示例¶
匹配 rrtype 为 4 的 DNS 请求和响应:
dns.rrtype:4;
匹配 rrtype 不为 0 的 DNS 请求和响应:
dns.rrtype:!0;
10.16.4. dns.query¶
dns.query
是一个粘性缓冲区,用于检查 DNS 请求消息中的查询名称。示例:
alert dns any any -> any any (msg:"测试 dns.query 选项"; dns.query; content:"google"; nocase; sid:1;)
作为粘性缓冲区,应在 dns.query
后使用如 content 等负载关键词:

dns.query
关键词会影响后续所有内容匹配,直到使用 pkt_data 或到达规则结尾。
Note
dns.query 等同于旧版 dns_query。
Note
dns.query 仅匹配 DNS 请求消息,若要同时匹配 DNS 响应消息,请参阅 dns.queries.rrname。
dns.queries.rrname
支持 多缓冲区匹配。
10.16.4.1. 标准化缓冲区¶
缓冲区包含字面域名
原始 DNS 请求中的 <length> 值被转换为字面的 '.' 字符
无前导 <length> 值
无终止 NULL (0x00) 字节(可使用否定相对
isdataat
匹配结尾)
示例 DNS 请求 "mail.google.com"(为便于阅读,十六进制值用竖线分隔):
原始 DNS 查询片段:
|04|mail|06|google|03|com|00|
dns.query
缓冲区:
mail.google.com
10.16.5. dns.queries.rrname¶
dns.queries.rrname
是一个粘性缓冲区,用于检查 DNS 查询(问题)资源记录中的名称字段。它与 dns.query
几乎相同,但同时支持 DNS 请求和响应。
dns.queries.rrname
会检查请求和响应,因此建议使用 flow
限定特定方向。
匹配的缓冲区包含完整重组后的资源名称,例如 "www.suricata.io"。
dns.queries.rrname
支持 多缓冲区匹配。
dns.queries.rrname
在 Suricata 8.0.0 中引入。
10.16.6. dns.answers.rrname¶
dns.answers.rrname
是一个粘性缓冲区,用于检查 DNS 应答资源记录中的名称字段。
dns.answers.rrname
会检查请求和响应,因此建议使用 flow
限定特定方向。
匹配的缓冲区包含完整重组后的资源名称,例如 "www.suricata.io"。
dns.answers.rrname
支持 多缓冲区匹配。
dns.answers.rrname
在 Suricata 8.0.0 中引入。
10.16.8. dns.additionals.rrname¶
dns.additionals.rrname
是一个粘性缓冲区,用于检查 DNS 附加资源记录中的 rrname 字段。
dns.additionals.rrname
会检查请求和响应,因此建议使用 flow
限定特定方向。
匹配的缓冲区包含完整重组后的资源名称,例如 "www.suricata.io"。
dns.additionals.rrname
支持 多缓冲区匹配。
dns.additionals.rrname
在 Suricata 8.0.0 中引入。
10.16.9. dns.response.rrname¶
dns.response.rrname
是一个粘性缓冲区,用于检查所有表示为资源名称(主机名)的 DNS 响应(应答)资源记录的名称和 rdata 字段。它支持检查所有 DNS 响应区段。示例:
alert dns any any -> any any (msg:"测试 dns.response.rrname 选项"; \
dns.response.rrname; content:"google"; nocase; sid:1;)
rdata
字段匹配支持包含域名结构数据的类型子集,例如:"www.suricata.io"。被检查的类型列表包括:
CNAME
PTR
MX
NS
SOA(mname 数据:主名称服务器)
匹配的缓冲区包含完整重组后的资源名称,例如 "www.suricata.io"。
dns.response.rrname
支持 多缓冲区匹配。
dns.response.rrname
在 Suricata 8.0.0 中引入。