.TP
.B access\-control: \fI<IP netblock> <action>
The netblock is given as an IP4 or IP6 address with /size appended for a
-classless network block. The action can be deny, refuse or allow.
-Deny stops queries from hosts from that netblock.
-Refuse stops queries too, but sends a DNS rcode REFUSED error message back.
-Allow gives access to clients from that netblock.
-By default only localhost is allowed, the rest is refused.
-The default is refused, because that is protocol\-friendly. The DNS protocol
-is not designed to handle dropped packets due to policy, and dropping may
-result in (possibly excessive) retried queries.
+classless network block. The action can be \fIdeny\fR, \fIrefuse\fR,
+\fIallow\fR or \fIallow_snoop\fR.
+.IP
+The action \fIdeny\fR stops queries from hosts from that netblock.
+.IP
+The action \fIrefuse\fR stops queries too, but sends a DNS rcode REFUSED
+error message back.
+.IP
+The action \fIallow\fR gives access to clients from that netblock.
+It gives only access for recursion clients (which is
+what almost all clients need). Nonrecursive queries are refused.
+.IP
+The \fIallow\fR action does allow nonrecursive queries to access the
+local\-data that is configured. The reason is that this does not involve
+the unbound server recursive lookup algorithm, and static data is served
+in the reply. This supports normal operations where nonrecursive queries
+are made for the authoritative data. For nonrecursive queries any replies
+from the dynamic cache are refused.
+.IP
+The action \fIallow_snoop\fR gives nonrecursive access too. This give
+both recursive and non recursive access. The name \fIallow_snoop\fR refers
+to cache snooping, a technique to use nonrecursive queries to examine
+the cache contents (for malicious acts). However, nonrecursive queries can
+also be a valuable debugging tool (when you want to examine the cache
+contents). In that case use \fIallow_snoop\fR for your administration host.
+.IP
+By default only localhost is \fIallow\fRed, the rest is \fIrefuse\fRd.
+The default is \fIrefuse\fRd, because that is protocol\-friendly. The DNS
+protocol is not designed to handle dropped packets due to policy, and
+dropping may result in (possibly excessive) retried queries.
.TP
.B chroot: \fI<directory>
If chroot is enabled, you should pass the configfile (from the
374, 381, 389, 396, 403, 410, 417, 425, 433, 440,
449, 458, 465, 472, 483, 491, 504, 513, 521, 534,
543, 552, 561, 570, 583, 590, 600, 610, 620, 630,
- 640, 650, 657, 667, 680, 687, 705, 714, 723, 733,
- 743, 750, 758, 771, 779, 798, 805, 812, 819, 826,
- 833, 840
+ 640, 650, 657, 667, 681, 688, 706, 715, 724, 734,
+ 744, 751, 759, 772, 780, 799, 806, 813, 820, 827,
+ 834, 841
};
#endif
{
OUTYY(("P(server_access_control:%s %s)\n", (yyvsp[(2) - (3)].str), (yyvsp[(3) - (3)].str)));
if(strcmp((yyvsp[(3) - (3)].str), "deny")!=0 && strcmp((yyvsp[(3) - (3)].str), "refuse")!=0 &&
- strcmp((yyvsp[(3) - (3)].str), "allow")!=0) {
- yyerror("expected deny, refuse or allow in "
- "access control action");
+ strcmp((yyvsp[(3) - (3)].str), "allow")!=0 &&
+ strcmp((yyvsp[(3) - (3)].str), "allow_snoop")!=0) {
+ yyerror("expected deny, refuse, allow or allow_snoop "
+ "in access control action");
} else {
if(!cfg_str2list_insert(&cfg_parser->cfg->acls, (yyvsp[(2) - (3)].str), (yyvsp[(3) - (3)].str)))
fatal_exit("out of memory adding acl");
break;
case 144:
-#line 681 "util/configparser.y"
+#line 682 "util/configparser.y"
{
OUTYY(("P(server_module_conf:%s)\n", (yyvsp[(2) - (2)].str)));
free(cfg_parser->cfg->module_conf);
break;
case 145:
-#line 688 "util/configparser.y"
+#line 689 "util/configparser.y"
{
OUTYY(("P(server_val_override_date:%s)\n", (yyvsp[(2) - (2)].str)));
if(strlen((yyvsp[(2) - (2)].str)) == 0 || strcmp((yyvsp[(2) - (2)].str), "0") == 0) {
break;
case 146:
-#line 706 "util/configparser.y"
+#line 707 "util/configparser.y"
{
OUTYY(("P(server_cache_max_ttl:%s)\n", (yyvsp[(2) - (2)].str)));
if(atoi((yyvsp[(2) - (2)].str)) == 0 && strcmp((yyvsp[(2) - (2)].str), "0") != 0)
break;
case 147:
-#line 715 "util/configparser.y"
+#line 716 "util/configparser.y"
{
OUTYY(("P(server_bogus_ttl:%s)\n", (yyvsp[(2) - (2)].str)));
if(atoi((yyvsp[(2) - (2)].str)) == 0 && strcmp((yyvsp[(2) - (2)].str), "0") != 0)
break;
case 148:
-#line 724 "util/configparser.y"
+#line 725 "util/configparser.y"
{
OUTYY(("P(server_val_clean_additional:%s)\n", (yyvsp[(2) - (2)].str)));
if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0)
break;
case 149:
-#line 734 "util/configparser.y"
+#line 735 "util/configparser.y"
{
OUTYY(("P(server_val_permissive_mode:%s)\n", (yyvsp[(2) - (2)].str)));
if(strcmp((yyvsp[(2) - (2)].str), "yes") != 0 && strcmp((yyvsp[(2) - (2)].str), "no") != 0)
break;
case 150:
-#line 744 "util/configparser.y"
+#line 745 "util/configparser.y"
{
OUTYY(("P(server_val_nsec3_keysize_iterations:%s)\n", (yyvsp[(2) - (2)].str)));
free(cfg_parser->cfg->val_nsec3_key_iterations);
break;
case 151:
-#line 751 "util/configparser.y"
+#line 752 "util/configparser.y"
{
OUTYY(("P(server_key_cache_size:%s)\n", (yyvsp[(2) - (2)].str)));
if(!cfg_parse_memsize((yyvsp[(2) - (2)].str), &cfg_parser->cfg->key_cache_size))
break;
case 152:
-#line 759 "util/configparser.y"
+#line 760 "util/configparser.y"
{
OUTYY(("P(server_key_cache_slabs:%s)\n", (yyvsp[(2) - (2)].str)));
if(atoi((yyvsp[(2) - (2)].str)) == 0)
break;
case 153:
-#line 772 "util/configparser.y"
+#line 773 "util/configparser.y"
{
OUTYY(("P(server_neg_cache_size:%s)\n", (yyvsp[(2) - (2)].str)));
if(!cfg_parse_memsize((yyvsp[(2) - (2)].str), &cfg_parser->cfg->neg_cache_size))
break;
case 154:
-#line 780 "util/configparser.y"
+#line 781 "util/configparser.y"
{
OUTYY(("P(server_local_zone:%s %s)\n", (yyvsp[(2) - (3)].str), (yyvsp[(3) - (3)].str)));
if(strcmp((yyvsp[(3) - (3)].str), "static")!=0 && strcmp((yyvsp[(3) - (3)].str), "deny")!=0 &&
break;
case 155:
-#line 799 "util/configparser.y"
+#line 800 "util/configparser.y"
{
OUTYY(("P(server_local_data:%s)\n", (yyvsp[(2) - (2)].str)));
if(!cfg_strlist_insert(&cfg_parser->cfg->local_data, (yyvsp[(2) - (2)].str)))
break;
case 156:
-#line 806 "util/configparser.y"
+#line 807 "util/configparser.y"
{
OUTYY(("P(name:%s)\n", (yyvsp[(2) - (2)].str)));
free(cfg_parser->cfg->stubs->name);
break;
case 157:
-#line 813 "util/configparser.y"
+#line 814 "util/configparser.y"
{
OUTYY(("P(stub-host:%s)\n", (yyvsp[(2) - (2)].str)));
if(!cfg_strlist_insert(&cfg_parser->cfg->stubs->hosts, (yyvsp[(2) - (2)].str)))
break;
case 158:
-#line 820 "util/configparser.y"
+#line 821 "util/configparser.y"
{
OUTYY(("P(stub-addr:%s)\n", (yyvsp[(2) - (2)].str)));
if(!cfg_strlist_insert(&cfg_parser->cfg->stubs->addrs, (yyvsp[(2) - (2)].str)))
break;
case 159:
-#line 827 "util/configparser.y"
+#line 828 "util/configparser.y"
{
OUTYY(("P(name:%s)\n", (yyvsp[(2) - (2)].str)));
free(cfg_parser->cfg->forwards->name);
break;
case 160:
-#line 834 "util/configparser.y"
+#line 835 "util/configparser.y"
{
OUTYY(("P(forward-host:%s)\n", (yyvsp[(2) - (2)].str)));
if(!cfg_strlist_insert(&cfg_parser->cfg->forwards->hosts, (yyvsp[(2) - (2)].str)))
break;
case 161:
-#line 841 "util/configparser.y"
+#line 842 "util/configparser.y"
{
OUTYY(("P(forward-addr:%s)\n", (yyvsp[(2) - (2)].str)));
if(!cfg_strlist_insert(&cfg_parser->cfg->forwards->addrs, (yyvsp[(2) - (2)].str)))
/* Line 1267 of yacc.c. */
-#line 2639 "util/configparser.c"
+#line 2640 "util/configparser.c"
default: break;
}
YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
}
-#line 847 "util/configparser.y"
+#line 848 "util/configparser.y"
/* parse helper routines could be here */