DNS 关键词 ============ Suricata 支持粘性缓冲区以及针对 DNS 消息中特定字段进行高效匹配的关键词。 请注意,粘性缓冲区通常后接一个或多个 :doc:`payload-keywords`。 dns.opcode ---------- 该关键词匹配 DNS 头部标志中的 **opcode** 字段。 dns.opcode 使用 :ref:`无符号8位整数 `。 语法 ~~~~~~ :: dns.opcode:[!]<数字> dns.opcode:[!]<数字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; dns.rcode --------- 该关键词匹配 DNS 头部标志中的 **rcode** 字段。 dns.rcode 使用 :ref:`无符号8位整数 `。 也可以通过枚举文本指定。 当前 Suricata 仅支持 [0-15] 范围内的 rcode 值,而当前 DNS 版本根据 `RFC 6895 `_ 支持 [0-23] 的 rcode 值。 我们计划根据 RFC 6895 扩展 Suricata 支持的 rcode 值,相关进展可通过工单跟踪:https://redmine.openinfosecfoundation.org/issues/6650 语法 ~~~~~~ :: dns.rcode:[!]<数字> dns.rcode:[!]<数字1>-<数字2> 示例 ~~~~~~~~ 匹配 **rcode** 为 4 的 DNS 请求和响应:: dns.rcode:4; 匹配 **rcode** 不为 0 的 DNS 请求和响应:: dns.rcode:!0; dns.rrtype ---------- 该关键词匹配 DNS 消息中的 **rrtype**(整数)字段。 dns.rrtype 使用 :ref:`无符号16位整数 `。 也可以通过枚举文本指定。 语法 ~~~~~~ :: dns.rrtype:[!]<数字> 示例 ~~~~~~~~ 匹配 **rrtype** 为 4 的 DNS 请求和响应:: dns.rrtype:4; 匹配 **rrtype** 不为 0 的 DNS 请求和响应:: dns.rrtype:!0; dns.query --------- ``dns.query`` 是一个粘性缓冲区,用于检查 DNS 请求消息中的查询名称。示例:: alert dns any any -> any any (msg:"测试 dns.query 选项"; dns.query; content:"google"; nocase; sid:1;) 作为粘性缓冲区,应在 ``dns.query`` 后使用如 content 等负载关键词: .. image:: dns-keywords/dns_query.png ``dns.query`` 关键词会影响后续所有内容匹配,直到使用 pkt_data 或到达规则结尾。 .. note:: **dns.query** 等同于旧版 **dns_query**。 .. note:: **dns.query** 仅匹配 DNS 请求消息,若要同时匹配 DNS 响应消息,请参阅 `dns.queries.rrname`_。 ``dns.queries.rrname`` 支持 :doc:`multi-buffer-matching`。 标准化缓冲区 ~~~~~~~~~~~~~~~~~ 缓冲区包含字面域名 - 原始 DNS 请求中的 值被转换为字面的 '.' 字符 - 无前导 值 - 无终止 NULL (0x00) 字节(可使用否定相对 ``isdataat`` 匹配结尾) 示例 DNS 请求 "mail.google.com"(为便于阅读,十六进制值用竖线分隔): 原始 DNS 查询片段:: |04|mail|06|google|03|com|00| ``dns.query`` 缓冲区:: mail.google.com dns.queries.rrname ------------------ ``dns.queries.rrname`` 是一个粘性缓冲区,用于检查 DNS 查询(问题)资源记录中的名称字段。它与 ``dns.query`` 几乎相同,但同时支持 DNS 请求和响应。 ``dns.queries.rrname`` 会检查请求和响应,因此建议使用 ``flow`` 限定特定方向。 匹配的缓冲区包含完整重组后的资源名称,例如 "www.suricata.io"。 ``dns.queries.rrname`` 支持 :doc:`multi-buffer-matching`。 ``dns.queries.rrname`` 在 Suricata 8.0.0 中引入。 dns.answers.rrname ------------------ ``dns.answers.rrname`` 是一个粘性缓冲区,用于检查 DNS 应答资源记录中的名称字段。 ``dns.answers.rrname`` 会检查请求和响应,因此建议使用 ``flow`` 限定特定方向。 匹配的缓冲区包含完整重组后的资源名称,例如 "www.suricata.io"。 ``dns.answers.rrname`` 支持 :doc:`multi-buffer-matching`。 ``dns.answers.rrname`` 在 Suricata 8.0.0 中引入。 dns.authorities.rrname ---------------------- ``dns.authorities.rrname`` 是一个粘性缓冲区,用于检查 DNS 权威资源记录中的 rrname 字段。 ``dns.authorities.rrname`` 会检查请求和响应,因此建议使用 ``flow`` 限定特定方向。 匹配的缓冲区包含完整重组后的资源名称,例如 "www.suricata.io"。 ``dns.authorities.rrname`` 支持 :doc:`multi-buffer-matching`。 ``dns.authorities.rrname`` 在 Suricata 8.0.0 中引入。 dns.additionals.rrname ---------------------- ``dns.additionals.rrname`` 是一个粘性缓冲区,用于检查 DNS 附加资源记录中的 rrname 字段。 ``dns.additionals.rrname`` 会检查请求和响应,因此建议使用 ``flow`` 限定特定方向。 匹配的缓冲区包含完整重组后的资源名称,例如 "www.suricata.io"。 ``dns.additionals.rrname`` 支持 :doc:`multi-buffer-matching`。 ``dns.additionals.rrname`` 在 Suricata 8.0.0 中引入。 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`` 支持 :doc:`multi-buffer-matching`。 ``dns.response.rrname`` 在 Suricata 8.0.0 中引入。