]> git.ipfire.org Git - thirdparty/pdns.git/blob - pdns/dnsdistdist/docs/rules-actions.rst
dnsdist: Add documentation and a regression test for FFI functions
[thirdparty/pdns.git] / pdns / dnsdistdist / docs / rules-actions.rst
1 Packet Policies
2 ===============
3
4 dnsdist works in essence like any other loadbalancer:
5
6 It receives packets on one or several addresses it listens on, and determines whether it will process this packet based on the :doc:`advanced/acl`. Should the packet be processed, dnsdist attempts to match any of the configured rules in order and when one matches, the associated action is performed.
7
8 These rule and action combinations are considered policies.
9
10 Packet Actions
11 --------------
12
13 Each packet can be:
14
15 - Dropped
16 - Turned into an answer directly
17 - Forwarded to a downstream server
18 - Modified and forwarded to a downstream and be modified back
19 - Be delayed
20
21 This decision can be taken at different times during the forwarding process.
22
23 Examples
24 ~~~~~~~~
25
26 Rules for traffic exceeding QPS limits
27 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
28
29 Traffic that exceeds a QPS limit, in total or per IP (subnet) can be matched by a rule.
30
31 For example::
32
33 addAction(MaxQPSIPRule(5, 32, 48), DelayAction(100))
34
35 This measures traffic per IPv4 address and per /48 of IPv6, and if traffic for such an address (range) exceeds 5 qps, it gets delayed by 100ms. (Please note: :func:`DelayAction` can only delay UDP traffic).
36
37 As another example::
38
39 addAction(MaxQPSIPRule(5), NoRecurseAction())
40
41 This strips the Recursion Desired (RD) bit from any traffic per IPv4 or IPv6 /64 that exceeds 5 qps.
42 This means any those traffic bins is allowed to make a recursor do 'work' for only 5 qps.
43
44 If this is not enough, try::
45
46 addAction(MaxQPSIPRule(5), DropAction())
47
48 or::
49
50 addAction(MaxQPSIPRule(5), TCAction())
51
52 This will respectively drop traffic exceeding that 5 QPS limit per IP or range, or return it with TC=1, forcing clients to fall back to TCP.
53
54 To turn this per IP or range limit into a global limit, use ``NotRule(MaxQPSRule(5000))`` instead of :func:`MaxQPSIPRule`.
55
56 Regular Expressions
57 ^^^^^^^^^^^^^^^^^^^
58
59 :func:`RegexRule` matches a regular expression on the query name, and it works like this::
60
61 addAction(RegexRule("[0-9]{5,}"), DelayAction(750)) -- milliseconds
62 addAction(RegexRule("[0-9]{4,}\\.example$"), DropAction())
63
64 This delays any query for a domain name with 5 or more consecutive digits in it.
65 The second rule drops anything with more than 4 consecutive digits within a .example domain.
66
67 Note that the query name is presented without a trailing dot to the regex.
68 The regex is applied case insensitively.
69
70 Alternatively, if compiled in, :func:`RE2Rule` provides similar functionality, but against libre2.
71
72 Rule Generators
73 ---------------
74
75 :program:`dnsdist` contains several functions that make it easier to add actions and rules.
76
77 .. function:: addAnyTCRule()
78
79 .. deprecated:: 1.2.0
80
81 Set the TC-bit (truncate) on ANY queries received over UDP, forcing a retry over TCP.
82 This function is deprecated as of 1.2.0 and will be removed in 1.3.0. This is equivalent to doing::
83
84 addAction(AndRule({QTypeRule(DNSQType.ANY), TCPRule(false)}), TCAction())
85
86 .. versionchanged:: 1.4.0
87 Before 1.4.0, the QTypes were in the ``dnsdist`` namespace. Use ``dnsdist.ANY`` in these versions.
88
89 .. function:: addDelay(DNSrule, delay)
90
91 .. deprecated:: 1.2.0
92
93 Delay the query for ``delay`` milliseconds before sending to a backend.
94 This function is deprecated as of 1.2.0 and will be removed in 1.3.0, please use instead:
95
96 addAction(DNSRule, DelayAction(delay))
97
98 :param DNSRule: The DNSRule to match traffic
99 :param int delay: The delay time in milliseconds.
100
101 .. function:: addDisableValidationRule(DNSrule)
102
103 .. deprecated:: 1.2.0
104
105 Set the CD (Checking Disabled) flag to 1 for all queries matching the DNSRule.
106 This function is deprecated as of 1.2.0 and will be removed in 1.3.0. Please use the :func:`DisableValidationAction` action instead.
107
108 .. function:: addDomainBlock(domain)
109
110 .. deprecated:: 1.2.0
111
112 Drop all queries for ``domain`` and all names below it.
113 Deprecated as of 1.2.0 and will be removed in 1.3.0, please use instead:
114
115 addAction(domain, DropAction())
116
117 :param string domain: The domain name to block
118
119 .. function:: addDomainSpoof(domain, IPv4[, IPv6])
120 addDomainSpoof(domain, {IP[,...]})
121
122 .. deprecated:: 1.2.0
123
124 Generate answers for A/AAAA/ANY queries.
125 This function is deprecated as of 1.2.0 and will be removed in 1.3.0, please use:
126
127 addAction(domain, SpoofAction({IP[,...]}))
128
129 or:
130
131 addAction(domain, SpoofAction(IPv4[, IPv6]))
132
133 :param string domain: Domain name to spoof for
134 :param string IPv4: IPv4 address to spoof in the reply
135 :param string IPv6: IPv6 address to spoof in the reply
136 :param string IP: IP address to spoof in the reply
137
138 .. function:: addDomainCNAMESpoof(domain, cname)
139
140 .. deprecated:: 1.2.0
141
142 Generate CNAME answers for queries. This function is deprecated as of 1.2.0 and will be removed in 1.3.0, in favor of using:
143
144 addAction(domain, SpoofCNAMEAction(cname))
145
146 :param string domain: Domain name to spoof for
147 :param string cname: Domain name to add CNAME to
148
149 .. function:: addLuaAction(DNSrule, function [, options])
150
151 .. versionchanged:: 1.3.0
152 Added the optional parameter ``options``.
153
154 .. versionchanged:: 1.3.0
155 The second argument returned by the ``function`` can be omitted. For earlier releases, simply return an empty string.
156
157 .. deprecated:: 1.4.0
158 Removed in 1.4.0, use :func:`LuaAction` with :func:`addAction` instead.
159
160 Invoke a Lua function that accepts a :class:`DNSQuestion`.
161 This function works similar to using :func:`LuaAction`.
162 The ``function`` should return both a :ref:`DNSAction` and its argument `rule`. The `rule` is used as an argument
163 of the following :ref:`DNSAction`: `DNSAction.Spoof`, `DNSAction.Pool` and `DNSAction.Delay`.
164 If the Lua code fails, ServFail is returned.
165
166 :param DNSRule: match queries based on this rule
167 :param string function: the name of a Lua function
168 :param table options: A table with key: value pairs with options.
169
170 Options:
171
172 * ``uuid``: string - UUID to assign to the new rule. By default a random UUID is generated for each rule.
173
174 ::
175
176 function luaaction(dq)
177 if(dq.qtype==DNSQType.NAPTR)
178 then
179 return DNSAction.Pool, "abuse" -- send to abuse pool
180 else
181 return DNSAction.None, "" -- no action
182 -- return DNSAction.None -- as of dnsdist version 1.3.0
183 end
184 end
185
186 addLuaAction(AllRule(), luaaction)
187
188 .. function:: addLuaResponseAction(DNSrule, function [, options])
189
190 .. versionchanged:: 1.3.0
191 Added the optional parameter ``options``.
192
193 .. versionchanged:: 1.3.0
194 The second argument returned by the ``function`` can be omitted. For earlier releases, simply return an empty string.
195
196 .. deprecated:: 1.4.0
197 Removed in 1.4.0, use :func:`LuaResponseAction` with :func:`addResponseAction` instead.
198
199 Invoke a Lua function that accepts a :class:`DNSResponse`.
200 This function works similar to using :func:`LuaResponseAction`.
201 The ``function`` should return both a :ref:`DNSResponseAction` and its argument `rule`. The `rule` is used as an argument
202 of the `DNSResponseAction.Delay`.
203 If the Lua code fails, ServFail is returned.
204
205 :param DNSRule: match queries based on this rule
206 :param string function: the name of a Lua function
207 :param table options: A table with key: value pairs with options.
208
209 Options:
210
211 * ``uuid``: string - UUID to assign to the new rule. By default a random UUID is generated for each rule.
212
213 .. function:: addNoRecurseRule(DNSrule)
214
215 .. deprecated:: 1.2.0
216
217 Clear the RD flag for all queries matching the rule.
218 This function is deprecated as of 1.2.0 and will be removed in 1.3.0, please use:
219
220 addAction(DNSRule, NoRecurseAction())
221
222 :param DNSRule: match queries based on this rule
223
224 .. function:: addPoolRule(DNSRule, pool)
225
226 .. deprecated:: 1.2.0
227
228 Send queries matching the first argument to the pool ``pool``.
229 e.g.::
230
231 addPoolRule("example.com", "myPool")
232
233 This function is deprecated as of 1.2.0 and will be removed in 1.3.0, this is equivalent to::
234
235 addAction("example.com", PoolAction("myPool"))
236
237 :param DNSRule: match queries based on this rule
238 :param string pool: The name of the pool to send the queries to
239
240 .. function:: addQPSLimit(DNSrule, limit)
241
242 .. deprecated:: 1.2.0
243
244 Limit queries matching the DNSRule to ``limit`` queries per second.
245 All queries over the limit are dropped.
246 This function is deprecated as of 1.2.0 and will be removed in 1.3.0, please use:
247
248 addAction(DNSRule, QPSAction(limit))
249
250 :param DNSRule: match queries based on this rule
251 :param int limit: QPS limit for this rule
252
253 .. function:: addQPSPoolRule(DNSRule, limit, pool)
254
255 .. deprecated:: 1.2.0
256
257 Send at most ``limit`` queries/s for this pool, letting the subsequent rules apply otherwise.
258 This function is deprecated as of 1.2.0 and will be removed in 1.3.0, as it is only a convience function for the following syntax::
259
260 addAction("192.0.2.0/24", QPSPoolAction(15, "myPool")
261
262 :param DNSRule: match queries based on this rule
263 :param int limit: QPS limit for this rule
264 :param string pool: The name of the pool to send the queries to
265
266
267 Managing Rules
268 --------------
269
270 Active Rules can be shown with :func:`showRules` and removed with :func:`rmRule`::
271
272 > addAction("h4xorbooter.xyz.", QPSAction(10))
273 > addAction({"130.161.0.0/16", "145.14.0.0/16"} , QPSAction(20))
274 > addAction({"nl.", "be."}, QPSAction(1))
275 > showRules()
276 # Matches Rule Action
277 0 0 h4xorbooter.xyz. qps limit to 10
278 1 0 130.161.0.0/16, 145.14.0.0/16 qps limit to 20
279 2 0 nl., be. qps limit to 1
280
281 For Rules related to the incoming query:
282
283 .. function:: addAction(DNSrule, action [, options])
284
285 .. versionchanged:: 1.3.0
286 Added the optional parameter ``options``.
287
288 Add a Rule and Action to the existing rules.
289
290 :param DNSrule rule: A DNSRule, e.g. an :func:`AllRule` or a compounded bunch of rules using e.g. :func:`AndRule`
291 :param action: The action to take
292 :param table options: A table with key: value pairs with options.
293
294 Options:
295
296 * ``uuid``: string - UUID to assign to the new rule. By default a random UUID is generated for each rule.
297
298 .. function:: clearRules()
299
300 Remove all current rules.
301
302 .. function:: getAction(n) -> Action
303
304 Returns the Action associated with rule ``n``.
305
306 :param int n: The rule number
307
308 .. function:: mvRule(from, to)
309
310 Move rule ``from`` to a position where it is in front of ``to``.
311 ``to`` can be one larger than the largest rule, in which case the rule will be moved to the last position.
312
313 :param int from: Rule number to move
314 :param int to: Location to more the Rule to
315
316 .. function:: newRuleAction(rule, action[, options])
317
318 .. versionchanged:: 1.3.0
319 Added the optional parameter ``options``.
320
321 Return a pair of DNS Rule and DNS Action, to be used with :func:`setRules`.
322
323 :param Rule rule: A `Rule <#traffic-matching>`_
324 :param Action action: The `Action <#actions>`_ to apply to the matched traffic
325 :param table options: A table with key: value pairs with options.
326
327 Options:
328
329 * ``uuid``: string - UUID to assign to the new rule. By default a random UUID is generated for each rule.
330
331 .. function:: setRules(rules)
332
333 Replace the current rules with the supplied list of pairs of DNS Rules and DNS Actions (see :func:`newRuleAction`)
334
335 :param [RuleAction] rules: A list of RuleActions
336
337 .. function:: showRules([options])
338
339 .. versionchanged:: 1.3.0
340 ``options`` optional parameter added
341
342 Show all defined rules for queries, optionally displaying their UUIDs.
343
344 :param table options: A table with key: value pairs with display options.
345
346 Options:
347
348 * ``showUUIDs=false``: bool - Whether to display the UUIDs, defaults to false.
349 * ``truncateRuleWidth=-1``: int - Truncate rules output to ``truncateRuleWidth`` size. Defaults to ``-1`` to display the full rule.
350
351 .. function:: topRule()
352
353 Move the last rule to the first position.
354
355 .. function:: rmRule(id)
356
357 .. versionchanged:: 1.3.0
358 ``id`` can now be an UUID.
359
360 Remove rule ``id``.
361
362 :param int id: The UUID of the rule to remove if ``id`` is an UUID, its position otherwise
363
364 For Rules related to responses:
365
366 .. function:: addResponseAction(DNSRule, action [, options])
367
368 .. versionchanged:: 1.3.0
369 Added the optional parameter ``options``.
370
371 Add a Rule and Action for responses to the existing rules.
372
373 :param DNSRule: A DNSRule, e.g. an :func:`AllRule` or a compounded bunch of rules using e.g. :func:`AndRule`
374 :param action: The action to take
375 :param table options: A table with key: value pairs with options.
376
377 Options:
378
379 * ``uuid``: string - UUID to assign to the new rule. By default a random UUID is generated for each rule.
380
381 .. function:: mvResponseRule(from, to)
382
383 Move response rule ``from`` to a position where it is in front of ``to``.
384 ``to`` can be one larger than the largest rule, in which case the rule will be moved to the last position.
385
386 :param int from: Rule number to move
387 :param int to: Location to more the Rule to
388
389 .. function:: rmResponseRule(id)
390
391 .. versionchanged:: 1.3.0
392 ``id`` can now be an UUID.
393
394 Remove response rule ``id``.
395
396 :param int id: The UUID of the rule to remove if ``id`` is an UUID, its position otherwise
397
398 .. function:: showResponseRules([options])
399
400 .. versionchanged:: 1.3.0
401 ``options`` optional parameter added
402
403 Show all defined response rules, optionally displaying their UUIDs.
404
405 :param table options: A table with key: value pairs with display options.
406
407 Options:
408
409 * ``showUUIDs=false``: bool - Whether to display the UUIDs, defaults to false.
410 * ``truncateRuleWidth=-1``: int - Truncate rules output to ``truncateRuleWidth`` size. Defaults to ``-1`` to display the full rule.
411
412 .. function:: topResponseRule()
413
414 Move the last response rule to the first position.
415
416 Functions for manipulating Cache Hit Respone Rules:
417
418 .. function:: addCacheHitResponseAction(DNSRule, action [, options])
419
420 .. versionadded:: 1.2.0
421
422 .. versionchanged:: 1.3.0
423 Added the optional parameter ``options``.
424
425 Add a Rule and ResponseAction for Cache Hits to the existing rules.
426
427 :param DNSRule: A DNSRule, e.g. an :func:`AllRule` or a compounded bunch of rules using e.g. :func:`AndRule`
428 :param action: The action to take
429 :param table options: A table with key: value pairs with options.
430
431 Options:
432
433 * ``uuid``: string - UUID to assign to the new rule. By default a random UUID is generated for each rule.
434
435 .. function:: mvCacheHitResponseRule(from, to)
436
437 .. versionadded:: 1.2.0
438
439 Move cache hit response rule ``from`` to a position where it is in front of ``to``.
440 ``to`` can be one larger than the largest rule, in which case the rule will be moved to the last position.
441
442 :param int from: Rule number to move
443 :param int to: Location to more the Rule to
444
445 .. function:: rmCacheHitResponseRule(id)
446
447 .. versionadded:: 1.2.0
448
449 .. versionchanged:: 1.3.0
450 ``id`` can now be an UUID.
451
452 :param int id: The UUID of the rule to remove if ``id`` is an UUID, its position otherwise
453
454 .. function:: showCacheHitResponseRules([options])
455
456 .. versionadded:: 1.2.0
457
458 .. versionchanged:: 1.3.0
459 ``options`` optional parameter added
460
461 Show all defined cache hit response rules, optionally displaying their UUIDs.
462
463 :param table options: A table with key: value pairs with display options.
464
465 Options:
466
467 * ``showUUIDs=false``: bool - Whether to display the UUIDs, defaults to false.
468 * ``truncateRuleWidth=-1``: int - Truncate rules output to ``truncateRuleWidth`` size. Defaults to ``-1`` to display the full rule.
469
470 .. function:: topCacheHitResponseRule()
471
472 .. versionadded:: 1.2.0
473
474 Move the last cache hit response rule to the first position.
475
476 Functions for manipulating Self-Answered Response Rules:
477
478 .. function:: addSelfAnsweredResponseAction(DNSRule, action [, options])
479
480 .. versionadded:: 1.3.0
481
482 Add a Rule and Action for Self-Answered queries to the existing rules.
483
484 :param DNSRule: A DNSRule, e.g. an :func:`AllRule` or a compounded bunch of rules using e.g. :func:`AndRule`
485 :param action: The action to take
486
487 .. function:: mvSelfAnsweredResponseRule(from, to)
488
489 .. versionadded:: 1.3.0
490
491 Move self answered response rule ``from`` to a position where it is in front of ``to``.
492 ``to`` can be one larger than the largest rule, in which case the rule will be moved to the last position.
493
494 :param int from: Rule number to move
495 :param int to: Location to more the Rule to
496
497 .. function:: rmSelfAnsweredResponseRule(id)
498
499 .. versionadded:: 1.3.0
500
501 Remove self answered response rule ``id``.
502
503 :param int id: The UUID of the rule to remove if ``id`` is an UUID, its position otherwise
504
505 .. function:: showSelfAnsweredResponseRules([options])
506
507 .. versionadded:: 1.3.0
508
509 Show all defined self answered response rules, optionally displaying their UUIDs.
510
511 :param table options: A table with key: value pairs with display options.
512
513 Options:
514
515 * ``showUUIDs=false``: bool - Whether to display the UUIDs, defaults to false.
516 * ``truncateRuleWidth=-1``: int - Truncate rules output to ``truncateRuleWidth`` size. Defaults to ``-1`` to display the full rule.
517
518 .. function:: topSelfAnsweredResponseRule()
519
520 .. versionadded:: 1.3.0
521
522 Move the last self answered response rule to the first position.
523
524 .. _RulesIntro:
525
526 Matching Packets (Selectors)
527 ----------------------------
528
529 Packets can be matched by selectors, called a ``DNSRule``.
530 These ``DNSRule``\ s be one of the following items:
531
532 * A string that is either a domain name or netmask
533 * A list of strings that are either domain names or netmasks
534 * A :class:`DNSName`
535 * A list of :class:`DNSName`\ s
536 * A (compounded) ``Rule``
537
538 .. versionadded:: 1.2.0
539 A DNSRule can also be a :class:`DNSName` or a list of these
540
541 .. function:: AllRule()
542
543 Matches all traffic
544
545 .. function:: DNSSECRule()
546
547 Matches queries with the DO flag set
548
549 .. function:: DSTPortRule(port)
550
551 Matches questions received to the destination port.
552
553 :param int port: Match destination port.
554
555 .. function:: EDNSOptionRule(optcode)
556
557 .. versionadded:: 1.4.0
558
559 Matches queries or responses with the specified EDNS option present.
560 ``optcode`` is specified as an integer, or a constant such as `EDNSOptionCode.ECS`.
561
562 .. function:: EDNSVersionRule(version)
563
564 .. versionadded:: 1.4.0
565
566 Matches queries or responses with an OPT record whose EDNS version is greater than the specified EDNS version.
567
568 :param int version: The EDNS version to match on
569
570 .. function:: ERCodeRule(rcode)
571
572 Matches queries or responses with the specified ``rcode``.
573 ``rcode`` can be specified as an integer or as one of the built-in :ref:`DNSRCode`.
574 The full 16bit RCode will be matched. If no EDNS OPT RR is present, the upper 12 bits are treated as 0.
575
576 :param int rcode: The RCODE to match on
577
578 .. function:: HTTPHeaderRule(name, regex)
579
580 .. versionadded:: 1.4.0
581
582 Matches DNS over HTTPS queries with a HTTP header ``name`` whose content matches the regular expression ``regex``.
583
584 :param str name: The case-insensitive name of the HTTP header to match on
585 :param str regex: A regular expression to match the content of the specified header
586
587 .. function:: HTTPPathRegexRule(regex)
588
589 .. versionadded:: 1.4.0
590
591 Matches DNS over HTTPS queries with a HTTP path matching the regular expression supplied in ``regex``. For example, if the query has been sent to the https://192.0.2.1:443/PowerDNS?dns=... URL, the path would be '/PowerDNS'.
592 Only valid DNS over HTTPS queries are matched. If you want to match all HTTP queries, see :meth:`DOHFrontend.setResponsesMap` instead.
593
594 :param str regex: The regex to match on
595
596 .. function:: HTTPPathRule(path)
597
598 .. versionadded:: 1.4.0
599
600 Matches DNS over HTTPS queries with a HTTP path of ``path``. For example, if the query has been sent to the https://192.0.2.1:443/PowerDNS?dns=... URL, the path would be '/PowerDNS'.
601 Only valid DNS over HTTPS queries are matched. If you want to match all HTTP queries, see :meth:`DOHFrontend.setResponsesMap` instead.
602
603 :param str path: The exact HTTP path to match on
604
605 .. function:: KeyValueStoreLookupRule(kvs, lookupKey)
606
607 .. versionadded:: 1.4.0
608
609 As of 1.4.0, this code is considered experimental.
610
611 Return true if the key returned by 'lookupKey' exists in the key value store referenced by 'kvs'.
612 The store can be a CDB (:func:`newCDBKVStore`) or a LMDB database (:func:`newLMDBKVStore`).
613 The key can be based on the qname (:func:`KeyValueLookupKeyQName` and :func:`KeyValueLookupKeySuffix`),
614 source IP (:func:`KeyValueLookupKeySourceIP`) or the value of an existing tag (:func:`KeyValueLookupKeyTag`).
615
616 :param KeyValueStore kvs: The key value store to query
617 :param KeyValueLookupKey lookupKey: The key to use for the lookup
618
619 .. function:: LuaFFIRule(function)
620
621 .. versionadded:: 1.5.0
622
623 Invoke a Lua FFI function that accepts a pointer to a ``dnsdist_ffi_dnsquestion_t`` object, whose bindings are defined in ``dnsdist-lua-ffi.hh``.
624
625 The ``function`` should return true if the query matches, or false otherwise. If the Lua code fails, false is returned.
626
627 :param string function: the name of a Lua function
628
629 .. function:: MaxQPSIPRule(qps[, v4Mask[, v6Mask[, burst[, expiration[, cleanupDelay[, scanFraction]]]]]])
630
631 .. versionchanged:: 1.3.1
632 Added the optional parameters ``expiration``, ``cleanupDelay`` and ``scanFraction``.
633
634 Matches traffic for a subnet specified by ``v4Mask`` or ``v6Mask`` exceeding ``qps`` queries per second up to ``burst`` allowed.
635 This rule keeps track of QPS by netmask or source IP. This state is cleaned up regularly if ``cleanupDelay`` is greater than zero,
636 removing existing netmasks or IP addresses that have not been seen in the last ``expiration`` seconds.
637
638 :param int qps: The number of queries per second allowed, above this number traffic is matched
639 :param int v4Mask: The IPv4 netmask to match on. Default is 32 (the whole address)
640 :param int v6Mask: The IPv6 netmask to match on. Default is 64
641 :param int burst: The number of burstable queries per second allowed. Default is same as qps
642 :param int expiration: How long to keep netmask or IP addresses after they have last been seen, in seconds. Default is 300
643 :param int cleanupDelay: The number of seconds between two cleanups. Default is 60
644 :param int scanFraction: The maximum fraction of the store to scan for expired entries, for example 5 would scan at most 20% of it. Default is 10 so 10%
645
646 .. function:: MaxQPSRule(qps)
647
648 Matches traffic **not** exceeding this qps limit. If e.g. this is set to 50, starting at the 51st query of the current second traffic stops being matched.
649 This can be used to enforce a global QPS limit.
650
651 :param int qps: The number of queries per second allowed, above this number the traffic is **not** matched anymore
652
653 .. function:: NetmaskGroupRule(nmg[, src[, quiet]])
654
655 .. versionchanged:: 1.4.0
656 ``quiet`` parameter added
657
658 Matches traffic from/to the network range specified in ``nmg``.
659
660 Set the ``src`` parameter to false to match ``nmg`` against destination address instead of source address.
661 This can be used to differentiate between clients
662
663 :param NetMaskGroup nmg: The NetMaskGroup to match on
664 :param bool src: Whether to match source or destination address of the packet. Defaults to true (matches source)
665 :param bool quiet: Do not display the list of matched netmasks in Rules. Default is false.
666
667 .. function:: OpcodeRule(code)
668
669 Matches queries with opcode ``code``.
670 ``code`` can be directly specified as an integer, or one of the :ref:`built-in DNSOpcodes <DNSOpcode>`.
671
672 :param int code: The opcode to match
673
674 .. function:: ProbaRule(probability)
675
676 .. versionadded:: 1.3.0
677
678 Matches queries with a given probability. 1.0 means "always"
679
680 :param double probability: Probability of a match
681
682 .. function:: QClassRule(qclass)
683
684 Matches queries with the specified ``qclass``.
685 ``class`` can be specified as an integer or as one of the built-in :ref:`DNSClass`.
686
687 :param int qclass: The Query Class to match on
688
689 .. function:: QNameRule(qname)
690
691 .. versionadded:: 1.2.0
692
693 Matches queries with the specified qname exactly.
694
695 :param string qname: Qname to match
696
697 .. function:: QNameSetRule(set)
698
699 .. versionadded:: 1.4.0
700
701 Matches if the set contains exact qname.
702
703 To match subdomain names, see :func:`SuffixMatchNodeRule`.
704
705 :param DNSNameSet set: Set with qnames.
706
707 .. function:: QNameLabelsCountRule(min, max)
708
709 Matches if the qname has less than ``min`` or more than ``max`` labels.
710
711 :param int min: Minimum number of labels
712 :param int max: Maximum nimber of labels
713
714 .. function:: QNameWireLengthRule(min, max)
715
716 Matches if the qname's length on the wire is less than ``min`` or more than ``max`` bytes.
717
718 :param int min: Minimum number of bytes
719 :param int max: Maximum nimber of bytes
720
721 .. function:: QTypeRule(qtype)
722
723 Matches queries with the specified ``qtype``
724 ``qtype`` may be specified as an integer or as one of the built-in QTypes.
725 For instance ``DNSQType.A``, ``DNSQType.TXT`` and ``DNSQType.ANY``.
726
727 :param int qtype: The QType to match on
728
729 .. function:: RCodeRule(rcode)
730
731 Matches queries or responses with the specified ``rcode``.
732 ``rcode`` can be specified as an integer or as one of the built-in :ref:`DNSRCode`.
733 Only the non-extended RCode is matched (lower 4bits).
734
735 :param int rcode: The RCODE to match on
736
737 .. function:: RDRule()
738
739 .. versionadded:: 1.2.0
740
741 Matches queries with the RD flag set.
742
743 .. function:: RegexRule(regex)
744
745 Matches the query name against the ``regex``.
746
747 .. code-block:: Lua
748
749 addAction(RegexRule("[0-9]{5,}"), DelayAction(750)) -- milliseconds
750 addAction(RegexRule("[0-9]{4,}\\.example$"), DropAction())
751
752 This delays any query for a domain name with 5 or more consecutive digits in it.
753 The second rule drops anything with more than 4 consecutive digits within a .EXAMPLE domain.
754
755 Note that the query name is presented without a trailing dot to the regex.
756 The regex is applied case insensitively.
757
758 :param string regex: A regular expression to match the traffic on
759
760 .. function:: RecordsCountRule(section, minCount, maxCount)
761
762 Matches if there is at least ``minCount`` and at most ``maxCount`` records in the section ``section``.
763 ``section`` can be specified as an integer or as a :ref:`DNSSection`.
764
765 :param int section: The section to match on
766 :param int minCount: The minimum number of entries
767 :param int maxCount: The maximum number of entries
768
769 .. function:: RecordsTypeCountRule(section, qtype, minCount, maxCount)
770
771 Matches if there is at least ``minCount`` and at most ``maxCount`` records of type ``type`` in the section ``section``.
772 ``section`` can be specified as an integer or as a :ref:`DNSSection`.
773 ``qtype`` may be specified as an integer or as one of the :ref:`built-in QTypes <DNSQType>`, for instance ``DNSQType.A`` or ``DNSQType.TXT``.
774
775 :param int section: The section to match on
776 :param int qtype: The QTYPE to match on
777 :param int minCount: The minimum number of entries
778 :param int maxCount: The maximum number of entries
779
780 .. function:: RE2Rule(regex)
781
782 Matches the query name against the supplied regex using the RE2 engine.
783
784 For an example of usage, see :func:`RegexRule`.
785
786 :note: Only available when dnsdist was built with libre2 support.
787
788 :param str regex: The regular expression to match the QNAME.
789
790 .. function:: SNIRule(name)
791
792 .. versionadded:: 1.4.0
793
794 Matches against the TLS Server Name Indication value sent by the client, if any. Only makes
795 sense for DoT or DoH, and for that last one matching on the HTTP Host header using :func:`HTTPHeaderRule`
796 might provide more consistent results.
797 As of the version 2.3.0-beta of h2o, it is unfortunately not possible to extract the SNI value from DoH
798 connections, and it is therefore necessary to use the HTTP Host header until version 2.3.0 is released.
799
800 :param str name: The exact SNI name to match.
801
802 .. function:: SuffixMatchNodeRule(smn[, quiet])
803
804 Matches based on a group of domain suffixes for rapid testing of membership.
805 Pass true as second parameter to prevent listing of all domains matched.
806
807 To match domain names exactly, see :func:`QNameSetRule`.
808
809 :param SuffixMatchNode smb: The SuffixMatchNode to match on
810 :param bool quiet: Do not display the list of matched domains in Rules. Default is false.
811
812 .. function:: TagRule(name [, value])
813
814 .. versionadded:: 1.3.0
815
816 Matches question or answer with a tag named ``name`` set. If ``value`` is specified, the existing tag value should match too.
817
818 :param bool name: The name of the tag that has to be set
819 :param bool value: If set, the value the tag has to be set to. Default is unset
820
821 .. function:: TCPRule([tcp])
822
823 Matches question received over TCP if ``tcp`` is true, over UDP otherwise.
824
825 :param bool tcp: Match TCP traffic. Default is true.
826
827 .. function:: TrailingDataRule()
828
829 Matches if the query has trailing data.
830
831 .. function:: PoolAvailableRule(poolname)
832
833 .. versionadded:: 1.3.3
834
835 Check whether a pool has any servers available to handle queries
836
837 .. code-block:: Lua
838
839 --- Send queries to default pool when servers are available
840 addAction(PoolAvailableRule(""), PoolAction(""))
841 --- Send queries to fallback pool if not
842 addAction(AllRule(), PoolAction("fallback"))
843
844 :param string poolname: Pool to check
845
846 Combining Rules
847 ~~~~~~~~~~~~~~~
848
849 .. function:: AndRule(selectors)
850
851 Matches traffic if all ``selectors`` match.
852
853 :param {Rule} selectors: A table of Rules
854
855 .. function:: NotRule(selector)
856
857 Matches the traffic if the ``selector`` rule does not match;
858
859 :param Rule selector: A Rule
860
861 .. function:: OrRule(selectors)
862
863 Matches the traffic if one or more of the the ``selectors`` Rules does match.
864
865 :param {Rule} selector: A table of Rules
866
867 Convenience Functions
868 ~~~~~~~~~~~~~~~~~~~~~
869
870 .. function:: makeRule(rule)
871
872 Make a :func:`NetmaskGroupRule` or a :func:`SuffixMatchNodeRule`, depending on it is called.
873 ``makeRule("0.0.0.0/0")`` will for example match all IPv4 traffic, ``makeRule({"be","nl","lu"})`` will match all Benelux DNS traffic.
874
875 :param string rule: A string to convert to a rule.
876
877
878 Actions
879 -------
880
881 :ref:`RulesIntro` need to be combined with an action for them to actually do something with the matched packets.
882 Some actions allow further processing of rules, this is noted in their description.
883 The following actions exist.
884
885 .. function:: AllowAction()
886
887 Let these packets go through.
888
889 .. function:: AllowResponseAction()
890
891 Let these packets go through.
892
893 .. function:: ContinueAction(action)
894
895 .. versionadded:: 1.4.0
896
897 Execute the specified action and override its return with None, making it possible to continue the processing.
898 Subsequent rules are processed after this action.
899
900 :param int action: Any other action
901
902 .. function:: DelayAction(milliseconds)
903
904 Delay the response by the specified amount of milliseconds (UDP-only).
905 Subsequent rules are processed after this action.
906
907 :param int milliseconds: The amount of milliseconds to delay the response
908
909 .. function:: DelayResponseAction(milliseconds)
910
911 Delay the response by the specified amount of milliseconds (UDP-only).
912 Subsequent rules are processed after this action.
913
914 :param int milliseconds: The amount of milliseconds to delay the response
915
916 .. function:: DisableECSAction()
917
918 Disable the sending of ECS to the backend.
919 Subsequent rules are processed after this action.
920
921 .. function:: DisableValidationAction()
922
923 Set the CD bit in the query and let it go through.
924
925 .. function:: DnstapLogAction(identity, logger[, alterFunction])
926
927 .. versionadded:: 1.3.0
928
929 Send the the current query to a remote logger as a :doc:`dnstap <reference/dnstap>` message.
930 ``alterFunction`` is a callback, receiving a :class:`DNSQuestion` and a :class:`DnstapMessage`, that can be used to modify the message.
931 Subsequent rules are processed after this action.
932
933 :param string identity: Server identity to store in the dnstap message
934 :param logger: The :func:`FrameStreamLogger <newFrameStreamUnixLogger>` or :func:`RemoteLogger <newRemoteLogger>` object to write to
935 :param alterFunction: A Lua function to alter the message before sending
936
937 .. function:: DnstapLogResponseAction(identity, logger[, alterFunction])
938
939 .. versionadded:: 1.3.0
940
941 Send the the current response to a remote logger as a :doc:`dnstap <reference/dnstap>` message.
942 ``alterFunction`` is a callback, receiving a :class:`DNSQuestion` and a :class:`DnstapMessage`, that can be used to modify the message.
943 Subsequent rules are processed after this action.
944
945 :param string identity: Server identity to store in the dnstap message
946 :param logger: The :func:`FrameStreamLogger <newFrameStreamUnixLogger>` or :func:`RemoteLogger <newRemoteLogger>` object to write to
947 :param alterFunction: A Lua function to alter the message before sending
948
949 .. function:: DropAction()
950
951 Drop the packet.
952
953 .. function:: DropResponseAction()
954
955 Drop the packet.
956
957 .. function:: ECSOverrideAction(override)
958
959 Whether an existing EDNS Client Subnet value should be overridden (true) or not (false).
960 Subsequent rules are processed after this action.
961
962 :param bool override: Whether or not to override ECS value
963
964 .. function:: ECSPrefixLengthAction(v4, v6)
965
966 Set the ECS prefix length.
967 Subsequent rules are processed after this action.
968
969 :param int v4: The IPv4 netmask length
970 :param int v6: The IPv6 netmask length
971
972
973 .. function:: ERCodeAction(rcode [, options])
974
975 .. versionadded:: 1.4.0
976
977 .. versionchanged:: 1.5.0
978 Added the optional parameter ``options``.
979
980 Reply immediately by turning the query into a response with the specified EDNS extended ``rcode``.
981 ``rcode`` can be specified as an integer or as one of the built-in :ref:`DNSRCode`.
982
983 :param int rcode: The extended RCODE to respond with.
984 :param table options: A table with key: value pairs with options.
985
986 Options:
987
988 * ``aa``: bool - Set the AA bit to this value (true means the bit is set, false means it's cleared). Default is to clear it.
989 * ``ad``: bool - Set the AD bit to this value (true means the bit is set, false means it's cleared). Default is to clear it.
990 * ``ra``: bool - Set the RA bit to this value (true means the bit is set, false means it's cleared). Default is to copy the value of the RD bit from the incoming query.
991
992 .. function:: HTTPStatusAction(status, body, contentType="" [, options])
993
994 .. versionadded:: 1.4.0
995
996 .. versionchanged:: 1.5.0
997 Added the optional parameter ``options``.
998
999 Return an HTTP response with a status code of ''status''. For HTTP redirects, ''body'' should be the redirect URL.
1000
1001 :param int status: The HTTP status code to return.
1002 :param string body: The body of the HTTP response, or a URL if the status code is a redirect (3xx).
1003 :param string contentType: The HTTP Content-Type header to return for a 200 response, ignored otherwise. Default is ''application/dns-message''.
1004 :param table options: A table with key: value pairs with options.
1005
1006 Options:
1007
1008 * ``aa``: bool - Set the AA bit to this value (true means the bit is set, false means it's cleared). Default is to clear it.
1009 * ``ad``: bool - Set the AD bit to this value (true means the bit is set, false means it's cleared). Default is to clear it.
1010 * ``ra``: bool - Set the RA bit to this value (true means the bit is set, false means it's cleared). Default is to copy the value of the RD bit from the incoming query.
1011
1012 .. function:: KeyValueStoreLookupAction(kvs, lookupKey, destinationTag)
1013
1014 .. versionadded:: 1.4.0
1015
1016 As of 1.4.0, this code is considered experimental.
1017
1018 Does a lookup into the key value store referenced by 'kvs' using the key returned by 'lookupKey',
1019 and storing the result if any into the tag named 'destinationTag'.
1020 The store can be a CDB (:func:`newCDBKVStore`) or a LMDB database (:func:`newLMDBKVStore`).
1021 The key can be based on the qname (:func:`KeyValueLookupKeyQName` and :func:`KeyValueLookupKeySuffix`),
1022 source IP (:func:`KeyValueLookupKeySourceIP`) or the value of an existing tag (:func:`KeyValueLookupKeyTag`).
1023
1024 :param KeyValueStore kvs: The key value store to query
1025 :param KeyValueLookupKey lookupKey: The key to use for the lookup
1026 :param string destinationTag: The name of the tag to store the result into
1027
1028 .. function:: LogAction([filename[, binary[, append[, buffered[, verboseOnly[, includeTimestamp]]]]]])
1029
1030 .. versionchanged:: 1.4.0
1031 Added the optional parameters ``verboseOnly`` and ``includeTimestamp``, made ``filename`` optional.
1032
1033 Log a line for each query, to the specified ``file`` if any, to the console (require verbose) if the empty string is given as filename.
1034
1035 If an empty string is supplied in the file name, the logging is done to stdout, and only in verbose mode by default. This can be changed by setting ``verboseOnly`` to false.
1036
1037 When logging to a file, the ``binary`` optional parameter specifies whether we log in binary form (default) or in textual form. Before 1.4.0 the binary log format only included the qname and qtype. Since 1.4.0 it includes an optional timestamp, the query ID, qname, qtype, remote address and port.
1038
1039 The ``append`` optional parameter specifies whether we open the file for appending or truncate each time (default).
1040 The ``buffered`` optional parameter specifies whether writes to the file are buffered (default) or not.
1041
1042 Subsequent rules are processed after this action.
1043
1044 :param string filename: File to log to. Set to an empty string to log to the normal stdout log, this only works when ``-v`` is set on the command line.
1045 :param bool binary: Do binary logging. Default true
1046 :param bool append: Append to the log. Default false
1047 :param bool buffered: Use buffered I/O. Default true
1048 :param bool verboseOnly: Whether to log only in verbose mode when logging to stdout. Default is true
1049 :param bool includeTimestamp: Whether to include a timestamp for every entry. Default is false
1050
1051 .. function:: LogResponseAction([filename[, append[, buffered[, verboseOnly[, includeTimestamp]]]]]])
1052
1053 .. versionadded:: 1.5.0
1054
1055 Log a line for each response, to the specified ``file`` if any, to the console (require verbose) if the empty string is given as filename.
1056
1057 If an empty string is supplied in the file name, the logging is done to stdout, and only in verbose mode by default. This can be changed by setting ``verboseOnly`` to false.
1058
1059 The ``append`` optional parameter specifies whether we open the file for appending or truncate each time (default).
1060 The ``buffered`` optional parameter specifies whether writes to the file are buffered (default) or not.
1061
1062 Subsequent rules are processed after this action.
1063
1064 :param string filename: File to log to. Set to an empty string to log to the normal stdout log, this only works when ``-v`` is set on the command line.
1065 :param bool append: Append to the log. Default false
1066 :param bool buffered: Use buffered I/O. Default true
1067 :param bool verboseOnly: Whether to log only in verbose mode when logging to stdout. Default is true
1068 :param bool includeTimestamp: Whether to include a timestamp for every entry. Default is false
1069
1070 .. function:: LuaAction(function)
1071
1072 Invoke a Lua function that accepts a :class:`DNSQuestion`.
1073
1074 The ``function`` should return a :ref:`DNSAction`. If the Lua code fails, ServFail is returned.
1075
1076 :param string function: the name of a Lua function
1077
1078 .. function:: LuaFFIAction(function)
1079
1080 .. versionadded:: 1.5.0
1081
1082 Invoke a Lua FFI function that accepts a pointer to a ``dnsdist_ffi_dnsquestion_t`` object, whose bindings are defined in ``dnsdist-lua-ffi.hh``.
1083
1084 The ``function`` should return a :ref:`DNSAction`. If the Lua code fails, ServFail is returned.
1085
1086 :param string function: the name of a Lua function
1087
1088 .. function:: LuaFFIResponseAction(function)
1089
1090 .. versionadded:: 1.5.0
1091
1092 Invoke a Lua FFI function that accepts a pointer to a ``dnsdist_ffi_dnsquestion_t`` object, whose bindings are defined in ``dnsdist-lua-ffi.hh``.
1093
1094 The ``function`` should return a :ref:`DNSResponseAction`. If the Lua code fails, ServFail is returned.
1095
1096 :param string function: the name of a Lua function
1097
1098 .. function:: LuaResponseAction(function)
1099
1100 Invoke a Lua function that accepts a :class:`DNSResponse`.
1101
1102 The ``function`` should return a :ref:`DNSResponseAction`. If the Lua code fails, ServFail is returned.
1103
1104 :param string function: the name of a Lua function
1105
1106 .. function:: MacAddrAction(option)
1107
1108 Add the source MAC address to the query as EDNS0 option ``option``.
1109 This action is currently only supported on Linux.
1110 Subsequent rules are processed after this action.
1111
1112 :param int option: The EDNS0 option number
1113
1114 .. function:: NoneAction()
1115
1116 Does nothing.
1117 Subsequent rules are processed after this action.
1118
1119 .. function:: NoRecurseAction()
1120
1121 Strip RD bit from the question, let it go through.
1122 Subsequent rules are processed after this action.
1123
1124 .. function:: PoolAction(poolname)
1125
1126 Send the packet into the specified pool.
1127
1128 :param string poolname: The name of the pool
1129
1130 .. function:: QPSAction(maxqps)
1131
1132 Drop a packet if it does exceed the ``maxqps`` queries per second limits.
1133 Letting the subsequent rules apply otherwise.
1134
1135 :param int maxqps: The QPS limit
1136
1137 .. function:: QPSPoolAction(maxqps, poolname)
1138
1139 Send the packet into the specified pool only if it does not exceed the ``maxqps`` queries per second limits.
1140 Letting the subsequent rules apply otherwise.
1141
1142 :param int maxqps: The QPS limit for that pool
1143 :param string poolname: The name of the pool
1144
1145 .. function:: RCodeAction(rcode [, options])
1146
1147 .. versionchanged:: 1.5.0
1148 Added the optional parameter ``options``.
1149
1150 Reply immediately by turning the query into a response with the specified ``rcode``.
1151 ``rcode`` can be specified as an integer or as one of the built-in :ref:`DNSRCode`.
1152
1153 :param int rcode: The RCODE to respond with.
1154 :param table options: A table with key: value pairs with options.
1155
1156 Options:
1157
1158 * ``aa``: bool - Set the AA bit to this value (true means the bit is set, false means it's cleared). Default is to clear it.
1159 * ``ad``: bool - Set the AD bit to this value (true means the bit is set, false means it's cleared). Default is to clear it.
1160 * ``ra``: bool - Set the RA bit to this value (true means the bit is set, false means it's cleared). Default is to copy the value of the RD bit from the incoming query.
1161
1162 .. function:: RemoteLogAction(remoteLogger[, alterFunction [, options]])
1163
1164 .. versionchanged:: 1.3.0
1165 ``options`` optional parameter added.
1166
1167 .. versionchanged:: 1.4.0
1168 ``ipEncryptKey`` optional key added to the options table.
1169
1170 Send the content of this query to a remote logger via Protocol Buffer.
1171 ``alterFunction`` is a callback, receiving a :class:`DNSQuestion` and a :class:`DNSDistProtoBufMessage`, that can be used to modify the Protocol Buffer content, for example for anonymization purposes.
1172 Subsequent rules are processed after this action.
1173
1174 :param string remoteLogger: The :func:`remoteLogger <newRemoteLogger>` object to write to
1175 :param string alterFunction: Name of a function to modify the contents of the logs before sending
1176 :param table options: A table with key: value pairs.
1177
1178 Options:
1179
1180 * ``serverID=""``: str - Set the Server Identity field.
1181 * ``ipEncryptKey=""``: str - A key, that can be generated via the :func:`makeIPCipherKey` function, to encrypt the IP address of the requestor for anonymization purposes. The encryption is done using ipcrypt for IPv4 and a 128-bit AES ECB operation for IPv6.
1182
1183 .. function:: RemoteLogResponseAction(remoteLogger[, alterFunction[, includeCNAME [, options]]])
1184
1185 .. versionchanged:: 1.3.0
1186 ``options`` optional parameter added.
1187
1188 .. versionchanged:: 1.4.0
1189 ``ipEncryptKey`` optional key added to the options table.
1190
1191 Send the content of this response to a remote logger via Protocol Buffer.
1192 ``alterFunction`` is the same callback that receiving a :class:`DNSQuestion` and a :class:`DNSDistProtoBufMessage`, that can be used to modify the Protocol Buffer content, for example for anonymization purposes.
1193 ``includeCNAME`` indicates whether CNAME records inside the response should be parsed and exported.
1194 The default is to only exports A and AAAA records.
1195 Subsequent rules are processed after this action.
1196
1197 :param string remoteLogger: The :func:`remoteLogger <newRemoteLogger>` object to write to
1198 :param string alterFunction: Name of a function to modify the contents of the logs before sending
1199 :param bool includeCNAME: Whether or not to parse and export CNAMEs. Default false
1200 :param table options: A table with key: value pairs.
1201
1202 Options:
1203
1204 * ``serverID=""``: str - Set the Server Identity field.
1205 * ``ipEncryptKey=""``: str - A key, that can be generated via the :func:`makeIPCipherKey` function, to encrypt the IP address of the requestor for anonymization purposes. The encryption is done using ipcrypt for IPv4 and a 128-bit AES ECB operation for IPv6.
1206
1207 .. function:: SetECSAction(v4 [, v6])
1208
1209 .. versionadded:: 1.3.1
1210
1211 Set the ECS prefix and prefix length sent to backends to an arbitrary value.
1212 If both IPv4 and IPv6 masks are supplied the IPv4 one will be used for IPv4 clients
1213 and the IPv6 one for IPv6 clients. Otherwise the first mask is used for both, and
1214 can actually be an IPv6 mask.
1215 Subsequent rules are processed after this action.
1216
1217 :param string v4: The IPv4 netmask, for example "192.0.2.1/32"
1218 :param string v6: The IPv6 netmask, if any
1219
1220 .. function:: SetNegativeAndSOAAction(nxd, zone, ttl, mname, rname, serial, refresh, retry, expire, minimum [, options])
1221
1222 .. versionadded:: 1.5.0
1223
1224 Turn a question into a response, either a NXDOMAIN or a NODATA one based on ''nxd'', setting the QR bit to 1 and adding a SOA record in the additional section.
1225
1226 :param bool nxd: Whether the answer is a NXDOMAIN (true) or a NODATA (false)
1227 :param string zone: The owner name for the SOA record
1228 :param int ttl: The TTL of the SOA record
1229 :param string mname: The mname of the SOA record
1230 :param string rname: The rname of the SOA record
1231 :param int serial: The value of the serial field in the SOA record
1232 :param int refresh: The value of the refresh field in the SOA record
1233 :param int retry: The value of the retry field in the SOA record
1234 :param int expire: The value of the expire field in the SOA record
1235 :param int minimum: The value of the minimum field in the SOA record
1236 :param table options: A table with key: value pairs with options
1237
1238 Options:
1239
1240 * ``aa``: bool - Set the AA bit to this value (true means the bit is set, false means it's cleared). Default is to clear it.
1241 * ``ad``: bool - Set the AD bit to this value (true means the bit is set, false means it's cleared). Default is to clear it.
1242 * ``ra``: bool - Set the RA bit to this value (true means the bit is set, false means it's cleared). Default is to copy the value of the RD bit from the incoming query.
1243
1244 .. function:: SkipCacheAction()
1245
1246 Don't lookup the cache for this query, don't store the answer.
1247
1248 .. function:: SNMPTrapAction([message])
1249
1250 Send an SNMP trap, adding the optional ``message`` string as the query description.
1251 Subsequent rules are processed after this action.
1252
1253 :param string message: The message to include
1254
1255 .. function:: SNMPTrapResponseAction([message])
1256
1257 Send an SNMP trap, adding the optional ``message`` string as the query description.
1258 Subsequent rules are processed after this action.
1259
1260 :param string message: The message to include
1261
1262 .. function:: SpoofAction(ip [, options])
1263 SpoofAction(ips [, options])
1264
1265 .. versionchanged:: 1.5.0
1266 Added the optional parameter ``options``.
1267
1268 Forge a response with the specified IPv4 (for an A query) or IPv6 (for an AAAA) addresses.
1269 If you specify multiple addresses, all that match the query type (A, AAAA or ANY) will get spoofed in.
1270
1271 :param string ip: An IPv4 and/or IPv6 address to spoof
1272 :param {string} ips: A table of IPv4 and/or IPv6 addresses to spoof
1273 :param table options: A table with key: value pairs with options.
1274
1275 Options:
1276
1277 * ``aa``: bool - Set the AA bit to this value (true means the bit is set, false means it's cleared). Default is to clear it.
1278 * ``ad``: bool - Set the AD bit to this value (true means the bit is set, false means it's cleared). Default is to clear it.
1279 * ``ra``: bool - Set the RA bit to this value (true means the bit is set, false means it's cleared). Default is to copy the value of the RD bit from the incoming query.
1280 * ``ttl``: int - The TTL of the record.
1281
1282 .. function:: SpoofCNAMEAction(cname [, options])
1283
1284 .. versionchanged:: 1.5.0
1285 Added the optional parameter ``options``.
1286
1287 Forge a response with the specified CNAME value.
1288
1289 :param string cname: The name to respond with
1290 :param table options: A table with key: value pairs with options.
1291
1292 Options:
1293
1294 * ``aa``: bool - Set the AA bit to this value (true means the bit is set, false means it's cleared). Default is to clear it.
1295 * ``ad``: bool - Set the AD bit to this value (true means the bit is set, false means it's cleared). Default is to clear it.
1296 * ``ra``: bool - Set the RA bit to this value (true means the bit is set, false means it's cleared). Default is to copy the value of the RD bit from the incoming query.
1297 * ``ttl``: int - The TTL of the record.
1298
1299 .. function:: SpoofRawAction(rawAnswer [, options])
1300
1301 .. versionadded:: 1.5.0
1302
1303 Forge a response with the specified raw bytes as record data.
1304 For example, for a TXT record of "aaa" "bbbb": SpoofRawAction("\003aaa\004bbbb")
1305
1306 :param string rawAnswer: The raw record data
1307 :param table options: A table with key: value pairs with options.
1308
1309 Options:
1310
1311 * ``aa``: bool - Set the AA bit to this value (true means the bit is set, false means it's cleared). Default is to clear it.
1312 * ``ad``: bool - Set the AD bit to this value (true means the bit is set, false means it's cleared). Default is to clear it.
1313 * ``ra``: bool - Set the RA bit to this value (true means the bit is set, false means it's cleared). Default is to copy the value of the RD bit from the incoming query.
1314 * ``ttl``: int - The TTL of the record.
1315
1316 .. function:: TagAction(name, value)
1317
1318 .. versionadded:: 1.3.0
1319
1320 Associate a tag named ``name`` with a value of ``value`` to this query, that will be passed on to the response.
1321 Subsequent rules are processed after this action.
1322
1323 :param string name: The name of the tag to set
1324 :param string value: The value of the tag
1325
1326 .. function:: TagResponseAction(name, value)
1327
1328 .. versionadded:: 1.3.0
1329
1330 Associate a tag named ``name`` with a value of ``value`` to this response.
1331 Subsequent rules are processed after this action.
1332
1333 :param string name: The name of the tag to set
1334 :param string value: The value of the tag
1335
1336 .. function:: TCAction()
1337
1338 Create answer to query with TC and RD bits set, to force the client to TCP.
1339
1340 .. function:: TeeAction(remote[, addECS])
1341
1342 Send copy of query to ``remote``, keep stats on responses.
1343 If ``addECS`` is set to true, EDNS Client Subnet information will be added to the query.
1344
1345 :param string remote: An IP:PORT conbination to send the copied queries to
1346 :param bool addECS: Whether or not to add ECS information. Default false
1347
1348 .. function:: TempFailureCacheTTLAction(ttl)
1349
1350 Set the cache TTL to use for ServFail and Refused replies. TTL is not applied for successful replies.
1351
1352 :param int ttl: Cache TTL for temporary failure replies