2
0
mirror of https://gitlab.isc.org/isc-projects/bind9 synced 2025-09-01 06:55:30 +00:00

option to disable validation under specified names

- added new 'validate-except' option, which configures an NTA with
  expiry of 0xffffffff.  NTAs with that value in the expiry field do not
  expire, are are not written out when saving the NTA table and are not
  dumped by rndc secroots
This commit is contained in:
Evan Hunt
2018-04-30 16:10:17 -07:00
parent 509d71e1aa
commit eaac2057c7
11 changed files with 208 additions and 176 deletions

View File

@@ -13,7 +13,7 @@
<refentry xmlns:db="http://docbook.org/ns/docbook" version="5.0" xml:id="man.named.conf"> <refentry xmlns:db="http://docbook.org/ns/docbook" version="5.0" xml:id="man.named.conf">
<info> <info>
<date>2018-05-29</date> <date>2018-06-21</date>
</info> </info>
<refentryinfo> <refentryinfo>
<corpname>ISC</corpname> <corpname>ISC</corpname>
@@ -224,9 +224,9 @@ options {
coresize ( default | unlimited | <replaceable>sizeval</replaceable> ); coresize ( default | unlimited | <replaceable>sizeval</replaceable> );
datasize ( default | unlimited | <replaceable>sizeval</replaceable> ); datasize ( default | unlimited | <replaceable>sizeval</replaceable> );
deny-answer-addresses { <replaceable>address_match_element</replaceable>; ... } [ deny-answer-addresses { <replaceable>address_match_element</replaceable>; ... } [
except-from { <replaceable>quoted_string</replaceable>; ... } ]; except-from { <replaceable>string</replaceable>; ... } ];
deny-answer-aliases { <replaceable>quoted_string</replaceable>; ... } [ except-from { deny-answer-aliases { <replaceable>string</replaceable>; ... } [ except-from { <replaceable>string</replaceable>; ...
<replaceable>quoted_string</replaceable>; ... } ]; } ];
dialup ( notify | notify-passive | passive | refresh | <replaceable>boolean</replaceable> ); dialup ( notify | notify-passive | passive | refresh | <replaceable>boolean</replaceable> );
directory <replaceable>quoted_string</replaceable>; directory <replaceable>quoted_string</replaceable>;
disable-algorithms <replaceable>string</replaceable> { <replaceable>string</replaceable>; disable-algorithms <replaceable>string</replaceable> { <replaceable>string</replaceable>;
@@ -257,14 +257,12 @@ options {
dnssec-secure-to-insecure <replaceable>boolean</replaceable>; dnssec-secure-to-insecure <replaceable>boolean</replaceable>;
dnssec-update-mode ( maintain | no-resign ); dnssec-update-mode ( maintain | no-resign );
dnssec-validation ( yes | no | auto ); dnssec-validation ( yes | no | auto );
dnstap { ( all | auth | client | forwarder | dnstap { ( all | auth | client | forwarder | resolver ) [ ( query |
resolver ) [ ( query | response ) ]; ... }; response ) ]; ... };
dnstap-identity ( <replaceable>quoted_string</replaceable> | none | dnstap-identity ( <replaceable>quoted_string</replaceable> | none | hostname );
hostname ); dnstap-output ( file | unix ) <replaceable>quoted_string</replaceable> [ size ( unlimited |
dnstap-output ( file | unix ) <replaceable>quoted_string</replaceable> [ <replaceable>size</replaceable> ) ] [ versions ( unlimited | <replaceable>integer</replaceable> ) ] [ suffix (
size ( unlimited | <replaceable>size</replaceable> ) ] [ versions ( increment | timestamp ) ];
unlimited | <replaceable>integer</replaceable> ) ] [ suffix ( increment
| timestamp ) ];
dnstap-version ( <replaceable>quoted_string</replaceable> | none ); dnstap-version ( <replaceable>quoted_string</replaceable> | none );
dscp <replaceable>integer</replaceable>; dscp <replaceable>integer</replaceable>;
dual-stack-servers [ port <replaceable>integer</replaceable> ] { ( <replaceable>quoted_string</replaceable> [ port dual-stack-servers [ port <replaceable>integer</replaceable> ] { ( <replaceable>quoted_string</replaceable> [ port
@@ -362,7 +360,7 @@ options {
preferred-glue <replaceable>string</replaceable>; preferred-glue <replaceable>string</replaceable>;
prefetch <replaceable>integer</replaceable> [ <replaceable>integer</replaceable> ]; prefetch <replaceable>integer</replaceable> [ <replaceable>integer</replaceable> ];
provide-ixfr <replaceable>boolean</replaceable>; provide-ixfr <replaceable>boolean</replaceable>;
qname-minimization ( strict | relaxed | disabled ); qname-minimization ( strict | relaxed | disabled | off );
query-source ( ( [ address ] ( <replaceable>ipv4_address</replaceable> | * ) [ port ( query-source ( ( [ address ] ( <replaceable>ipv4_address</replaceable> | * ) [ port (
<replaceable>integer</replaceable> | * ) ] ) | ( [ [ address ] ( <replaceable>ipv4_address</replaceable> | * ) ] <replaceable>integer</replaceable> | * ) ] ) | ( [ [ address ] ( <replaceable>ipv4_address</replaceable> | * ) ]
port ( <replaceable>integer</replaceable> | * ) ) ) [ dscp <replaceable>integer</replaceable> ]; port ( <replaceable>integer</replaceable> | * ) ) ) [ dscp <replaceable>integer</replaceable> ];
@@ -413,7 +411,7 @@ options {
nsip-enable <replaceable>boolean</replaceable> ] [ nsdname-enable <replaceable>boolean</replaceable> ] [ nsip-enable <replaceable>boolean</replaceable> ] [ nsdname-enable <replaceable>boolean</replaceable> ] [
dnsrps-enable <replaceable>boolean</replaceable> ] [ dnsrps-options { <replaceable>unspecified-text</replaceable> dnsrps-enable <replaceable>boolean</replaceable> ] [ dnsrps-options { <replaceable>unspecified-text</replaceable>
} ]; } ];
root-delegation-only [ exclude { <replaceable>quoted_string</replaceable>; ... } ]; root-delegation-only [ exclude { <replaceable>string</replaceable>; ... } ];
root-key-sentinel <replaceable>boolean</replaceable>; root-key-sentinel <replaceable>boolean</replaceable>;
rrset-order { [ class <replaceable>string</replaceable> ] [ type <replaceable>string</replaceable> ] [ name rrset-order { [ class <replaceable>string</replaceable> ] [ type <replaceable>string</replaceable> ] [ name
<replaceable>quoted_string</replaceable> ] <replaceable>string</replaceable> <replaceable>string</replaceable>; ... }; <replaceable>quoted_string</replaceable> ] <replaceable>string</replaceable> <replaceable>string</replaceable>; ... };
@@ -463,6 +461,7 @@ options {
use-v4-udp-ports { <replaceable>portrange</replaceable>; ... }; use-v4-udp-ports { <replaceable>portrange</replaceable>; ... };
use-v6-udp-ports { <replaceable>portrange</replaceable>; ... }; use-v6-udp-ports { <replaceable>portrange</replaceable>; ... };
v6-bias <replaceable>integer</replaceable>; v6-bias <replaceable>integer</replaceable>;
validate-except { <replaceable>string</replaceable>; ... };
version ( <replaceable>quoted_string</replaceable> | none ); version ( <replaceable>quoted_string</replaceable> | none );
zero-no-soa-ttl <replaceable>boolean</replaceable>; zero-no-soa-ttl <replaceable>boolean</replaceable>;
zero-no-soa-ttl-cache <replaceable>boolean</replaceable>; zero-no-soa-ttl-cache <replaceable>boolean</replaceable>;
@@ -574,9 +573,9 @@ view <replaceable>string</replaceable> [ <replaceable>class</replaceable> ] {
cleaning-interval <replaceable>integer</replaceable>; cleaning-interval <replaceable>integer</replaceable>;
clients-per-query <replaceable>integer</replaceable>; clients-per-query <replaceable>integer</replaceable>;
deny-answer-addresses { <replaceable>address_match_element</replaceable>; ... } [ deny-answer-addresses { <replaceable>address_match_element</replaceable>; ... } [
except-from { <replaceable>quoted_string</replaceable>; ... } ]; except-from { <replaceable>string</replaceable>; ... } ];
deny-answer-aliases { <replaceable>quoted_string</replaceable>; ... } [ except-from { deny-answer-aliases { <replaceable>string</replaceable>; ... } [ except-from { <replaceable>string</replaceable>; ...
<replaceable>quoted_string</replaceable>; ... } ]; } ];
dialup ( notify | notify-passive | passive | refresh | <replaceable>boolean</replaceable> ); dialup ( notify | notify-passive | passive | refresh | <replaceable>boolean</replaceable> );
disable-algorithms <replaceable>string</replaceable> { <replaceable>string</replaceable>; disable-algorithms <replaceable>string</replaceable> { <replaceable>string</replaceable>;
... }; ... };
@@ -610,8 +609,8 @@ view <replaceable>string</replaceable> [ <replaceable>class</replaceable> ] {
dnssec-secure-to-insecure <replaceable>boolean</replaceable>; dnssec-secure-to-insecure <replaceable>boolean</replaceable>;
dnssec-update-mode ( maintain | no-resign ); dnssec-update-mode ( maintain | no-resign );
dnssec-validation ( yes | no | auto ); dnssec-validation ( yes | no | auto );
dnstap { ( all | auth | client | forwarder | dnstap { ( all | auth | client | forwarder | resolver ) [ ( query |
resolver ) [ ( query | response ) ]; ... }; response ) ]; ... };
dual-stack-servers [ port <replaceable>integer</replaceable> ] { ( <replaceable>quoted_string</replaceable> [ port dual-stack-servers [ port <replaceable>integer</replaceable> ] { ( <replaceable>quoted_string</replaceable> [ port
<replaceable>integer</replaceable> ] [ dscp <replaceable>integer</replaceable> ] | <replaceable>ipv4_address</replaceable> [ port <replaceable>integer</replaceable> ] [ dscp <replaceable>integer</replaceable> ] | <replaceable>ipv4_address</replaceable> [ port
<replaceable>integer</replaceable> ] [ dscp <replaceable>integer</replaceable> ] | <replaceable>ipv6_address</replaceable> [ port <replaceable>integer</replaceable> ] [ dscp <replaceable>integer</replaceable> ] | <replaceable>ipv6_address</replaceable> [ port
@@ -689,7 +688,7 @@ view <replaceable>string</replaceable> [ <replaceable>class</replaceable> ] {
preferred-glue <replaceable>string</replaceable>; preferred-glue <replaceable>string</replaceable>;
prefetch <replaceable>integer</replaceable> [ <replaceable>integer</replaceable> ]; prefetch <replaceable>integer</replaceable> [ <replaceable>integer</replaceable> ];
provide-ixfr <replaceable>boolean</replaceable>; provide-ixfr <replaceable>boolean</replaceable>;
qname-minimization ( strict | relaxed | disabled ); qname-minimization ( strict | relaxed | disabled | off );
query-source ( ( [ address ] ( <replaceable>ipv4_address</replaceable> | * ) [ port ( query-source ( ( [ address ] ( <replaceable>ipv4_address</replaceable> | * ) [ port (
<replaceable>integer</replaceable> | * ) ] ) | ( [ [ address ] ( <replaceable>ipv4_address</replaceable> | * ) ] <replaceable>integer</replaceable> | * ) ] ) | ( [ [ address ] ( <replaceable>ipv4_address</replaceable> | * ) ]
port ( <replaceable>integer</replaceable> | * ) ) ) [ dscp <replaceable>integer</replaceable> ]; port ( <replaceable>integer</replaceable> | * ) ) ) [ dscp <replaceable>integer</replaceable> ];
@@ -735,7 +734,7 @@ view <replaceable>string</replaceable> [ <replaceable>class</replaceable> ] {
nsip-enable <replaceable>boolean</replaceable> ] [ nsdname-enable <replaceable>boolean</replaceable> ] [ nsip-enable <replaceable>boolean</replaceable> ] [ nsdname-enable <replaceable>boolean</replaceable> ] [
dnsrps-enable <replaceable>boolean</replaceable> ] [ dnsrps-options { <replaceable>unspecified-text</replaceable> dnsrps-enable <replaceable>boolean</replaceable> ] [ dnsrps-options { <replaceable>unspecified-text</replaceable>
} ]; } ];
root-delegation-only [ exclude { <replaceable>quoted_string</replaceable>; ... } ]; root-delegation-only [ exclude { <replaceable>string</replaceable>; ... } ];
root-key-sentinel <replaceable>boolean</replaceable>; root-key-sentinel <replaceable>boolean</replaceable>;
rrset-order { [ class <replaceable>string</replaceable> ] [ type <replaceable>string</replaceable> ] [ name rrset-order { [ class <replaceable>string</replaceable> ] [ type <replaceable>string</replaceable> ] [ name
<replaceable>quoted_string</replaceable> ] <replaceable>string</replaceable> <replaceable>string</replaceable>; ... }; <replaceable>quoted_string</replaceable> ] <replaceable>string</replaceable> <replaceable>string</replaceable>; ... };
@@ -797,6 +796,7 @@ view <replaceable>string</replaceable> [ <replaceable>class</replaceable> ] {
update-check-ksk <replaceable>boolean</replaceable>; update-check-ksk <replaceable>boolean</replaceable>;
use-alt-transfer-source <replaceable>boolean</replaceable>; use-alt-transfer-source <replaceable>boolean</replaceable>;
v6-bias <replaceable>integer</replaceable>; v6-bias <replaceable>integer</replaceable>;
validate-except { <replaceable>string</replaceable>; ... };
zero-no-soa-ttl <replaceable>boolean</replaceable>; zero-no-soa-ttl <replaceable>boolean</replaceable>;
zero-no-soa-ttl-cache <replaceable>boolean</replaceable>; zero-no-soa-ttl-cache <replaceable>boolean</replaceable>;
zone <replaceable>string</replaceable> [ <replaceable>class</replaceable> ] { zone <replaceable>string</replaceable> [ <replaceable>class</replaceable> ] {
@@ -878,7 +878,7 @@ view <replaceable>string</replaceable> [ <replaceable>class</replaceable> ] {
serial-update-method ( date | increment | unixtime ); serial-update-method ( date | increment | unixtime );
server-addresses { ( <replaceable>ipv4_address</replaceable> | <replaceable>ipv6_address</replaceable> ) [ server-addresses { ( <replaceable>ipv4_address</replaceable> | <replaceable>ipv6_address</replaceable> ) [
port <replaceable>integer</replaceable> ]; ... }; port <replaceable>integer</replaceable> ]; ... };
server-names { <replaceable>quoted_string</replaceable>; ... }; server-names { <replaceable>string</replaceable>; ... };
sig-signing-nodes <replaceable>integer</replaceable>; sig-signing-nodes <replaceable>integer</replaceable>;
sig-signing-signatures <replaceable>integer</replaceable>; sig-signing-signatures <replaceable>integer</replaceable>;
sig-signing-type <replaceable>integer</replaceable>; sig-signing-type <replaceable>integer</replaceable>;
@@ -982,7 +982,7 @@ zone <replaceable>string</replaceable> [ <replaceable>class</replaceable> ] {
serial-update-method ( date | increment | unixtime ); serial-update-method ( date | increment | unixtime );
server-addresses { ( <replaceable>ipv4_address</replaceable> | <replaceable>ipv6_address</replaceable> ) [ port server-addresses { ( <replaceable>ipv4_address</replaceable> | <replaceable>ipv6_address</replaceable> ) [ port
<replaceable>integer</replaceable> ]; ... }; <replaceable>integer</replaceable> ]; ... };
server-names { <replaceable>quoted_string</replaceable>; ... }; server-names { <replaceable>string</replaceable>; ... };
sig-signing-nodes <replaceable>integer</replaceable>; sig-signing-nodes <replaceable>integer</replaceable>;
sig-signing-signatures <replaceable>integer</replaceable>; sig-signing-signatures <replaceable>integer</replaceable>;
sig-signing-type <replaceable>integer</replaceable>; sig-signing-type <replaceable>integer</replaceable>;

View File

@@ -3692,6 +3692,7 @@ configure_view(dns_view_t *view, dns_viewlist_t *viewlist,
isc_dscp_t dscp4 = -1, dscp6 = -1; isc_dscp_t dscp4 = -1, dscp6 = -1;
dns_dyndbctx_t *dctx = NULL; dns_dyndbctx_t *dctx = NULL;
unsigned int resolver_param; unsigned int resolver_param;
dns_ntatable_t *ntatable = NULL;
const char *qminmode = NULL; const char *qminmode = NULL;
REQUIRE(DNS_VIEW_VALID(view)); REQUIRE(DNS_VIEW_VALID(view));
@@ -5348,8 +5349,35 @@ configure_view(dns_view_t *view, dns_viewlist_t *viewlist,
CHECK(dns_name_fromstring(name, cfg_obj_asstring(obj), 0, CHECK(dns_name_fromstring(name, cfg_obj_asstring(obj), 0,
NULL)); NULL));
view->redirectzone = name; view->redirectzone = name;
} else } else {
view->redirectzone = NULL; view->redirectzone = NULL;
}
/*
* Exceptions to DNSSEC validation.
*/
obj = NULL;
result = named_config_get(maps, "validate-except", &obj);
if (result == ISC_R_SUCCESS) {
result = dns_view_getntatable(view, &ntatable);
}
if (result == ISC_R_SUCCESS) {
for (element = cfg_list_first(obj);
element != NULL;
element = cfg_list_next(element))
{
dns_fixedname_t fntaname;
dns_name_t *ntaname;
ntaname = dns_fixedname_initname(&fntaname);
obj = cfg_listelt_value(element);
CHECK(dns_name_fromstring(ntaname,
cfg_obj_asstring(obj),
0, NULL));
CHECK(dns_ntatable_add(ntatable, ntaname,
true, 0, 0xffffffffU));
}
}
#ifdef HAVE_DNSTAP #ifdef HAVE_DNSTAP
/* /*
@@ -5362,35 +5390,51 @@ configure_view(dns_view_t *view, dns_viewlist_t *viewlist,
result = ISC_R_SUCCESS; result = ISC_R_SUCCESS;
cleanup: cleanup:
if (clients != NULL) if (ntatable != NULL) {
dns_ntatable_detach(&ntatable);
}
if (clients != NULL) {
dns_acl_detach(&clients); dns_acl_detach(&clients);
if (mapped != NULL) }
if (mapped != NULL) {
dns_acl_detach(&mapped); dns_acl_detach(&mapped);
if (excluded != NULL) }
if (excluded != NULL) {
dns_acl_detach(&excluded); dns_acl_detach(&excluded);
if (ring != NULL) }
if (ring != NULL) {
dns_tsigkeyring_detach(&ring); dns_tsigkeyring_detach(&ring);
if (zone != NULL) }
if (zone != NULL) {
dns_zone_detach(&zone); dns_zone_detach(&zone);
if (dispatch4 != NULL) }
if (dispatch4 != NULL) {
dns_dispatch_detach(&dispatch4); dns_dispatch_detach(&dispatch4);
if (dispatch6 != NULL) }
if (dispatch6 != NULL) {
dns_dispatch_detach(&dispatch6); dns_dispatch_detach(&dispatch6);
if (resstats != NULL) }
if (resstats != NULL) {
isc_stats_detach(&resstats); isc_stats_detach(&resstats);
if (resquerystats != NULL) }
if (resquerystats != NULL) {
dns_stats_detach(&resquerystats); dns_stats_detach(&resquerystats);
if (order != NULL) }
if (order != NULL) {
dns_order_detach(&order); dns_order_detach(&order);
if (cmctx != NULL) }
if (cmctx != NULL) {
isc_mem_detach(&cmctx); isc_mem_detach(&cmctx);
if (hmctx != NULL) }
if (hmctx != NULL) {
isc_mem_detach(&hmctx); isc_mem_detach(&hmctx);
}
if (cache != NULL) if (cache != NULL) {
dns_cache_detach(&cache); dns_cache_detach(&cache);
if (dctx != NULL) }
if (dctx != NULL) {
dns_dyndb_destroyctx(&dctx); dns_dyndb_destroyctx(&dctx);
}
return (result); return (result);
} }

View File

@@ -65,6 +65,9 @@ options {
max-cache-size 20000000000000; max-cache-size 20000000000000;
nta-lifetime 604800; nta-lifetime 604800;
nta-recheck 604800; nta-recheck 604800;
validate-except {
"corp";
};
transfer-source 0.0.0.0 dscp 63; transfer-source 0.0.0.0 dscp 63;
zone-statistics none; zone-statistics none;
}; };

View File

@@ -6646,6 +6646,24 @@ options {
</listitem> </listitem>
</varlistentry> </varlistentry>
<varlistentry>
<term><command>validate-except</command></term>
<listitem>
<para>
Specifies a list of domain names at and beneath which DNSSEC
validation should <emphasis>not</emphasis> be performed,
regardless of the presence of a trust anchor at or above
those names. This may be used, for example, when configuring
a top-level domain intended only for local use, so that the
lack of a secure delegation for that domain in the root zone
will not cause validation failures. (This is similar
to setting a negative trust anchor, except that it is a
permanent configuration, whereas negative trust anchors
expire and are removed after a set period of time.)
</para>
</listitem>
</varlistentry>
<varlistentry> <varlistentry>
<term><command>dnssec-accept-expired</command></term> <term><command>dnssec-accept-expired</command></term>
<listitem> <listitem>

View File

@@ -63,9 +63,9 @@
<command>coresize</command> ( default | unlimited | <replaceable>sizeval</replaceable> ); <command>coresize</command> ( default | unlimited | <replaceable>sizeval</replaceable> );
<command>datasize</command> ( default | unlimited | <replaceable>sizeval</replaceable> ); <command>datasize</command> ( default | unlimited | <replaceable>sizeval</replaceable> );
<command>deny-answer-addresses</command> { <replaceable>address_match_element</replaceable>; ... } [ <command>deny-answer-addresses</command> { <replaceable>address_match_element</replaceable>; ... } [
<command>except-from</command> { <replaceable>quoted_string</replaceable>; ... } ]; <command>except-from</command> { <replaceable>string</replaceable>; ... } ];
<command>deny-answer-aliases</command> { <replaceable>quoted_string</replaceable>; ... } [ except-from { <command>deny-answer-aliases</command> { <replaceable>string</replaceable>; ... } [ except-from { <replaceable>string</replaceable>; ...
<replaceable>quoted_string</replaceable>; ... } ]; } ];
<command>dialup</command> ( notify | notify-passive | passive | refresh | <replaceable>boolean</replaceable> ); <command>dialup</command> ( notify | notify-passive | passive | refresh | <replaceable>boolean</replaceable> );
<command>directory</command> <replaceable>quoted_string</replaceable>; <command>directory</command> <replaceable>quoted_string</replaceable>;
<command>disable-algorithms</command> <replaceable>string</replaceable> { <replaceable>string</replaceable>; <command>disable-algorithms</command> <replaceable>string</replaceable> { <replaceable>string</replaceable>;
@@ -96,14 +96,12 @@
<command>dnssec-secure-to-insecure</command> <replaceable>boolean</replaceable>; <command>dnssec-secure-to-insecure</command> <replaceable>boolean</replaceable>;
<command>dnssec-update-mode</command> ( maintain | no-resign ); <command>dnssec-update-mode</command> ( maintain | no-resign );
<command>dnssec-validation</command> ( yes | no | auto ); <command>dnssec-validation</command> ( yes | no | auto );
<command>dnstap</command> { ( all | auth | client | forwarder | <command>dnstap</command> { ( all | auth | client | forwarder | resolver ) [ ( query |
<command>resolver</command> ) [ ( query | response ) ]; ... }; <command>response</command> ) ]; ... };
<command>dnstap-identity</command> ( <replaceable>quoted_string</replaceable> | none | <command>dnstap-identity</command> ( <replaceable>quoted_string</replaceable> | none | hostname );
<command>hostname</command> ); <command>dnstap-output</command> ( file | unix ) <replaceable>quoted_string</replaceable> [ size ( unlimited |
<command>dnstap-output</command> ( file | unix ) <replaceable>quoted_string</replaceable> [ <replaceable>size</replaceable> ) ] [ versions ( unlimited | <replaceable>integer</replaceable> ) ] [ suffix (
<command>size</command> ( unlimited | <replaceable>size</replaceable> ) ] [ versions ( <command>increment</command> | timestamp ) ];
<command>unlimited</command> | <replaceable>integer</replaceable> ) ] [ suffix ( increment
| timestamp ) ];
<command>dnstap-version</command> ( <replaceable>quoted_string</replaceable> | none ); <command>dnstap-version</command> ( <replaceable>quoted_string</replaceable> | none );
<command>dscp</command> <replaceable>integer</replaceable>; <command>dscp</command> <replaceable>integer</replaceable>;
<command>dual-stack-servers</command> [ port <replaceable>integer</replaceable> ] { ( <replaceable>quoted_string</replaceable> [ port <command>dual-stack-servers</command> [ port <replaceable>integer</replaceable> ] { ( <replaceable>quoted_string</replaceable> [ port
@@ -202,7 +200,7 @@
<command>preferred-glue</command> <replaceable>string</replaceable>; <command>preferred-glue</command> <replaceable>string</replaceable>;
<command>prefetch</command> <replaceable>integer</replaceable> [ <replaceable>integer</replaceable> ]; <command>prefetch</command> <replaceable>integer</replaceable> [ <replaceable>integer</replaceable> ];
<command>provide-ixfr</command> <replaceable>boolean</replaceable>; <command>provide-ixfr</command> <replaceable>boolean</replaceable>;
<command>qname-minimization</command> ( strict | relaxed | disabled ); <command>qname-minimization</command> ( strict | relaxed | disabled | off );
<command>query-source</command> ( ( [ address ] ( <replaceable>ipv4_address</replaceable> | * ) [ port ( <command>query-source</command> ( ( [ address ] ( <replaceable>ipv4_address</replaceable> | * ) [ port (
<replaceable>integer</replaceable> | * ) ] ) | ( [ [ address ] ( <replaceable>ipv4_address</replaceable> | * ) ] <replaceable>integer</replaceable> | * ) ] ) | ( [ [ address ] ( <replaceable>ipv4_address</replaceable> | * ) ]
<command>port</command> ( <replaceable>integer</replaceable> | * ) ) ) [ dscp <replaceable>integer</replaceable> ]; <command>port</command> ( <replaceable>integer</replaceable> | * ) ) ) [ dscp <replaceable>integer</replaceable> ];
@@ -253,7 +251,7 @@
<command>nsip-enable</command> <replaceable>boolean</replaceable> ] [ nsdname-enable <replaceable>boolean</replaceable> ] [ <command>nsip-enable</command> <replaceable>boolean</replaceable> ] [ nsdname-enable <replaceable>boolean</replaceable> ] [
<command>dnsrps-enable</command> <replaceable>boolean</replaceable> ] [ dnsrps-options { <replaceable>unspecified-text</replaceable> <command>dnsrps-enable</command> <replaceable>boolean</replaceable> ] [ dnsrps-options { <replaceable>unspecified-text</replaceable>
} ]; } ];
<command>root-delegation-only</command> [ exclude { <replaceable>quoted_string</replaceable>; ... } ]; <command>root-delegation-only</command> [ exclude { <replaceable>string</replaceable>; ... } ];
<command>root-key-sentinel</command> <replaceable>boolean</replaceable>; <command>root-key-sentinel</command> <replaceable>boolean</replaceable>;
<command>rrset-order</command> { [ class <replaceable>string</replaceable> ] [ type <replaceable>string</replaceable> ] [ name <command>rrset-order</command> { [ class <replaceable>string</replaceable> ] [ type <replaceable>string</replaceable> ] [ name
<replaceable>quoted_string</replaceable> ] <replaceable>string</replaceable> <replaceable>string</replaceable>; ... }; <replaceable>quoted_string</replaceable> ] <replaceable>string</replaceable> <replaceable>string</replaceable>; ... };
@@ -303,6 +301,7 @@
<command>use-v4-udp-ports</command> { <replaceable>portrange</replaceable>; ... }; <command>use-v4-udp-ports</command> { <replaceable>portrange</replaceable>; ... };
<command>use-v6-udp-ports</command> { <replaceable>portrange</replaceable>; ... }; <command>use-v6-udp-ports</command> { <replaceable>portrange</replaceable>; ... };
<command>v6-bias</command> <replaceable>integer</replaceable>; <command>v6-bias</command> <replaceable>integer</replaceable>;
<command>validate-except</command> { <replaceable>string</replaceable>; ... };
<command>version</command> ( <replaceable>quoted_string</replaceable> | none ); <command>version</command> ( <replaceable>quoted_string</replaceable> | none );
<command>zero-no-soa-ttl</command> <replaceable>boolean</replaceable>; <command>zero-no-soa-ttl</command> <replaceable>boolean</replaceable>;
<command>zero-no-soa-ttl-cache</command> <replaceable>boolean</replaceable>; <command>zero-no-soa-ttl-cache</command> <replaceable>boolean</replaceable>;

View File

@@ -19,7 +19,7 @@
<command>forwarders</command> [ port <replaceable>integer</replaceable> ] [ dscp <replaceable>integer</replaceable> ] { ( <replaceable>ipv4_address</replaceable> | <replaceable>ipv6_address</replaceable> ) [ port <replaceable>integer</replaceable> ] [ dscp <replaceable>integer</replaceable> ]; ... }; <command>forwarders</command> [ port <replaceable>integer</replaceable> ] [ dscp <replaceable>integer</replaceable> ] { ( <replaceable>ipv4_address</replaceable> | <replaceable>ipv6_address</replaceable> ) [ port <replaceable>integer</replaceable> ] [ dscp <replaceable>integer</replaceable> ]; ... };
<command>max-records</command> <replaceable>integer</replaceable>; <command>max-records</command> <replaceable>integer</replaceable>;
<command>server-addresses</command> { ( <replaceable>ipv4_address</replaceable> | <replaceable>ipv6_address</replaceable> ) [ port <replaceable>integer</replaceable> ]; ... }; <command>server-addresses</command> { ( <replaceable>ipv4_address</replaceable> | <replaceable>ipv6_address</replaceable> ) [ port <replaceable>integer</replaceable> ]; ... };
<command>server-names</command> { <replaceable>quoted_string</replaceable>; ... }; <command>server-names</command> { <replaceable>string</replaceable>; ... };
<command>zone-statistics</command> ( full | terse | none | <replaceable>boolean</replaceable> ); <command>zone-statistics</command> ( full | terse | none | <replaceable>boolean</replaceable> );
}; };
</programlisting> </programlisting>

View File

@@ -113,9 +113,9 @@ options {
datasize ( default | unlimited | <sizeval> ); datasize ( default | unlimited | <sizeval> );
deallocate-on-exit <boolean>; // obsolete deallocate-on-exit <boolean>; // obsolete
deny-answer-addresses { <address_match_element>; ... } [ deny-answer-addresses { <address_match_element>; ... } [
except-from { <quoted_string>; ... } ]; except-from { <string>; ... } ];
deny-answer-aliases { <quoted_string>; ... } [ except-from { deny-answer-aliases { <string>; ... } [ except-from { <string>; ...
<quoted_string>; ... } ]; } ];
dialup ( notify | notify-passive | passive | refresh | <boolean> ); dialup ( notify | notify-passive | passive | refresh | <boolean> );
directory <quoted_string>; directory <quoted_string>;
disable-algorithms <string> { <string>; disable-algorithms <string> { <string>;
@@ -146,15 +146,13 @@ options {
dnssec-secure-to-insecure <boolean>; dnssec-secure-to-insecure <boolean>;
dnssec-update-mode ( maintain | no-resign ); dnssec-update-mode ( maintain | no-resign );
dnssec-validation ( yes | no | auto ); dnssec-validation ( yes | no | auto );
dnstap { ( all | auth | client | forwarder | dnstap { ( all | auth | client | forwarder | resolver ) [ ( query |
resolver ) [ ( query | response ) ]; ... }; // not configured response ) ]; ... };
dnstap-identity ( <quoted_string> | none | dnstap-identity ( <quoted_string> | none | hostname );
hostname ); // not configured dnstap-output ( file | unix ) <quoted_string> [ size ( unlimited |
dnstap-output ( file | unix ) <quoted_string> [ <size> ) ] [ versions ( unlimited | <integer> ) ] [ suffix (
size ( unlimited | <size> ) ] [ versions ( increment | timestamp ) ];
unlimited | <integer> ) ] [ suffix ( increment dnstap-version ( <quoted_string> | none );
| timestamp ) ]; // not configured
dnstap-version ( <quoted_string> | none ); // not configured
dscp <integer>; dscp <integer>;
dual-stack-servers [ port <integer> ] { ( <quoted_string> [ port dual-stack-servers [ port <integer> ] { ( <quoted_string> [ port
<integer> ] [ dscp <integer> ] | <ipv4_address> [ port <integer> ] [ dscp <integer> ] | <ipv4_address> [ port
@@ -178,14 +176,14 @@ options {
forward ( first | only ); forward ( first | only );
forwarders [ port <integer> ] [ dscp <integer> ] { ( <ipv4_address> forwarders [ port <integer> ] [ dscp <integer> ] { ( <ipv4_address>
| <ipv6_address> ) [ port <integer> ] [ dscp <integer> ]; ... }; | <ipv6_address> ) [ port <integer> ] [ dscp <integer> ]; ... };
fstrm-set-buffer-hint <integer>; // not configured fstrm-set-buffer-hint <integer>;
fstrm-set-flush-timeout <integer>; // not configured fstrm-set-flush-timeout <integer>;
fstrm-set-input-queue-size <integer>; // not configured fstrm-set-input-queue-size <integer>;
fstrm-set-output-notify-threshold <integer>; // not configured fstrm-set-output-notify-threshold <integer>;
fstrm-set-output-queue-model ( mpsc | spsc ); // not configured fstrm-set-output-queue-model ( mpsc | spsc );
fstrm-set-output-queue-size <integer>; // not configured fstrm-set-output-queue-size <integer>;
fstrm-set-reopen-interval <ttlval>; // not configured fstrm-set-reopen-interval <ttlval>;
geoip-directory ( <quoted_string> | none ); // not configured geoip-directory ( <quoted_string> | none );
geoip-use-ecs <boolean>; // obsolete geoip-use-ecs <boolean>; // obsolete
glue-cache <boolean>; glue-cache <boolean>;
has-old-clients <boolean>; // obsolete has-old-clients <boolean>; // obsolete
@@ -321,7 +319,7 @@ options {
dnsrps-enable <boolean> ] [ dnsrps-options { <unspecified-text> dnsrps-enable <boolean> ] [ dnsrps-options { <unspecified-text>
} ]; } ];
rfc2308-type1 <boolean>; // not yet implemented rfc2308-type1 <boolean>; // not yet implemented
root-delegation-only [ exclude { <quoted_string>; ... } ]; root-delegation-only [ exclude { <string>; ... } ];
root-key-sentinel <boolean>; root-key-sentinel <boolean>;
rrset-order { [ class <string> ] [ type <string> ] [ name rrset-order { [ class <string> ] [ type <string> ] [ name
<quoted_string> ] <string> <string>; ... }; <quoted_string> ] <string> <string>; ... };
@@ -380,6 +378,7 @@ options {
use-v4-udp-ports { <portrange>; ... }; use-v4-udp-ports { <portrange>; ... };
use-v6-udp-ports { <portrange>; ... }; use-v6-udp-ports { <portrange>; ... };
v6-bias <integer>; v6-bias <integer>;
validate-except { <string>; ... };
version ( <quoted_string> | none ); version ( <quoted_string> | none );
zero-no-soa-ttl <boolean>; zero-no-soa-ttl <boolean>;
zero-no-soa-ttl-cache <boolean>; zero-no-soa-ttl-cache <boolean>;
@@ -478,9 +477,9 @@ view <string> [ <class> ] {
cleaning-interval <integer>; cleaning-interval <integer>;
clients-per-query <integer>; clients-per-query <integer>;
deny-answer-addresses { <address_match_element>; ... } [ deny-answer-addresses { <address_match_element>; ... } [
except-from { <quoted_string>; ... } ]; except-from { <string>; ... } ];
deny-answer-aliases { <quoted_string>; ... } [ except-from { deny-answer-aliases { <string>; ... } [ except-from { <string>; ...
<quoted_string>; ... } ]; } ];
dialup ( notify | notify-passive | passive | refresh | <boolean> ); dialup ( notify | notify-passive | passive | refresh | <boolean> );
disable-algorithms <string> { <string>; disable-algorithms <string> { <string>;
... }; // may occur multiple times ... }; // may occur multiple times
@@ -514,8 +513,8 @@ view <string> [ <class> ] {
dnssec-secure-to-insecure <boolean>; dnssec-secure-to-insecure <boolean>;
dnssec-update-mode ( maintain | no-resign ); dnssec-update-mode ( maintain | no-resign );
dnssec-validation ( yes | no | auto ); dnssec-validation ( yes | no | auto );
dnstap { ( all | auth | client | forwarder | dnstap { ( all | auth | client | forwarder | resolver ) [ ( query |
resolver ) [ ( query | response ) ]; ... }; // not configured response ) ]; ... };
dual-stack-servers [ port <integer> ] { ( <quoted_string> [ port dual-stack-servers [ port <integer> ] { ( <quoted_string> [ port
<integer> ] [ dscp <integer> ] | <ipv4_address> [ port <integer> ] [ dscp <integer> ] | <ipv4_address> [ port
<integer> ] [ dscp <integer> ] | <ipv6_address> [ port <integer> ] [ dscp <integer> ] | <ipv6_address> [ port
@@ -651,7 +650,7 @@ view <string> [ <class> ] {
dnsrps-enable <boolean> ] [ dnsrps-options { <unspecified-text> dnsrps-enable <boolean> ] [ dnsrps-options { <unspecified-text>
} ]; } ];
rfc2308-type1 <boolean>; // not yet implemented rfc2308-type1 <boolean>; // not yet implemented
root-delegation-only [ exclude { <quoted_string>; ... } ]; root-delegation-only [ exclude { <string>; ... } ];
root-key-sentinel <boolean>; root-key-sentinel <boolean>;
rrset-order { [ class <string> ] [ type <string> ] [ name rrset-order { [ class <string> ] [ type <string> ] [ name
<quoted_string> ] <string> <string>; ... }; <quoted_string> ] <string> <string>; ... };
@@ -718,6 +717,7 @@ view <string> [ <class> ] {
use-alt-transfer-source <boolean>; use-alt-transfer-source <boolean>;
use-queryport-pool <boolean>; // obsolete use-queryport-pool <boolean>; // obsolete
v6-bias <integer>; v6-bias <integer>;
validate-except { <string>; ... };
zero-no-soa-ttl <boolean>; zero-no-soa-ttl <boolean>;
zero-no-soa-ttl-cache <boolean>; zero-no-soa-ttl-cache <boolean>;
zone <string> [ <class> ] { zone <string> [ <class> ] {
@@ -805,7 +805,7 @@ view <string> [ <class> ] {
serial-update-method ( date | increment | unixtime ); serial-update-method ( date | increment | unixtime );
server-addresses { ( <ipv4_address> | <ipv6_address> ) [ server-addresses { ( <ipv4_address> | <ipv6_address> ) [
port <integer> ]; ... }; port <integer> ]; ... };
server-names { <quoted_string>; ... }; server-names { <string>; ... };
sig-signing-nodes <integer>; sig-signing-nodes <integer>;
sig-signing-signatures <integer>; sig-signing-signatures <integer>;
sig-signing-type <integer>; sig-signing-type <integer>;
@@ -910,7 +910,7 @@ zone <string> [ <class> ] {
serial-update-method ( date | increment | unixtime ); serial-update-method ( date | increment | unixtime );
server-addresses { ( <ipv4_address> | <ipv6_address> ) [ port server-addresses { ( <ipv4_address> | <ipv6_address> ) [ port
<integer> ]; ... }; <integer> ]; ... };
server-names { <quoted_string>; ... }; server-names { <string>; ... };
sig-signing-nodes <integer>; sig-signing-nodes <integer>;
sig-signing-signatures <integer>; sig-signing-signatures <integer>;
sig-signing-type <integer>; sig-signing-type <integer>;

View File

@@ -6,6 +6,6 @@ zone <string> [ <class> ] {
forwarders [ port <integer> ] [ dscp <integer> ] { ( <ipv4_address> | <ipv6_address> ) [ port <integer> ] [ dscp <integer> ]; ... }; forwarders [ port <integer> ] [ dscp <integer> ] { ( <ipv4_address> | <ipv6_address> ) [ port <integer> ] [ dscp <integer> ]; ... };
max-records <integer>; max-records <integer>;
server-addresses { ( <ipv4_address> | <ipv6_address> ) [ port <integer> ]; ... }; server-addresses { ( <ipv4_address> | <ipv6_address> ) [ port <integer> ]; ... };
server-names { <quoted_string>; ... }; server-names { <string>; ... };
zone-statistics ( full | terse | none | <boolean> ); zone-statistics ( full | terse | none | <boolean> );
}; };

View File

@@ -122,9 +122,12 @@ dns_ntatable_add(dns_ntatable_t *ntatable, const dns_name_t *name,
uint32_t lifetime); uint32_t lifetime);
/*%< /*%<
* Add a negative trust anchor to 'ntatable' for name 'name', * Add a negative trust anchor to 'ntatable' for name 'name',
* which will expire at time 'now' + 'lifetime'. If 'force' is false, * which will expire at time 'now' + 'lifetime'. If 'force' is true,
* then the name will be checked periodically to see if it's bogus; * then the NTA will persist for the entire specified lifetime.
* if not, then the NTA will be allowed to expire early. * If it is false, then the name will be queried periodically and
* validation will be attempted to see whether it's still bogus;
* if validation is successful, the NTA will be allowed to expire
* early and validation below the NTA will resume.
* *
* Notes: * Notes:
* *

View File

@@ -547,20 +547,28 @@ dns_ntatable_totext(dns_ntatable_t *ntatable, isc_buffer_t **buf) {
dns_name_t *name; dns_name_t *name;
isc_time_t t; isc_time_t t;
name = dns_fixedname_initname(&fn); /*
dns_rbt_fullnamefromnode(node, name); * Skip "validate-except" entries.
dns_name_format(name, nbuf, sizeof(nbuf)); */
isc_time_set(&t, n->expiry, 0); if (n->expiry != 0xffffffffU) {
isc_time_formattimestamp(&t, tbuf, sizeof(tbuf)); name = dns_fixedname_initname(&fn);
dns_rbt_fullnamefromnode(node, name);
dns_name_format(name, nbuf, sizeof(nbuf));
isc_time_set(&t, n->expiry, 0);
isc_time_formattimestamp(&t, tbuf,
sizeof(tbuf));
snprintf(obuf, sizeof(obuf), "%s%s: %s %s", snprintf(obuf, sizeof(obuf), "%s%s: %s %s",
first ? "" : "\n", nbuf, first ? "" : "\n", nbuf,
n->expiry <= now ? "expired" : "expiry", n->expiry <= now
tbuf); ? "expired"
first = false; : "expiry",
result = putstr(buf, obuf); tbuf);
if (result != ISC_R_SUCCESS) first = false;
goto cleanup; result = putstr(buf, obuf);
if (result != ISC_R_SUCCESS)
goto cleanup;
}
} }
result = dns_rbtnodechain_next(&chain, NULL, NULL); result = dns_rbtnodechain_next(&chain, NULL, NULL);
if (result != ISC_R_SUCCESS && result != DNS_R_NEWORIGIN) { if (result != ISC_R_SUCCESS && result != DNS_R_NEWORIGIN) {
@@ -576,56 +584,6 @@ dns_ntatable_totext(dns_ntatable_t *ntatable, isc_buffer_t **buf) {
return (result); return (result);
} }
#if 0
isc_result_t
dns_ntatable_dump(dns_ntatable_t *ntatable, FILE *fp) {
isc_result_t result;
dns_rbtnode_t *node;
dns_rbtnodechain_t chain;
isc_stdtime_t now;
REQUIRE(VALID_NTATABLE(ntatable));
isc_stdtime_get(&now);
RWLOCK(&ntatable->rwlock, isc_rwlocktype_read);
dns_rbtnodechain_init(&chain, ntatable->view->mctx);
result = dns_rbtnodechain_first(&chain, ntatable->table, NULL, NULL);
if (result != ISC_R_SUCCESS && result != DNS_R_NEWORIGIN)
goto cleanup;
for (;;) {
dns_rbtnodechain_current(&chain, NULL, NULL, &node);
if (node->data != NULL) {
dns_nta_t *n = (dns_nta_t *) node->data;
char nbuf[DNS_NAME_FORMATSIZE], tbuf[80];
dns_fixedname_t fn;
dns_name_t *name;
isc_time_t t;
name = dns_fixedname_initname(&fn);
dns_rbt_fullnamefromnode(node, name);
dns_name_format(name, nbuf, sizeof(nbuf));
isc_time_set(&t, n->expiry, 0);
isc_time_formattimestamp(&t, tbuf, sizeof(tbuf));
fprintf(fp, "%s: %s %s\n", nbuf,
n->expiry <= now ? "expired" : "expiry",
tbuf);
}
result = dns_rbtnodechain_next(&chain, NULL, NULL);
if (result != ISC_R_SUCCESS && result != DNS_R_NEWORIGIN) {
if (result == ISC_R_NOMORE)
result = ISC_R_SUCCESS;
break;
}
}
cleanup:
dns_rbtnodechain_invalidate(&chain);
RWUNLOCK(&ntatable->rwlock, isc_rwlocktype_read);
return (result);
}
#endif
isc_result_t isc_result_t
dns_ntatable_dump(dns_ntatable_t *ntatable, FILE *fp) { dns_ntatable_dump(dns_ntatable_t *ntatable, FILE *fp) {
isc_result_t result; isc_result_t result;
@@ -674,35 +632,41 @@ dns_ntatable_save(dns_ntatable_t *ntatable, FILE *fp) {
for (;;) { for (;;) {
dns_rbtnodechain_current(&chain, NULL, NULL, &node); dns_rbtnodechain_current(&chain, NULL, NULL, &node);
if (node->data != NULL) { if (node->data != NULL) {
isc_buffer_t b;
char nbuf[DNS_NAME_FORMATSIZE + 1], tbuf[80];
dns_fixedname_t fn;
dns_name_t *name;
dns_nta_t *n = (dns_nta_t *) node->data; dns_nta_t *n = (dns_nta_t *) node->data;
if (n->expiry > now) {
isc_buffer_t b;
char nbuf[DNS_NAME_FORMATSIZE + 1], tbuf[80];
dns_fixedname_t fn;
dns_name_t *name;
name = dns_fixedname_initname(&fn); /*
dns_rbt_fullnamefromnode(node, name); * Skip this node if the expiry is already in the
* past, or if this is a "validate-except" entry.
isc_buffer_init(&b, nbuf, sizeof(nbuf)); */
result = dns_name_totext(name, false, &b); if (n->expiry <= now || n->expiry == 0xffffffffU) {
if (result != ISC_R_SUCCESS) goto skip;
goto skip;
/* Zero terminate. */
isc_buffer_putuint8(&b, 0);
isc_buffer_init(&b, tbuf, sizeof(tbuf));
dns_time32_totext(n->expiry, &b);
/* Zero terminate. */
isc_buffer_putuint8(&b, 0);
fprintf(fp, "%s %s %s\n", nbuf,
n->forced ? "forced" : "regular",
tbuf);
written = true;
} }
name = dns_fixedname_initname(&fn);
dns_rbt_fullnamefromnode(node, name);
isc_buffer_init(&b, nbuf, sizeof(nbuf));
result = dns_name_totext(name, false, &b);
if (result != ISC_R_SUCCESS)
goto skip;
/* Zero terminate. */
isc_buffer_putuint8(&b, 0);
isc_buffer_init(&b, tbuf, sizeof(tbuf));
dns_time32_totext(n->expiry, &b);
/* Zero terminate. */
isc_buffer_putuint8(&b, 0);
fprintf(fp, "%s %s %s\n", nbuf,
n->forced ? "forced" : "regular",
tbuf);
written = true;
} }
skip: skip:
result = dns_rbtnodechain_next(&chain, NULL, NULL); result = dns_rbtnodechain_next(&chain, NULL, NULL);

View File

@@ -1155,7 +1155,7 @@ options_clauses[] = {
static cfg_type_t cfg_type_namelist = { static cfg_type_t cfg_type_namelist = {
"namelist", cfg_parse_bracketed_list, cfg_print_bracketed_list, "namelist", cfg_parse_bracketed_list, cfg_print_bracketed_list,
cfg_doc_bracketed_list, &cfg_rep_list, &cfg_type_qstring cfg_doc_bracketed_list, &cfg_rep_list, &cfg_type_astring
}; };
static keyword_type_t exclude_kw = { "exclude", &cfg_type_namelist }; static keyword_type_t exclude_kw = { "exclude", &cfg_type_namelist };
@@ -1976,6 +1976,7 @@ view_clauses[] = {
{ "trust-anchor-telemetry", &cfg_type_boolean, { "trust-anchor-telemetry", &cfg_type_boolean,
CFG_CLAUSEFLAG_EXPERIMENTAL }, CFG_CLAUSEFLAG_EXPERIMENTAL },
{ "use-queryport-pool", &cfg_type_boolean, CFG_CLAUSEFLAG_OBSOLETE }, { "use-queryport-pool", &cfg_type_boolean, CFG_CLAUSEFLAG_OBSOLETE },
{ "validate-except", &cfg_type_namelist, 0 },
{ "v6-bias", &cfg_type_uint32, 0 }, { "v6-bias", &cfg_type_uint32, 0 },
{ "zero-no-soa-ttl-cache", &cfg_type_boolean, 0 }, { "zero-no-soa-ttl-cache", &cfg_type_boolean, 0 },
{ NULL, NULL, 0 } { NULL, NULL, 0 }