]> git.ipfire.org Git - thirdparty/pdns.git/blame - pdns/dnsdistdist/docs/reference/config.rst
Merge pull request #6760 from rgacogne/dnsdist-dynblockrulesgroup-exclusions
[thirdparty/pdns.git] / pdns / dnsdistdist / docs / reference / config.rst
CommitLineData
20d81666
PL
1.. highlight:: lua
2
3Configuration Reference
4=======================
5
6This page lists all configuration options for dnsdist.
7
8.. note::
9
10 When an IPv6 IP:PORT combination is needed, the bracketed syntax from :rfc:`RFC 3986 <3986#section-3.2.2>` should be used.
11 e.g. "[2001:DB8:14::C0FF:FEE]:5300".
12
13Functions and Types
14-------------------
15
16Within dnsdist several core object types exist:
17
18* :class:`Server`: generated with :func:`newServer`, represents a downstream server
19* :class:`ComboAddress`: represents an IP address and port
20* :class:`DNSName`: represents a domain name
21* :class:`NetmaskGroup`: represents a group of netmasks
22* :class:`QPSLimiter`: implements a QPS-based filter
23* :class:`SuffixMatchNode`: represents a group of domain suffixes for rapid testing of membership
98650fde 24* :class:`DNSHeader`: represents the header of a DNS packet, see :ref:`DNSHeader`
bd51e34c 25* :class:`ClientState`: sometimes also called Bind or Frontend, represents the addresses and ports dnsdist is listening on
20d81666
PL
26
27The existence of most of these objects can mostly be ignored, unless you plan to write your own hooks and policies, but it helps to understand an expressions like:
28
29.. code-block:: lua
30
31 getServer(0).order=12 -- set order of server 0 to 12
32 getServer(0):addPool("abuse") -- add this server to the abuse pool
33
34The ``.`` means ``order`` is a data member, while the ``:`` means ``addPool`` is a member function.
35
36Global configuration
37--------------------
38
39.. function:: includeDirectory(path)
40
41 Include configuration files from ``path``.
42
43 :param str path: The directory to load the configuration from
44
45Listen Sockets
46~~~~~~~~~~~~~~
47
48.. function:: addLocal(address[, options])
49
50 .. versionadded:: 1.2.0
51
87cb3110
PL
52 .. versionchanged:: 1.3.0
53 Added ``cpus`` to the options.
54
20d81666
PL
55 Add to the list of listen addresses.
56
57 :param str address: The IP Address with an optional port to listen on.
58 The default port is 53.
59 :param table options: A table with key: value pairs with listen options.
60
61 Options:
62
63 * ``doTCP=true``: bool - Also bind on TCP on ``address``.
64 * ``reusePort=false``: bool - Set the ``SO_REUSEPORT`` socket option.
4bc167b8
RG
65 * ``tcpFastOpenSize=0``: int - Set the TCP Fast Open queue size, enabling TCP Fast Open when available and the value is larger than 0.
66 * ``interface=""``: str - Set the network interface to use.
67 * ``cpus={}``: table - Set the CPU affinity for this listener thread, asking the scheduler to run it on a single CPU id, or a set of CPU ids. This parameter is only available if the OS provides the pthread_setaffinity_np() function.
20d81666
PL
68
69 .. code-block:: lua
70
71 addLocal('0.0.0.0:5300', { doTCP=true, reusePort=true })
72
73 This will bind to both UDP and TCP on port 5300 with SO_REUSEPORT enabled.
74
75.. function:: addLocal(address[[[,do_tcp], so_reuseport], tcp_fast_open_qsize])
76
77 .. deprecated:: 1.2.0
78
79 Add to the list of addresses listened on.
80
81 :param str address: The IP Address with an optional port to listen on.
82 The default port is 53.
83 :param bool do_tcp: Also bind a TCP port on ``address``, defaults to true.
84 :param bool so_reuseport: Use ``SO_REUSEPORT`` if it is available, defaults to false
5d31a326
RG
85 :param int tcp_fast_open_qsize: The size of the TCP Fast Open queue. Set to a number
86 higher than 0 to enable TCP Fast Open when available.
87 Default is 0.
20d81666 88
fa974ada 89.. function:: addTLSLocal(address, certFile(s), keyFile(s) [, options])
a227f47d
RG
90
91 .. versionadded:: 1.3.0
fa974ada
RG
92 .. versionchanged:: 1.3.1
93 ``certFile(s)`` and ``keyFile(s)`` parameters accept a list of files.
a227f47d
RG
94
95 Listen on the specified address and TCP port for incoming DNS over TLS connections, presenting the specified X.509 certificate.
96
97 :param str address: The IP Address with an optional port to listen on.
98 The default port is 853.
fa974ada
RG
99 :param str certFile(s): The path to a X.509 certificate file in PEM format, or a list of paths to such files.
100 :param str keyFile(s): The path to the private key file corresponding to the certificate, or a list of paths to such files, whose order should match the certFile(s) ones.
a227f47d
RG
101 :param table options: A table with key: value pairs with listen options.
102
103 Options:
104
105 * ``doTCP=true``: bool - Also bind on TCP on ``address``.
106 * ``reusePort=false``: bool - Set the ``SO_REUSEPORT`` socket option.
107 * ``tcpFastOpenSize=0``: int - Set the TCP Fast Open queue size, enabling TCP Fast Open when available and the value is larger than 0.
108 * ``interface=""``: str - Set the network interface to use.
109 * ``cpus={}``: table - Set the CPU affinity for this listener thread, asking the scheduler to run it on a single CPU id, or a set of CPU ids. This parameter is only available if the OS provides the pthread_setaffinity_np() function.
110 * ``provider``: str - The TLS library to use between GnuTLS and OpenSSL, if they were available and enabled at compilation time.
111 * ``ciphers``: str - The TLS ciphers to use. The exact format depends on the provider used.
112 * ``numberOfTicketsKeys``: int - The maximum number of tickets keys to keep in memory at the same time, if the provider supports it (GnuTLS doesn't, OpenSSL does). Only one key is marked as active and used to encrypt new tickets while the remaining ones can still be used to decrypt existing tickets after a rotation. Default to 5.
113 * ``ticketKeyFile``: str - The path to a file from where TLS tickets keys should be loaded, to support RFC 5077. These keys should be rotated often and never written to persistent storage to preserve forward secrecy. The default is to generate a random key. The OpenSSL provider supports several tickets keys to be able to decrypt existing sessions after the rotation, while the GnuTLS provider only supports one key.
114 * ``ticketsKeysRotationDelay``: int - Set the delay before the TLS tickets key is rotated, in seconds. Default is 43200 (12h).
115
20d81666
PL
116.. function:: setLocal(address[, options])
117
118 .. versionadded:: 1.2.0
119
120 Remove the list of listen addresses and add a new one.
121
122 :param str address: The IP Address with an optional port to listen on.
123 The default port is 53.
124 :param table options: A table with key: value pairs with listen options.
125
126 The options that can be set are the same as :func:`addLocal`.
127
128.. function:: setLocal(address[[[,do_tcp], so_reuseport], tcp_fast_open_qsize])
129
130 .. deprecated:: 1.2.0
131
132 Remove the list of listen addresses and add a new one.
133
134 :param str address: The IP Address with an optional port to listen on.
135 The default port is 53.
136 :param bool do_tcp: Also bind a TCP port on ``address``, defaults to true.
137 :param bool so_reuseport: Use ``SO_REUSEPORT`` if it is available, defaults to false
5d31a326
RG
138 :param int tcp_fast_open_qsize: The size of the TCP Fast Open queue. Set to a number
139 higher than 0 to enable TCP Fast Open when available.
140 Default is 0.
20d81666
PL
141
142Control Socket, Console and Webserver
143~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
144
b5521206
RG
145.. function:: addConsoleACL(netmask)
146
147 .. versionadded:: 1.3.0
148
149 Add a netmask to the existing console ACL, allowing remote clients to connect to the console. Please make sure that encryption
c29d4db8 150 has been enabled with :func:`setKey` before doing so. The default is to only allow 127.0.0.1/8 and ::1/128.
b5521206
RG
151
152 :param str netmask: A CIDR netmask, e.g. ``"192.0.2.0/24"``. Without a subnetmask, only the specific address is allowed.
153
20d81666
PL
154.. function:: controlSocket(address)
155
b5521206
RG
156 Bind to ``addr`` and listen for a connection for the console. Since 1.3.0 only connections from local users are allowed
157 by default, :func:`addConsoleACL` and :func:`setConsoleACL` can be used to enable remote connections. Please make sure
350c690a
RG
158 that encryption has been enabled with :func:`setKey` before doing so. Enabling encryption is also strongly advised for
159 local connections, since not enabling it allows any local user to connect to the console.
20d81666
PL
160
161 :param str address: An IP address with optional port. By default, the port is 5199.
162
6f2a4580
PD
163.. function:: inClientStartup()
164
165 Returns true while the console client is parsing the configuration.
166
20d81666
PL
167.. function:: makeKey()
168
169 Generate and print an encryption key.
170
506bb661
RG
171.. function:: setConsoleConnectionsLogging(enabled)
172
173 .. versionadded:: 1.2.0
174
175 Whether to log the opening and closing of console connections.
176
177 :param bool enabled: Default to true.
178
20d81666
PL
179.. function:: setKey(key)
180
181 Use ``key`` as shared secret between the client and the server
182
183 :param str key: An encoded key, as generated by :func:`makeKey`
184
b5521206
RG
185.. function:: setConsoleACL(netmasks)
186
187 .. versionadded:: 1.3.0
188
189 Remove the existing console ACL and add the netmasks from the table, allowing remote clients to connect to the console. Please make sure that encryption
190 has been enabled with :func:`setKey` before doing so.
191
192 :param {str} netmasks: A table of CIDR netmask, e.g. ``{"192.0.2.0/24", "2001:DB8:14::/56"}``. Without a subnetmask, only the specific address is allowed.
193
194.. function:: showConsoleACL()
195
196 Print a list of all netmasks allowed to connect to the console.
197
20d81666
PL
198.. function:: testCrypto()
199
200 Test the crypto code, will report errors when something is not ok.
201
202Webserver
203~~~~~~~~~
204
205.. function:: webServer(listen_address, password[, apikey[, custom_headers]])
206
207 Launch the :doc:`../guides/webserver` with statistics and the API.
208
209 :param str listen_address: The IP address and Port to listen on
210 :param str password: The password required to access the webserver
211 :param str apikey: The key required to access the API
212 :param {[str]=str,...} custom_headers: Allows setting custom headers and removing the defaults
213
214.. function:: setAPIWritable(allow [,dir])
215
216 Allow modifications via the API.
217 Optionally saving these changes to disk.
218 Modifications done via the API will not be written to the configuration by default and will not persist after a reload
219
220 :param bool allow: Set to true to allow modification through the API
221 :param str dir: A valid directory where the configuration files will be written by the API.
222
223Access Control Lists
224~~~~~~~~~~~~~~~~~~~~
225
226.. function:: addACL(netmask)
227
c29d4db8 228 Add a netmask to the existing ACL controlling which clients can send UDP and TCP queries. See :ref:`ACL` for more information.
20d81666
PL
229
230 :param str netmask: A CIDR netmask, e.g. ``"192.0.2.0/24"``. Without a subnetmask, only the specific address is allowed.
231
232.. function:: setACL(netmasks)
233
c29d4db8 234 Remove the existing ACL and add the netmasks from the table of those allowed to send UDP and TCP queries. See :ref:`ACL` for more information.
20d81666
PL
235
236 :param {str} netmasks: A table of CIDR netmask, e.g. ``{"192.0.2.0/24", "2001:DB8:14::/56"}``. Without a subnetmask, only the specific address is allowed.
237
b5521206
RG
238.. function:: showACL()
239
c29d4db8 240 Print a list of all netmasks allowed to send queries over UDP and TCP. See :ref:`ACL` for more information.
b5521206 241
20d81666
PL
242EDNS Client Subnet
243~~~~~~~~~~~~~~~~~~
244
245.. function:: setECSSourcePrefixV4(prefix)
246
247 When ``useClientSubnet`` in :func:`newServer` is set and dnsdist adds an EDNS Client Subnet Client option to the query, truncate the requestors IPv4 address to ``prefix`` bits
248
249 :param int prefix: The prefix length
250
251.. function:: setECSSourcePrefixV6(prefix)
252
253 When ``useClientSubnet`` in :func:`newServer` is set and dnsdist adds an EDNS Client Subnet Client option to the query, truncate the requestor's IPv6 address to bits
254
255 :param int prefix: The prefix length
256
257Ringbuffers
258~~~~~~~~~~~
259
a609acdb
RG
260.. function:: setRingBuffersLockRetries(num)
261 .. versionadded:: 1.3.0
262
263 Set the number of shards to attempt to lock without blocking before giving up and simply blocking while waiting for the next shard to be available
264
265 :param int num: The maximum number of attempts. Defaults to 5 if there are more than one shard, 0 otherwise.
266
267.. function:: setRingBuffersSize(num [, numberOfShards])
268 .. versionchanged:: 1.3.0
269 ``numberOfShards`` optional parameter added.
20d81666 270
a609acdb 271 Set the capacity of the ringbuffers used for live traffic inspection to ``num``, and the number of shards to ``numberOfShards`` if specified.
20d81666
PL
272
273 :param int num: The maximum amount of queries to keep in the ringbuffer. Defaults to 10000
a609acdb 274 :param int numberOfShards: the number of shards to use to limit lock contention. Defaults to 1
20d81666
PL
275
276Servers
277-------
278
279.. function:: newServer(server_string)
280 newServer(server_table)
281
98650fde 282 .. versionchanged:: 1.3.0
87cb3110
PL
283 - Added ``checkClass`` to server_table.
284 - Added ``sockets`` to server_table
285 - Added ``checkFunction`` to server_table
286
98650fde 287
20d81666
PL
288 Add a new backend server. Call this function with either a string::
289
290 newServer(
291 "IP:PORT" -- IP and PORT of the backend server
292 )
293
294 or a table::
295
296 newServer({
297 address="IP:PORT", -- IP and PORT of the backend server (mandatory)
c19aa18d
RG
298 qps=NUM, -- Limit the number of queries per second to NUM, when using the `firstAvailable` policy
299 order=NUM, -- The order of this server, used by the `leastOustanding` and `firstAvailable` policies
278403d3
DM
300 weight=NUM, -- The weight of this server, used by the `wrandom` and `whashed` policies, default: 1
301 -- Supported values are a minimum of 1, and a maximum of 2147483647.
5d31a326
RG
302 pool=STRING|{STRING}, -- The pools this server belongs to (unset or empty string means default pool) as a string or table of strings
303 retries=NUM, -- The number of TCP connection attempts to the backend, for a given query
304 tcpConnectTimeout=NUM, -- The timeout (in seconds) of a TCP connection attempt
305 tcpSendTimeout=NUM, -- The timeout (in seconds) of a TCP write attempt
306 tcpRecvTimeout=NUM, -- The timeout (in seconds) of a TCP read attempt
307 tcpFastOpen=BOOL, -- Whether to enable TCP Fast Open
c0e7123d 308 ipBindAddrNoPort=BOOL, -- Whether to enable IP_BIND_ADDRESS_NO_PORT if available, default: true
5d31a326 309 name=STRING, -- The name associated to this backend, for display purpose
de9f7157 310 checkClass=NUM, -- Use NUM as QCLASS in the health-check query, default: DNSClass.IN
20d81666
PL
311 checkName=STRING, -- Use STRING as QNAME in the health-check query, default: "a.root-servers.net."
312 checkType=STRING, -- Use STRING as QTYPE in the health-check query, default: "A"
98650fde 313 checkFunction=FUNCTION -- Use this function to dynamically set the QNAME, QTYPE and QCLASS to use in the health-check query (see :ref:`Healthcheck`)
20d81666 314 setCD=BOOL, -- Set the CD (Checking Disabled) flag in the health-check query, default: false
fc1e69ee 315 maxCheckFailures=NUM, -- Allow NUM check failures before declaring the backend down, default: 1
20d81666
PL
316 mustResolve=BOOL, -- Set to true when the health check MUST return a NOERROR RCODE and an answer
317 useClientSubnet=BOOL, -- Add the client's IP address in the EDNS Client Subnet option when forwarding the query to this backend
18f707fa 318 source=STRING, -- The source address or interface to use for queries to this backend, by default this is left to the kernel's address selection
20d81666
PL
319 -- The following formats are supported:
320 -- "address", e.g. "192.0.2.2"
321 -- "interface name", e.g. "eth0"
322 -- "address@interface", e.g. "192.0.2.2@eth0"
150105a2 323 addXPF=NUM, -- Add the client's IP address and port to the query, along with the original destination address and port,
c85f69a8 324 -- using the experimental XPF record from `draft-bellis-dnsop-xpf <https://datatracker.ietf.org/doc/draft-bellis-dnsop-xpf/>`_ and the specified option code. Default is disabled (0)
150105a2 325 sockets=NUM -- Number of sockets (and thus source ports) used toward the backend server, defaults to a single one
20d81666
PL
326 })
327
328 :param str server_string: A simple IP:PORT string.
329 :param table server_table: A table with at least a 'name' key
330
331.. function:: getServer(index) -> Server
332
333 Get a :class:`Server`
334
335 :param int index: The number of the server (as seen in :func:`showServers`).
336 :returns: The :class:`Server` object or nil
337
338.. function:: getServers()
339
340 Returns a table with all defined servers.
341
342.. function:: rmServer(index)
343 rmServer(server)
344
345 Remove a backend server.
346
347 :param int index: The number of the server (as seen in :func:`showServers`).
348 :param Server server: A :class:`Server` object as returned by e.g. :func:`getServer`.
349
350Server Functions
351~~~~~~~~~~~~~~~~
352A server object returned by :func:`getServer` can be manipulated with these functions.
353
354.. class:: Server
355
356 This object represents a backend server. It has several methods.
357
d9018741 358 .. method:: Server:addPool(pool)
20d81666 359
d9018741 360 Add this server to a pool.
20d81666 361
d9018741 362 :param str pool: The pool to add the server to
20d81666 363
d9018741 364 .. method:: Server:getName() -> string
20d81666 365
d9018741 366 Get the name of this server.
20d81666 367
d9018741 368 :returns: The name of the server, or an empty string if it does not have one
20d81666 369
d9018741 370 .. method:: Server:getNameWithAddr() -> string
20d81666 371
d9018741 372 Get the name plus IP address and port of the server
20d81666 373
d9018741 374 :returns: A string containing the server name if any plus the server address and port
20d81666 375
d9018741 376 .. method:: Server:getOutstanding() -> int
20d81666 377
d9018741 378 Get the number of outstanding queries for this server.
20d81666 379
d9018741 380 :returns: The number of outstanding queries
20d81666 381
d9018741 382 .. method:: Server:isUp() -> bool
20d81666 383
d9018741 384 Returns the up status of the server
20d81666 385
d9018741 386 :returns: true when the server is up, false otherwise
20d81666 387
d9018741 388 .. method:: Server:rmPool(pool)
20d81666 389
d9018741 390 Removes the server from the named pool
20d81666 391
d9018741 392 :param str pool: The pool to remove the server from
20d81666 393
d9018741 394 .. method:: Server:setAuto([status])
d92708ed 395
d9018741
PL
396 .. versionchanged:: 1.3.0
397 ``status`` optional parameter added.
20d81666 398
d9018741
PL
399 Set the server in the default auto state.
400 This will enable health check queries that will set the server ``up`` and ``down`` appropriately.
d92708ed 401
d9018741 402 :param bool status: Set the initial status of the server to ``up`` (true) or ``down`` (false) instead of using the last known status
20d81666 403
d9018741 404 .. method:: Server:setQPS(limit)
20d81666 405
d9018741 406 Limit the queries per second for this server.
20d81666 407
d9018741 408 :param int limit: The maximum number of queries per second
20d81666 409
d9018741 410 .. method:: Server:setDown()
20d81666 411
d9018741
PL
412 Set the server in an ``DOWN`` state.
413 The server will not receive queries and the health checks are disabled
20d81666 414
d9018741 415 .. method:: Server:setUp()
20d81666 416
d9018741
PL
417 Set the server in an ``UP`` state.
418 This server will still receive queries and health checks are disabled
20d81666 419
d9018741 420 Apart from the functions, a :class:`Server` object has these attributes:
20d81666 421
d9018741 422 .. attribute:: Server.name
20d81666 423
d9018741 424 The name of the server
20d81666 425
d9018741 426 .. attribute:: Server.upStatus
20d81666 427
d9018741 428 Whether or not this server is up or down
20d81666 429
d9018741 430 .. attribute:: Server.order
20d81666 431
d9018741 432 The order of the server
20d81666 433
d9018741 434 .. attribute:: Server.weight
20d81666 435
d9018741 436 The weight of the server
20d81666
PL
437
438Pools
439-----
440
441:class:`Server`\ s can be part of any number of pools.
5d31a326
RG
442Pools are automatically created when a server is added to a pool (with :func:`newServer`), or can be manually created with :func:`addPool`.
443
444.. function:: addPool(name) -> ServerPool
445
446 Returns a :class:`ServerPool`.
447
448 :param string name: The name of the pool to create
20d81666
PL
449
450.. function:: getPool(name) -> ServerPool
451
452 Returns a :class:`ServerPool` or nil.
453
454 :param string name: The name of the pool
455
5d31a326
RG
456.. function:: rmPool(name)
457
458 Remove the pool named `name`.
459
460 :param string name: The name of the pool to remove
461
20d81666
PL
462.. function:: getPoolServers(name) -> [ Server ]
463
464 Returns a list of :class:`Server`\ s or nil.
465
466 :param string name: The name of the pool
467
468.. class:: ServerPool
469
470 This represents the pool where zero or more servers are part of.
471
d9018741 472 .. method:: ServerPool:getCache() -> PacketCache
20d81666 473
d9018741 474 Returns the :class:`PacketCache` for this pool or nil.
20d81666 475
7e687744
RG
476 .. method:: ServerPool:getECS()
477
478 .. versionadded:: 1.3.0
479
480 Whether dnsdist will add EDNS Client Subnet information to the query before looking up into the cache,
481 when all servers from this pool are down. For more information see :meth:`ServerPool:setECS`.
482
d9018741 483 .. method:: ServerPool:setCache(cache)
20d81666 484
d9018741 485 Adds ``cache`` as the pool's cache.
20d81666 486
d9018741 487 :param PacketCache cache: The new cache to add to the pool
20d81666 488
d9018741 489 .. method:: ServerPool:unsetCache()
20d81666 490
d9018741 491 Removes the cache from this pool.
20d81666 492
7e687744
RG
493 .. method:: ServerPool:setECS()
494
495 .. versionadded:: 1.3.0
496
497 Set to true if dnsdist should add EDNS Client Subnet information to the query before looking up into the cache,
498 when all servers from this pool are down. If at least one server is up, the preference of the
499 selected server is used, this parameter is only useful if all the backends in this pool are down
500 and have EDNS Client Subnet enabled, since the queries in the cache will have been inserted with
501 ECS information. Default is false.
502
20d81666
PL
503PacketCache
504~~~~~~~~~~~
505
506A Pool can have a packet cache to answer queries directly in stead of going to the backend.
507See :doc:`../guides/cache` for a how to.
508
47698274 509.. function:: newPacketCache(maxEntries[, maxTTL=86400[, minTTL=0[, temporaryFailureTTL=60[, staleTTL=60[, dontAge=false[, numberOfShards=1[, deferrableInsertLock=true[, maxNegativeTTL=3600]]]]]]]) -> PacketCache
4bc167b8 510
87cb3110
PL
511 .. versionchanged:: 1.3.0
512 ``numberOfShards`` and ``deferrableInsertLock`` parameters added.
20d81666 513
47698274
RG
514 .. versionchanged:: 1.3.1
515 ``maxNegativeTTL`` parameter added.
516
20d81666
PL
517 Creates a new :class:`PacketCache` with the settings specified.
518
519 :param int maxEntries: The maximum number of entries in this cache
520 :param int maxTTL: Cap the TTL for records to his number
521 :param int minTTL: Don't cache entries with a TTL lower than this
522 :param int temporaryFailureTTL: On a SERVFAIL or REFUSED from the backend, cache for this amount of seconds
523 :param int staleTTL: When the backend servers are not reachable, send responses if the cache entry is expired at most this amount of seconds
4bc167b8
RG
524 :param bool dontAge: Don't reduce TTLs when serving from the cache. Use this when :program:`dnsdist` fronts a cluster of authoritative servers
525 :param int numberOfShards: Number of shards to divide the cache into, to reduce lock contention
526 :param bool deferrableInsertLock: Whether the cache should give up insertion if the lock is held by another thread, or simply wait to get the lock
47698274 527 :param bool maxNegativeTTL: Cache a NXDomain or NoData answer from the backend for at most this amount of seconds, even if the TTL of the SOA record is higher
20d81666
PL
528
529.. class:: PacketCache
530
531 Represents a cache that can be part of :class:`ServerPool`.
532
f037144c
RG
533 .. method:: PacketCache:dump(fname)
534
535 .. versionadded:: 1.3.1
536
537 Dump a summary of the cache entries to a file.
538
539 :param str fname: The path to a file where the cache summary should be dumped. Note that if the target file already exists, it will not be overwritten.
540
d9018741 541 .. method:: PacketCache:expunge(n)
20d81666 542
d9018741 543 Remove entries from the cache, leaving at most ``n`` entries
20d81666 544
d9018741 545 :param int n: Number of entries to keep
20d81666 546
d9018741 547 .. method:: PacketCache:expungeByName(name [, qtype=dnsdist.ANY[, suffixMatch=false]])
20d81666 548
d9018741
PL
549 .. versionchanged:: 1.2.0
550 ``suffixMatch`` parameter added.
20d81666 551
d9018741 552 Remove entries matching ``name`` and type from the cache.
20d81666 553
d9018741
PL
554 :param DNSName name: The name to expunge
555 :param int qtype: The type to expunge
556 :param bool suffixMatch: When set to true, remove al entries under ``name``
20d81666 557
d9018741 558 .. method:: PacketCache:isFull() -> bool
20d81666 559
d9018741 560 Return true if the cache has reached the maximum number of entries.
20d81666 561
d9018741 562 .. method:: PacketCache:printStats()
20d81666 563
d9018741 564 Print the cache stats (hits, misses, deferred lookups and deferred inserts).
20d81666 565
d9018741 566 .. method:: PacketCache:purgeExpired(n)
20d81666 567
d9018741 568 Remove expired entries from the cache until there is at most ``n`` entries remaining in the cache.
20d81666 569
d9018741 570 :param int n: Number of entries to keep
20d81666 571
d9018741 572 .. method:: PacketCache:toString() -> string
20d81666 573
d9018741 574 Return the number of entries in the Packet Cache, and the maximum number of entries
20d81666 575
bd51e34c
RG
576Client State
577------------
578
579Also called frontend or bind, the Client State object returned by :func:`getBind` and listed with :func:`showBinds` represents an address and port dnsdist is listening on.
580
581.. function:: getBind(index) -> ClientState
582
d9018741 583 Return a :class:`ClientState` object.
bd51e34c
RG
584
585 :param int index: The object index
586
587ClientState functions
588~~~~~~~~~~~~~~~~~~~~~
589
590.. class:: ClientState
591
592 This object represents an address and port dnsdist is listening on. When ``reuseport`` is in use, several ClientState objects can be present for the same address and port.
593
d9018741 594 .. method:: ClientState:attachFilter(filter)
bd51e34c 595
d9018741 596 Attach a BPF filter to this frontend.
bd51e34c 597
d9018741 598 :param BPFFilter filter: The filter to attach to this frontend
bd51e34c 599
d9018741 600 .. method:: ClientState:detachFilter()
bd51e34c 601
d9018741 602 Remove the BPF filter associated to this frontend, if any.
bd51e34c 603
d9018741 604 .. method:: ClientState:toString() -> string
bd51e34c 605
d9018741 606 Return the address and port this frontend is listening on.
bd51e34c 607
d9018741 608 :returns: The address and port this frontend is listening on
bd51e34c 609
d9018741 610 .. attribute:: ClientState.muted
bd51e34c 611
d9018741 612 If set to true, queries received on this frontend will be normally processed and sent to a backend if needed, but no response will be ever be sent to the client over UDP. TCP queries are processed normally and responses sent to the client.
bd51e34c 613
20d81666
PL
614Status, Statistics and More
615---------------------------
616
617.. function:: dumpStats()
618
619 Print all statistics dnsdist gathers
620
a227f47d 621.. function:: getTLSContext(idx)
d9018741 622
a227f47d
RG
623 .. versionadded:: 1.3.0
624
625 Return the TLSContext object for the context of index ``idx``.
626
20d81666
PL
627.. function:: grepq(selector[, num])
628 grepq(selectors[, num])
629
630 Prints the last ``num`` queries matching ``selector`` or ``selectors``.
631
632 The selector can be:
633
634 * a netmask (e.g. '192.0.2.0/24')
635 * a DNS name (e.g. 'dnsdist.org')
636 * a response time (e.g. '100ms')
637
638 :param str selector: Select queries based on this property.
639 :param {str} selectors: A lua table of selectors. Only queries matching all selectors are shown
640 :param int num: Show a maximum of ``num`` recent queries, default is 10.
641
0fb7654e
CHB
642.. function:: setVerboseHealthChecks(verbose)
643
644 Set whether health check errors should be logged. This is turned off by default.
645
646 :param bool verbose: Set to true if you want to enable health check errors logging
647
77d43b54
RG
648.. function:: showBinds()
649
650 Print a list of all the current addresses and ports dnsdist is listening on, also called ``frontends``
651
20d81666
PL
652.. function:: showResponseLatency()
653
77d43b54 654 Show a plot of the response time latency distribution
20d81666
PL
655
656.. function:: showServers()
657
658 This function shows all backend servers currently configured and some statistics.
659 These statics have the following fields:
660
661 * ``#`` - The number of the server, can be used as the argument for :func:`getServer`
662 * ``Address`` - The IP address and port of the server
663 * ``State`` - The current state of the server
664 * ``Qps`` - Current number of queries per second
665 * ``Qlim`` - Configured maximum number of queries per second
666 * ``Ord`` - The order number of the server
667 * ``Wt`` - The weight of the server
668 * ``Queries`` - Total amount of queries sent to this server
669 * ``Drops`` - Number of queries that were dropped by this server
670 * ``Drate`` - Number of queries dropped per second by this server
671 * ``Lat`` - The latency of this server in milliseconds
672 * ``Pools`` - The pools this server belongs to
673
674.. function:: showTCPStats()
675
77d43b54 676 Show some statistics regarding TCP
20d81666 677
a227f47d 678.. function:: showTLSContexts()
d9018741 679
a227f47d
RG
680 .. versionadded:: 1.3.0
681
682 Print the list of all availables DNS over TLS contexts.
683
20d81666
PL
684.. function:: showVersion()
685
686 Print the version of dnsdist
687
688.. function:: topBandwidth([num])
689
690 Print the top ``num`` clients that consume the most bandwidth.
691
692 :param int num: Number to show, defaults to 10.
693
694.. function:: topClients([num])
695
696 Print the top ``num`` clients sending the most queries over length of ringbuffer
697
698 :param int num: Number to show, defaults to 10.
699
700.. function:: topQueries([num[, labels]])
701
702 Print the ``num`` most popular QNAMEs from queries.
703 Optionally grouped by the rightmost ``labels`` DNS labels.
704
705 :param int num: Number to show, defaults to 10
706 :param int label: Number of labels to cut down to
707
708.. function:: topResponses([num[, rcode[, labels]]])
709
967f6a7f 710 Print the ``num`` most seen responses with an RCODE of ``rcode``.
20d81666
PL
711 Optionally grouped by the rightmost ``labels`` DNS labels.
712
713 :param int num: Number to show, defaults to 10
967f6a7f 714 :param int rcode: :ref:`Response code <DNSRCode>`, defaults to 0 (No Error)
20d81666
PL
715 :param int label: Number of labels to cut down to
716
717.. function:: topSlow([num[, limit[, labels]]])
718
719 Print the ``num`` slowest queries that are slower than ``limit`` milliseconds.
720 Optionally grouped by the rightmost ``labels`` DNS labels.
721
722 :param int num: Number to show, defaults to 10
af4b7afb 723 :param int limit: Show queries slower than this amount of milliseconds, defaults to 2000
20d81666
PL
724 :param int label: Number of labels to cut down to
725
726.. _dynblocksref:
727
728Dynamic Blocks
729--------------
730
731.. function:: addDynBlocks(addresses, message[, seconds=10[, action]])
732
733 .. versionchanged:: 1.2.0
734 ``action`` parameter added.
735
736 Block a set of addresses with ``message`` for (optionally) a number of seconds.
737 The default number of seconds to block for is 10.
738
739 :param addresses: set of Addresses as returned by an exceed function
740 :param string message: The message to show next to the blocks
741 :param int seconds: The number of seconds this block to expire
742 :param int action: The action to take when the dynamic block matches, see :ref:`here <DNSAction>`. (default to the one set with :func:`setDynBlocksAction`)
743
744.. function:: clearDynBlocks()
745
746 Remove all current dynamic blocks.
747
748.. function:: showDynBlocks()
749
750 List all dynamic blocks in effect.
751
752.. function:: setDynBlocksAction(action)
753
754 Set which action is performed when a query is blocked.
752d505b 755 Only DNSAction.Drop (the default), DNSAction.Refused and DNSAction.Truncate are supported.
20d81666 756
20d81666
PL
757.. _exceedfuncs:
758
759Getting addresses that exceeded parameters
760~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
761
762.. function:: exceedServFails(rate, seconds)
763
764 Get set of addresses that exceed ``rate`` servfails/s over ``seconds`` seconds
765
766 :param int rate: Number of Servfails per second to exceed
767 :param int seconds: Number of seconds the rate has been exceeded
768
769.. function:: exceedNXDOMAINs(rate, seconds)
770
771 get set of addresses that exceed ``rate`` NXDOMAIN/s over ``seconds`` seconds
772
773 :param int rate: Number of NXDOMAIN per second to exceed
774 :param int seconds: Number of seconds the rate has been exceeded
775
776.. function:: exceedRespByterate(rate, seconds)
777
778 get set of addresses that exceeded ``rate`` bytes/s answers over ``seconds`` seconds
779
780 :param int rate: Number of bytes per second to exceed
781 :param int seconds: Number of seconds the rate has been exceeded
782
783.. function:: exceedQRate(rate, seconds)
784
785 Get set of address that exceed ``rate`` queries/s over ``seconds`` seconds
786
787 :param int rate: Number of queries per second to exceed
788 :param int seconds: Number of seconds the rate has been exceeded
789
790.. function:: exceedQTypeRate(type, rate, seconds)
791
792 Get set of address that exceed ``rate`` queries/s for queries of QType ``type`` over ``seconds`` seconds
793
794 :param int type: QType
795 :param int rate: Number of QType queries per second to exceed
796 :param int seconds: Number of seconds the rate has been exceeded
797
dc2fd93a
RG
798DynBlockRulesGroup
799~~~~~~~~~~~~~~~~~~
800
801Instead of using several `exceed*()` lines, dnsdist 1.3.0 introduced a new `DynBlockRulesGroup` object
802which can be used to group dynamic block rules.
803
804See :doc:`../guides/dynblocks` for more information about the case where using a `DynBlockRulesGroup` might be
805faster than the existing rules.
806
807.. function:: dynBlockRulesGroup() -> DynBlockRulesGroup
808
ad9344ba 809 .. versionadded:: 1.3.0
dc2fd93a
RG
810
811 Creates a new :class:`DynBlockRulesGroup` object.
812
813.. class:: DynBlockRulesGroup
814
815 Represents a group of dynamic block rules.
816
817 .. method:: DynBlockRulesGroup:setQueryRate(rate, seconds, reason, blockingTime [, action])
818
819 Adds a query rate-limiting rule, equivalent to:
820 ```
821 addDynBlocks(exceedQRate(rate, seconds), reason, blockingTime, action)
822 ```
823
824 :param int rate: Number of queries per second to exceed
825 :param int seconds: Number of seconds the rate has been exceeded
826 :param string reason: The message to show next to the blocks
827 :param int blockingTime: The number of seconds this block to expire
828 :param int action: The action to take when the dynamic block matches, see :ref:`here <DNSAction>`. (default to the one set with :func:`setDynBlocksAction`)
829
830 .. method:: DynBlockRulesGroup:setRCodeRate(rcode, rate, seconds, reason, blockingTime [, action])
831
832 Adds a rate-limiting rule for responses of code ``rcode``, equivalent to:
833 ```
834 addDynBlocks(exceedServfails(rcode, rate, seconds), reason, blockingTime, action)
835 ```
836
837 :param int rcode: The response code
838 :param int rate: Number of responses per second to exceed
839 :param int seconds: Number of seconds the rate has been exceeded
840 :param string reason: The message to show next to the blocks
841 :param int blockingTime: The number of seconds this block to expire
842 :param int action: The action to take when the dynamic block matches, see :ref:`here <DNSAction>`. (default to the one set with :func:`setDynBlocksAction`)
843
844 .. method:: DynBlockRulesGroup:setQTypeRate(qtype, rate, seconds, reason, blockingTime [, action])
845
846 Adds a rate-limiting rule for queries of type ``qtype``, equivalent to:
847 ```
848 addDynBlocks(exceedQTypeRate(type, rate, seconds), reason, blockingTime, action)
849 ```
850
851 :param int qtype: The qtype
852 :param int rate: Number of queries per second to exceed
853 :param int seconds: Number of seconds the rate has been exceeded
854 :param string reason: The message to show next to the blocks
855 :param int blockingTime: The number of seconds this block to expire
856 :param int action: The action to take when the dynamic block matches, see :ref:`here <DNSAction>`. (default to the one set with :func:`setDynBlocksAction`)
857
858 .. method:: DynBlockRulesGroup:setRespByteRate(rate, seconds, reason, blockingTime [, action])
859
860 Adds a bandwidth rate-limiting rule for responses, equivalent to:
861 ```
862 addDynBlocks(exceedRespByterate(rate, seconds), reason, blockingTime, action)
863 ```
864
865 :param int rate: Number of bytes per second to exceed
866 :param int seconds: Number of seconds the rate has been exceeded
867 :param string reason: The message to show next to the blocks
868 :param int blockingTime: The number of seconds this block to expire
869 :param int action: The action to take when the dynamic block matches, see :ref:`here <DNSAction>`. (default to the one set with :func:`setDynBlocksAction`)
870
871 .. method:: DynBlockRulesGroup:apply()
872
873 Walk the in-memory query and response ring buffers and apply the configured rate-limiting rules, adding dynamic blocks when the limits have been exceeded.
874
b718792f
RG
875 .. method:: DynBlockRulesGroup:excludeRange(netmasks)
876
877 .. versionadded:: 1.3.1
878
879 Exclude this range, or list of ranges, meaning that no dynamic block will ever be inserted for clients in that range. Default to empty, meaning rules are applied to all ranges. When used in combination with :meth:`DynBlockRulesGroup:includeRange`, the more specific entry wins.
880
881 :param int netmasks: A netmask, or list of netmasks, as strings, like for example "192.0.2.1/24"
882
883 .. method:: DynBlockRulesGroup:includeRange(netmasks)
884
885 .. versionadded:: 1.3.1
886
887 Include this range, or list of ranges, meaning that rules will be applied to this range. When used in combination with :meth:`DynBlockRulesGroup:excludeRange`, the more specific entry wins.
888
889 :param int netmasks: A netmask, or list of netmasks, as strings, like for example "192.0.2.1/24"
890
891 .. method:: DynBlockRulesGroup:toString()
892
893 .. versionadded:: 1.3.1
894
895 Return a string describing the rules and range exclusions of this DynBlockRulesGroup.
896
20d81666
PL
897Other functions
898---------------
899
900.. function:: maintenance()
901
902 If this function exists, it is called every second to so regular tasks.
903 This can be used for e.g. :doc:`Dynamic Blocks <../guides/dynblocks>`.
a227f47d
RG
904
905TLSContext
906~~~~~~~~~~
907
908.. class:: TLSContext
d9018741 909
a227f47d
RG
910 .. versionadded:: 1.3.0
911
912 This object represents an address and port dnsdist is listening on for DNS over TLS queries.
913
d9018741 914 .. method:: TLSContext:rotateTicketsKey()
a227f47d 915
d9018741 916 Replace the current TLS tickets key by a new random one.
a227f47d 917
d9018741 918 .. method:: TLSContext:loadTicketsKeys(ticketsKeysFile)
a227f47d 919
d9018741 920 Load new tickets keys from the selected file, replacing the existing ones. These keys should be rotated often and never written to persistent storage to preserve forward secrecy. The default is to generate a random key. The OpenSSL provider supports several tickets keys to be able to decrypt existing sessions after the rotation, while the GnuTLS provider only supports one key.
a227f47d 921
d9018741 922 :param str ticketsKeysFile: The path to a file from where TLS tickets keys should be loaded.