mirror of
https://github.com/isc-projects/bind9.git
synced 2026-02-26 11:32:01 -05:00
5373 lines
264 KiB
XML
5373 lines
264 KiB
XML
<?xml version='1.0'?>
|
|
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.0//EN"
|
|
"http://www.oasis-open.org/docbook/xml/4.0/docbookx.dtd">
|
|
|
|
<!-- File: $Id: Bv9ARM-book.xml,v 1.16 2000/10/02 22:21:44 bwelling Exp $ -->
|
|
|
|
<book>
|
|
|
|
<chapter id="ch01">
|
|
<title>Introduction </title>
|
|
<para>The Internet Domain Name System (<acronym>DNS</acronym>) consists of the syntax
|
|
to specify the names of entities in the Internet in a hierarchical
|
|
manner, the rules used for delegating authority over names, and the
|
|
system implementation that actually maps names to Internet
|
|
addresses. <acronym>DNS</acronym> data is maintained in a group of distributed
|
|
hierarchical databases.</para>
|
|
|
|
<sect1>
|
|
<title>Scope of Document</title>
|
|
|
|
<para>The Berkeley Internet Name Domain (<acronym>BIND</acronym>) implements an
|
|
Internet nameserver for a number of operating systems. This
|
|
document provides basic information about the installation and
|
|
care of the Internet Software Consortium (<acronym>ISC</acronym>) <acronym>BIND</acronym> version 9
|
|
software package for system administrators.</para>
|
|
</sect1>
|
|
<sect1><title>Organization of This Document</title>
|
|
<para>In this document, <emphasis>Section 1</emphasis> introduces
|
|
the basic <acronym>DNS</acronym> and <acronym>BIND</acronym> concepts. <emphasis>Section 2</emphasis>
|
|
describes resource requirements for running <acronym>BIND</acronym> in various
|
|
environments. Information in <emphasis>Section 3</emphasis> is
|
|
<emphasis>task-oriented</emphasis> in its presentation and is
|
|
organized functionally, to aid in the process of installing the
|
|
<acronym>BIND</acronym> 9 software. The task-oriented section is followed by
|
|
<emphasis>Section 4</emphasis>, which contains more advanced
|
|
concepts that the system administrator may need for implementing
|
|
certain options. Section 5 describes the <acronym>BIND</acronym> 9 lightweight
|
|
resolver. The contents of <emphasis>Section 6</emphasis> are
|
|
organized as in a reference manual to aid in the ongoing
|
|
maintenance of the software. <emphasis>Section 7
|
|
</emphasis>addresses security considerations, and
|
|
<emphasis>Section 8</emphasis> contains troubleshooting help. The
|
|
main body of the document is followed by several
|
|
<emphasis>Appendices</emphasis> which contain useful reference
|
|
information, such as a <emphasis>Bibliography</emphasis> and
|
|
historic information related to <acronym>BIND</acronym> and the Domain Name
|
|
System.</para>
|
|
</sect1>
|
|
<sect1><title>Conventions Used in This Document</title>
|
|
|
|
<para>In this document, we use the following general typographic
|
|
conventions:</para>
|
|
|
|
<informaltable colsep = "0" frame = "all" rowsep = "0">
|
|
<tgroup cols = "2" colsep = "0" rowsep = "0"
|
|
tgroupstyle = "2Level-table">
|
|
<colspec colname = "1" colnum = "1" colsep = "0"
|
|
colwidth = "3.000in"/>
|
|
<colspec colname = "2" colnum = "2" colsep = "0"
|
|
colwidth = "2.625in"/>
|
|
<tbody>
|
|
<row rowsep = "0">
|
|
<entry colname = "1" colsep = "1" rowsep = "1">
|
|
<para><emphasis>To
|
|
describe:</emphasis></para></entry>
|
|
<entry colname = "2" rowsep = "1">
|
|
<para><emphasis>We use the style:</emphasis></para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1" colsep = "1" rowsep = "1">
|
|
<para>a pathname, filename, URL, hostname,
|
|
mailing list name, or new term or concept</para></entry>
|
|
<entry colname = "2" rowsep = "1"><para><filename>Italic</filename></para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1" colsep = "1" rowsep = "1"><para>literal user
|
|
input</para></entry>
|
|
<entry colname = "2" rowsep = "1"><para><userinput>Fixed Width Bold</userinput></para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1" colsep = "1" rowsep = "1"><para>variable user
|
|
input</para></entry>
|
|
<entry colname = "2" rowsep = "1"><para><optional>Fixed Width Italic</optional></para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1" colsep = "1"><para>program output</para></entry>
|
|
<entry colname = "2"><para><computeroutput>Fixed Width Bold</computeroutput></para></entry>
|
|
</row>
|
|
</tbody>
|
|
</tgroup>
|
|
</informaltable>
|
|
|
|
<para>The following conventions are used in descriptions of the
|
|
<acronym>BIND</acronym> configuration file:<informaltable colsep = "0" frame = "all" rowsep = "0">
|
|
<tgroup cols = "2" colsep = "0" rowsep = "0"
|
|
tgroupstyle = "2Level-table">
|
|
<colspec colname = "1" colnum = "1" colsep = "0" colwidth = "3.000in"/>
|
|
<colspec colname = "2" colnum = "2" colsep = "0" colwidth = "2.625in"/>
|
|
<tbody>
|
|
<row rowsep = "0">
|
|
<entry colname = "1" colsep = "1" rowsep = "1"><para><emphasis>To
|
|
describe:</emphasis></para></entry>
|
|
<entry colname = "2" rowsep = "1"><para><emphasis>We use the style:</emphasis></para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1" colsep = "1" rowsep = "1"><para>keywords</para></entry>
|
|
<entry colname = "2" rowsep = "1"><para><literal>Sans Serif Bold</literal></para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1" colsep = "1" rowsep = "1"><para>variables</para></entry>
|
|
<entry colname = "2" rowsep = "1"><para><varname>Sans Serif Italic</varname></para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1" colsep = "1" rowsep = "1"><para>"meta-syntactic"
|
|
information (within brackets when optional)</para></entry>
|
|
<entry colname = "2" rowsep = "1"><para><optional>Fixed Width Italic</optional></para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1" colsep = "1" rowsep = "1"><para>Command line
|
|
input</para></entry>
|
|
<entry colname = "2" rowsep = "1"><para><userinput>Fixed Width Bold</userinput></para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1" colsep = "1" rowsep = "1"><para>Program output</para></entry>
|
|
<entry colname = "2" rowsep = "1"><para><computeroutput>Fixed Width</computeroutput></para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1" colsep = "1"><para>Optional input</para></entry>
|
|
<entry colname = "2"><para><optional>Text is enclosed in square brackets</optional></para></entry>
|
|
</row>
|
|
</tbody>
|
|
</tgroup></informaltable></para></sect1>
|
|
<sect1><title>Discussion of Domain Name System (<acronym>DNS</acronym>) Basics and
|
|
<acronym>BIND</acronym></title>
|
|
<para>The purpose of this document is to explain the installation
|
|
and basic upkeep of the <acronym>BIND</acronym> software package, and we begin by reviewing
|
|
the fundamentals of the domain naming system as they relate to <acronym>BIND</acronym>.
|
|
<acronym>BIND</acronym> consists of a <emphasis>nameserver</emphasis> (or "daemon")
|
|
called <command>named</command> and a <command>resolver</command> library.
|
|
The <acronym>BIND</acronym> server runs in the background, servicing queries on a well
|
|
known network port. The standard port for the User Datagram Protocol
|
|
(UDP) and Transmission Control Protocol (TCP), usually port 53,
|
|
is specified in<command> </command><filename>/etc/services</filename>.
|
|
The <emphasis>resolver</emphasis> is a set of routines residing
|
|
in a system library that provides the interface that programs can
|
|
use to access the domain name services.</para>
|
|
<sect2><title>Nameservers</title>
|
|
<para>A nameserver (NS) is a program that stores information about
|
|
named resources and responds to queries from programs called <emphasis>resolvers</emphasis> which
|
|
act as client processes. The basic function of an NS is to provide
|
|
information about network objects by answering queries.</para>
|
|
<para>With the nameserver, the network can be broken into a hierarchy
|
|
of domains. The name space is organized as a tree according to organizational
|
|
or administrative boundaries. Each node of the tree, called a domain,
|
|
is given a label. The name of the domain is the concatenation of
|
|
all the labels of the domains from the root to the current domain.
|
|
This is represented in written form as a string of labels listed
|
|
from right to left and separated by dots. A label need only be unique
|
|
within its domain. The whole name space is partitioned into areas
|
|
called <emphasis>zones</emphasis>, each starting at a domain and
|
|
extending down to the leaf domains or to domains where other zones
|
|
start. Zones usually represent administrative boundaries. For example,
|
|
a domain name for a host at the company <emphasis>Example, Inc.</emphasis> would
|
|
be:</para>
|
|
<para><systemitem class="systemname">ourhost.example.com</systemitem></para>
|
|
<para>where <systemitem class="systemname">com</systemitem> is the top level domain to which <systemitem class="systemname">ourhost.example.com</systemitem> belongs, <systemitem class="systemname">example</systemitem> is
|
|
a subdomain of <systemitem class="systemname">com</systemitem>, and <systemitem class="systemname">ourhost</systemitem> is the
|
|
name of the host.</para>
|
|
<para>The specifications for the domain nameserver are defined in
|
|
the RFC 1034, RFC 1035 and RFC 974. These documents can be found
|
|
in
|
|
<filename>/usr/src/etc/named/doc</filename> in 4.4BSD or are available
|
|
via File Transfer Protocol (FTP) from
|
|
<ulink
|
|
url="ftp://www.isi.edu/in-notes/">ftp://www.isi.edu/in-notes/</ulink> or via the Web at <ulink url="http://www.ietf.org/rfc/">http://www.ietf.org/rfc/</ulink>.
|
|
(See Appendix C for complete information on finding and retrieving
|
|
RFCs.) It is also recommended that you read the related man pages: <command>named</command> and <command>resolver</command>.</para></sect2>
|
|
<sect2><title>Types of Zones</title>
|
|
<para>As we stated previously, a zone is a point of delegation in
|
|
the <acronym>DNS</acronym> tree. A zone consists of those contiguous parts of the domain
|
|
tree for which a domain server has complete information and over which
|
|
it has authority. It contains all domain names from a certain point
|
|
downward in the domain tree except those which are delegated to
|
|
other zones. A delegation point has one or more NS records in the
|
|
parent zone, which should be matched by equivalent NS records at
|
|
the root of the delegated zone.</para>
|
|
<para>To properly operate a nameserver, it is important to understand
|
|
the difference between a <emphasis>zone</emphasis> and a <emphasis>domain</emphasis>.</para>
|
|
<para>For instance, consider the <systemitem class="systemname">example.com</systemitem> domain
|
|
which includes names such as <systemitem class="systemname">host.aaa.example.com </systemitem>and <systemitem class="systemname">host.bbb.example.com</systemitem> even
|
|
though the <systemitem class="systemname">example.com</systemitem> zone includes only delegations
|
|
for the <systemitem class="systemname">aaa.example.com</systemitem> and <systemitem class="systemname">bbb.example.com</systemitem> zones.
|
|
A zone can map exactly to a single domain, but could also include
|
|
only part of a domain, the rest of which could be delegated to other
|
|
nameservers. Every name in the <acronym>DNS</acronym> tree is a <emphasis>domain</emphasis>,
|
|
even if it is <emphasis>terminal</emphasis>, that is, has no <emphasis>subdomains</emphasis>.
|
|
Every subdomain is a domain and every domain except the root is
|
|
also a subdomain. The terminology is not intuitive and we suggest
|
|
that you read RFCs 1033, 1034 and 1035 to gain a complete understanding
|
|
of this difficult and subtle topic.</para>
|
|
<para>Though <acronym>BIND</acronym> is a Domain Nameserver, it deals primarily in
|
|
terms of zones. The master and slave declarations in the <filename>named.conf</filename> file
|
|
specify zones, not domains. When you ask some other site if it is willing
|
|
to be a slave server for your <emphasis>domain</emphasis>, you are
|
|
actually asking for slave service for some collection of zones.</para>
|
|
<para>Each zone will have one <emphasis>primary master</emphasis> (also
|
|
called <emphasis>primary</emphasis>) server which loads the zone
|
|
contents from some local file edited by humans or perhaps generated
|
|
mechanically from some other local file which is edited by humans.
|
|
There there will be some number of <emphasis>slave</emphasis> (also
|
|
called <emphasis>secondary) </emphasis>servers, which load the zone
|
|
contents using the <acronym>DNS</acronym> protocol (that is, the secondary servers
|
|
will contact the primary and fetch the zone data using TCP). This
|
|
set of servers — the primary and all of its secondaries — should be
|
|
listed in the NS records in the parent zone and will constitute a <emphasis>delegation</emphasis>.
|
|
This set of servers must also be listed in the zone file itself,
|
|
usually under the <command>@</command> name which indicates the <emphasis>top
|
|
level</emphasis> or <emphasis>root</emphasis> of the current zone.
|
|
You can list servers in the zone's top-level <command>@</command> NS
|
|
records that are not in the parent's NS delegation, but you cannot
|
|
list servers in the parent's delegation that are not present in
|
|
the zone's <command>@</command>.</para>
|
|
<para>Any servers listed in the NS records must be configured as <emphasis>authoritative</emphasis> for
|
|
the zone. A server is authoritative for a zone when it has been
|
|
configured to answer questions for that zone with authority, which
|
|
it does by setting the "authoritative answer" (AA) bit in reply
|
|
packets. A server may be authoritative for more than one zone. The
|
|
authoritative data for a zone is composed of all of the Resource
|
|
Records (RRs) — the data associated with names in a tree-structured
|
|
name space — attached to all of the nodes from the top node of the
|
|
zone down to leaf nodes or nodes above cuts around the bottom edge
|
|
of the zone.</para>
|
|
<para>Adding a zone as a type master or type slave will tell the
|
|
server to answer questions for the zone authoritatively. If the
|
|
server is able to load the zone into memory without any errors it
|
|
will set the AA bit when it replies to queries for the zone. See
|
|
RFCs 1034 and 1035 for more information about the AA bit.</para></sect2>
|
|
<sect2><title>Servers</title>
|
|
<para>A <acronym>DNS</acronym> server can be master for some zones and slave for others
|
|
or can be only a master, or only a slave, or can serve no zones
|
|
and just answer queries via its <emphasis>cache</emphasis>. Master
|
|
servers are often also called <emphasis>primaries</emphasis> and
|
|
slave servers are often also called <emphasis>secondaries</emphasis>.
|
|
Both master/primary and slave/secondary servers are authoritative
|
|
for a zone.</para>
|
|
<para>All servers keep data in their cache until the data expires,
|
|
based on a Time To Live (TTL) field which is maintained for all
|
|
resource records.</para>
|
|
<sect3><title>Master Server</title>
|
|
<para>The <emphasis>primary master server</emphasis> is the ultimate
|
|
source of information about a domain. The primary master is an authoritative
|
|
server configured to be the source of zone transfer for one or more
|
|
secondary servers. The primary master server obtains data for the
|
|
zone from a file on disk.</para></sect3>
|
|
<sect3><title>Slave Server </title>
|
|
<para>A <emphasis>slave server</emphasis>, also called a <emphasis>secondary
|
|
server</emphasis>, is an authoritative server that uses zone transfers from
|
|
the primary master server to retrieve the zone data. Optionally,
|
|
the slave server obtains zone data from a cache on disk. Slave servers
|
|
provide necessary redundancy. All secondary/slave servers are named
|
|
in the NS RRs for the zone.</para></sect3>
|
|
<sect3><title>Caching Only Server</title>
|
|
<para>Some servers are <emphasis>caching only servers</emphasis>.
|
|
This means that the server caches the information that it receives
|
|
and uses it until the data expires. A caching only server is a server
|
|
that is not authoritative for any zone. This server services queries
|
|
and asks other servers, who have the authority, for the information
|
|
it needs.</para></sect3>
|
|
<sect3><title>Forwarding Server</title>
|
|
<para>Instead of interacting with the nameservers for the root and
|
|
other domains, a <emphasis>forwarding server</emphasis> always forwards
|
|
queries it cannot satisfy from its authoritative data or cache to
|
|
a fixed list of other servers. The forwarded queries are also known
|
|
as <emphasis>recursive queries</emphasis>, the same type as a client would
|
|
send to a server. There may be one or more servers forwarded to,
|
|
and they are queried in turn until the list is exhausted or an answer
|
|
is found. A forwarding server is typically used when you do not
|
|
wish all the servers at a given site to interact with the rest of
|
|
the Internet servers. A typical scenario would involve a number
|
|
of internal <acronym>DNS</acronym> servers and an Internet firewall. Servers unable
|
|
to pass packets through the firewall would forward to the server
|
|
that can do it, and that server would query the Internet <acronym>DNS</acronym> servers
|
|
on the internal server's behalf. An added benefit of using the forwarding
|
|
feature is that the central machine develops a much more complete
|
|
cache of information that all the workstations can take advantage
|
|
of.</para>
|
|
<para>There is no prohibition against declaring a server to be a
|
|
forwarder even though it has master and/or slave zones as well;
|
|
the effect will still be that anything in the local server's cache
|
|
or zones will be answered, and anything else will be forwarded using
|
|
the forwarders list.</para></sect3>
|
|
<sect3><title>Stealth Server</title>
|
|
<para>A <emphasis>stealth server</emphasis> is a server that answers
|
|
authoritatively for a zone, but is not listed in that zone's NS
|
|
records. Stealth servers can be used as a way to centralize distribution
|
|
of a zone, without having to edit the zone on a remote nameserver.
|
|
Where the master file for a zone resides on a stealth server in
|
|
this way, it is often referred to as a "hidden primary" configuration.
|
|
Stealth servers can also be a way to keep a local copy of a zone
|
|
for rapid access to the zone's records, even if all "official" nameservers
|
|
for the zone are inaccessible.</para>
|
|
</sect3>
|
|
</sect2>
|
|
</sect1>
|
|
</chapter>
|
|
|
|
<chapter id="ch02"><title><acronym>BIND</acronym> Resource Requirements</title>
|
|
<sect1><title>Hardware requirements</title>
|
|
<para><acronym>DNS</acronym> hardware requirements have traditionally been quite modest.
|
|
For many installations, servers that have been pensioned off from
|
|
active duty have performed admirably as <acronym>DNS</acronym> servers.</para>
|
|
<para>The DNSSEC and IPv6 features of <acronym>BIND</acronym> 9 may prove to be quite
|
|
CPU intensive however, so organizations that make heavy use of these
|
|
features may wish to consider larger systems for these applications.
|
|
<acronym>BIND</acronym> 9 is now fully multithreaded, allowing full utilization of
|
|
multiprocessor systems for installations that need it.</para></sect1>
|
|
<sect1><title>CPU Requirements</title>
|
|
<para>CPU requirements for <acronym>BIND</acronym> 9 range from i486-class machines
|
|
for serving of static zones without caching, to enterprise-class
|
|
machines if you intend to process many dynamic updates and DNSSEC
|
|
signed zones, serving many thousands of queries per second.</para></sect1>
|
|
<sect1><title>Memory Requirements </title>
|
|
<para>The memory of the server has to be large enough to fit the
|
|
cache and zones loaded off disk. Future releases of <acronym>BIND</acronym> 9 will
|
|
provide methods to limit the amount of memory used by the cache,
|
|
at the expense of reducing cache hit rates and causing more <acronym>DNS</acronym>
|
|
traffic. It is still good practice to have enough memory to load
|
|
all zone and cache data into memory — unfortunately, the best way
|
|
to determine this for a given installation is to watch the nameserver
|
|
in operation. After a few weeks the server process should reach
|
|
a relatively stable size where entries are expiring from the cache as
|
|
fast as they are being inserted. Ideally, the resource limits should
|
|
be set higher than this stable size.</para></sect1>
|
|
<sect1><title>Nameserver Intensive Environment Issues</title>
|
|
<para>For nameserver intensive environments, there are two alternative
|
|
configurations that may be used. The first is where clients and
|
|
any second-level internal nameservers query a main nameserver, which
|
|
has enough memory to build a large cache. This approach minimizes
|
|
the bandwidth used by external name lookups. The second alternative
|
|
is to set up second-level internal nameservers to make queries independently.
|
|
In this configuration, none of the individual machines needs to
|
|
have as much memory or CPU power as in the first alternative, but
|
|
this has the disadvantage of making many more external queries,
|
|
as none of the nameservers share their cached data.</para></sect1>
|
|
<sect1><title>Supported Operating Systems</title>
|
|
<para>ISC <acronym>BIND</acronym> 9 compiles and runs on the following operating
|
|
systems:</para>
|
|
<itemizedlist>
|
|
<listitem>
|
|
<simpara>IBM AIX 4.3</simpara>
|
|
</listitem>
|
|
<listitem>
|
|
<simpara>Compaq Digital/Tru64 UNIX 4.0D</simpara>
|
|
</listitem>
|
|
<listitem>
|
|
<simpara>HP HP-UX 11</simpara>
|
|
</listitem>
|
|
<listitem>
|
|
<simpara>IRIX64 6.5</simpara>
|
|
</listitem>
|
|
<listitem>
|
|
<simpara>Red Hat Linux 6.0, 6.1</simpara>
|
|
</listitem>
|
|
<listitem>
|
|
<simpara>Sun Solaris 2.6, 7, 8 (beta)</simpara>
|
|
</listitem>
|
|
<listitem>
|
|
<simpara>FreeBSD 3.4-STABLE</simpara>
|
|
</listitem>
|
|
<listitem>
|
|
<simpara>NetBSD-current with "unproven" pthreads</simpara>
|
|
</listitem>
|
|
</itemizedlist>
|
|
</sect1>
|
|
</chapter>
|
|
|
|
<chapter id="ch03">
|
|
<title>Nameserver Configuration</title>
|
|
<para>In this section we provide some suggested configurations along
|
|
with guidelines for their use. We also address the topic of reasonable
|
|
option setting.</para>
|
|
<sect1 id="sample_configuration">
|
|
<title>Sample Configurations</title>
|
|
<sect2>
|
|
<title>A Caching-only Nameserver</title>
|
|
<para>The following sample configuration is appropriate for a caching-only
|
|
name server for use by clients internal to a corporation. All queries
|
|
from outside clients are refused.</para>
|
|
<programlisting>
|
|
// Two corporate subnets we wish to allow queries from.
|
|
acl "corpnets" { 192.168.4.0/24; 192.168.7.0/24; };
|
|
options {
|
|
directory "/etc/namedb"; // Working directory
|
|
pid-file "named.pid"; // Put pid file in working dir
|
|
allow-query { "corpnets"; };
|
|
};
|
|
// Root server hints
|
|
zone "." { type hint; file "root.hint"; };
|
|
// Provide a reverse mapping for the loopback address 127.0.0.1
|
|
zone "0.0.127.in-addr.arpa" {
|
|
type master;
|
|
file "localhost.rev";
|
|
notify no;
|
|
};
|
|
</programlisting>
|
|
</sect2>
|
|
<sect2>
|
|
<title>An Authoritative-only Nameserver</title>
|
|
<para>This sample configuration is for an authoritative-only server
|
|
that is the master server for "<filename>example.com</filename>"
|
|
and a slave for the subdomain "<filename>eng.example.com</filename>".</para>
|
|
<programlisting>
|
|
options {
|
|
directory "/etc/namedb"; // Working directory
|
|
pid-file "named.pid"; // Put pid file in working dir
|
|
allow-query { any; }; // This is the default
|
|
recursion no; // Do not provide recursive service
|
|
};
|
|
// Root server hints
|
|
zone "." { type hint; file "root.hint"; };
|
|
|
|
// Provide a reverse mapping for the loopback address 127.0.0.1
|
|
zone "0.0.127.in-addr.arpa" {
|
|
type master;
|
|
file "localhost.rev";
|
|
notify no;
|
|
};
|
|
// We are the master server for example.com
|
|
zone "example.com" {
|
|
type master;
|
|
file "example.com.db";
|
|
// IP addresses of slave servers allowed to transfer example.com
|
|
allow-transfer {
|
|
192.168.4.14;
|
|
192.168.5.53;
|
|
};
|
|
};
|
|
// We are a slave server for eng.example.com
|
|
zone "eng.example.com" {
|
|
type slave;
|
|
file "eng.example.com.bk";
|
|
// IP address of eng.example.com master server
|
|
masters { 192.168.4.12; };
|
|
};
|
|
</programlisting>
|
|
</sect2>
|
|
</sect1>
|
|
<sect1>
|
|
<title>Load Balancing</title>
|
|
<para>Primitive load balancing can be achieved in <acronym>DNS</acronym> using multiple
|
|
A records for one name.</para>
|
|
<para>For example, if you have three WWW servers with network addresses
|
|
of 10.0.0.1, 10.0.0.2 and 10.0.0.3, a set of records such as the
|
|
following means that clients will connect to each machine one third
|
|
of the time:</para>
|
|
<informaltable colsep = "0" rowsep = "0">
|
|
<tgroup cols = "5" colsep = "0" rowsep = "0"
|
|
tgroupstyle = "2Level-table">
|
|
<colspec colname = "1" colnum = "1" colsep = "0" colwidth = "0.875in"/>
|
|
<colspec colname = "2" colnum = "2" colsep = "0" colwidth = "0.500in"/>
|
|
<colspec colname = "3" colnum = "3" colsep = "0" colwidth = "0.750in"/>
|
|
<colspec colname = "4" colnum = "4" colsep = "0" colwidth = "0.750in"/>
|
|
<colspec colname = "5" colnum = "5" colsep = "0" colwidth = "2.028in"/>
|
|
<tbody>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para>Name</para></entry>
|
|
<entry colname = "2"><para>TTL</para></entry>
|
|
<entry colname = "3"><para>CLASS</para></entry>
|
|
<entry colname = "4"><para>TYPE</para></entry>
|
|
<entry colname = "5"><para>Resource Record (RR) Data</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><literal>www</literal></para></entry>
|
|
<entry colname = "2"><para><literal>600</literal></para></entry>
|
|
<entry colname = "3"><para><literal>IN</literal></para></entry>
|
|
<entry colname = "4"><para><literal>A</literal></para></entry>
|
|
<entry colname = "5"><para><literal>10.0.0.1</literal></para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para></para></entry>
|
|
<entry colname = "2"><para><literal>600</literal></para></entry>
|
|
<entry colname = "3"><para><literal>IN</literal></para></entry>
|
|
<entry colname = "4"><para><literal>A</literal></para></entry>
|
|
<entry colname = "5"><para><literal>10.0.0.2</literal></para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para></para></entry>
|
|
<entry colname = "2"><para><literal>600</literal></para></entry>
|
|
<entry colname = "3"><para><literal>IN</literal></para></entry>
|
|
<entry colname = "4"><para><literal>A</literal></para></entry>
|
|
<entry colname = "5"><para><literal>10.0.0.3</literal></para></entry>
|
|
</row>
|
|
</tbody>
|
|
</tgroup>
|
|
</informaltable>
|
|
<para>When a resolver queries for these records, <acronym>BIND</acronym> will rotate
|
|
them and respond to the query with the records in a different
|
|
order. In the example above, clients will randomly receive
|
|
records in the order 1, 2, 3; 2, 3, 1; and 3, 1, 2. Most clients
|
|
will use the first record returned and discard the rest.</para>
|
|
<para>For more detail on ordering responses, check the
|
|
<command>rrset-order</command> substatement in the
|
|
<command>options</command> statement, see <xref
|
|
endterm="rrset_ordering_title" linkend="rrset_ordering"/>. This substatement is not supported in
|
|
<acronym>BIND</acronym> 9, and only the ordering scheme described above is
|
|
available.</para>
|
|
|
|
</sect1>
|
|
<sect1 id="notify">
|
|
<title>Notify</title>
|
|
|
|
<para><acronym>DNS</acronym> Notify is a mechanism that allows master nameservers to
|
|
notify their slave servers of changes to a zone's data. In
|
|
response to a <command>NOTIFY</command> from a master server, the
|
|
slave will check to see that its version of the zone is the
|
|
current version and, if not, initiate a transfer.</para> <para><acronym>DNS</acronym>
|
|
Notify is fully documented in RFC 1996. See also the description
|
|
of the zone option <command>also-notify</command>, see <xref
|
|
linkend="zone_transfers"/>. For more information about
|
|
<command>notify</command>, see <xref
|
|
linkend="boolean_options"/>.</para>
|
|
|
|
</sect1>
|
|
<sect1>
|
|
<title>Nameserver Operations</title>
|
|
<sect2>
|
|
<title>Tools for Use With the Nameserver Daemon</title>
|
|
<para>There are several indispensable diagnostic, administrative
|
|
and monitoring tools available to the system administrator for controlling
|
|
and debugging the nameserver daemon. We describe several in this
|
|
section </para>
|
|
<sect3>
|
|
<title>Diagnostic Tools</title>
|
|
<variablelist>
|
|
<varlistentry>
|
|
<term><command>dig</command></term>
|
|
<listitem>
|
|
<para>The domain information groper (<command>dig</command>) is
|
|
a command line tool that can be used to gather information from
|
|
the Domain Name System servers. Dig has two modes: simple interactive
|
|
mode for a single query, and batch mode which executes a query for
|
|
each in a list of several query lines. All query options are accessible
|
|
from the command line.</para>
|
|
<cmdsynopsis label="Usage">
|
|
<command>dig</command>
|
|
<arg>@<replaceable>server</replaceable></arg>
|
|
<arg choice="plain"><replaceable>domain</replaceable></arg>
|
|
<arg><replaceable>query-type</replaceable></arg>
|
|
<arg><replaceable>query-class</replaceable></arg>
|
|
<arg>+<replaceable>query-option</replaceable></arg>
|
|
<arg>-<replaceable>dig-option</replaceable></arg>
|
|
<arg>%<replaceable>comment</replaceable></arg>
|
|
<!-- one of (SBR GROUP ARG COMMAND) -->
|
|
</cmdsynopsis>
|
|
<para>The usual simple use of dig will take the form</para>
|
|
<simpara><command>dig @server domain query-type query-class</command></simpara>
|
|
<para>For more information and a list of available commands and
|
|
options, see the <command>dig</command> man page.</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
<varlistentry>
|
|
<term><command>host</command></term>
|
|
<listitem>
|
|
<para>The <command>host</command> utility
|
|
provides a simple <acronym>DNS</acronym> lookup using a command-line interface for
|
|
looking up Internet hostnames. By default, the utility converts
|
|
between host names and Internet addresses, but its functionality
|
|
can be extended with the use of options.</para>
|
|
<cmdsynopsis label="Usage">
|
|
<!-- one of (SBR GROUP ARG COMMAND) -->
|
|
<command>host</command>
|
|
<arg>-aCdlrTwv</arg>
|
|
<arg>-c <replaceable>class</replaceable></arg>
|
|
<arg>-N <replaceable>ndots</replaceable></arg>
|
|
<arg>-t <replaceable>type</replaceable></arg>
|
|
<arg>-W <replaceable>timeout</replaceable></arg>
|
|
<arg>-R <replaceable>retries</replaceable></arg>
|
|
<arg choice="plain"><replaceable>hostname</replaceable></arg>
|
|
<arg><replaceable>server</replaceable></arg>
|
|
</cmdsynopsis>
|
|
<para>For more information and a list of available commands and
|
|
options, see the <command>host</command> man page.</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
<varlistentry>
|
|
<term><command>nslookup</command></term>
|
|
<listitem>
|
|
<para><command>nslookup</command> is a program used to query Internet
|
|
domain nameservers. <command>nslookup</command> has two modes: interactive
|
|
and non-interactive. Interactive mode allows the user to query nameservers
|
|
for information about various hosts and domains or to print a list
|
|
of hosts in a domain. Non-interactive mode is used to print just
|
|
the name and requested information for a host or domain.</para>
|
|
<cmdsynopsis label="Usage">
|
|
<command>nslookup</command>
|
|
<arg rep="repeat">-option</arg>
|
|
<group>
|
|
<arg><replaceable>host-to-find</replaceable></arg>
|
|
<arg>- <arg>server</arg></arg>
|
|
</group>
|
|
</cmdsynopsis>
|
|
<para>Interactive mode is entered when no arguments are given (the
|
|
default nameserver will be used) or when the first argument is a
|
|
hyphen (`-') and the second argument is the host name or Internet address
|
|
of a nameserver.</para>
|
|
<para>Non-interactive mode is used when the name or Internet address
|
|
of the host to be looked up is given as the first argument. The
|
|
optional second argument specifies the host name or address of a nameserver.</para>
|
|
<para>Due to its arcane user interface and frequently inconsistent
|
|
behavior, we do not recommend the use of <command>nslookup</command>.
|
|
Use <command>dig</command> instead.</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
</variablelist>
|
|
</sect3>
|
|
<sect3 id="admin_tools">
|
|
<title>Administrative Tools</title>
|
|
<para>Administrative tools play an integral part in the management
|
|
of a server.</para>
|
|
<variablelist>
|
|
<varlistentry id="rndc" xreflabel="Remote Name Daemon Control application">
|
|
<term><command>rndc</command></term>
|
|
<listitem>
|
|
<para>The remote name daemon control
|
|
(<command>rndc</command>) program allows the system
|
|
administrator to control the operation of a nameserver.
|
|
If you run <command>rndc</command> without any options
|
|
it will display a usage message as follows:</para>
|
|
<cmdsynopsis label="Usage">
|
|
<command>rndc</command>
|
|
<arg>-c <replaceable>config</replaceable></arg>
|
|
<arg>-s <replaceable>server</replaceable></arg>
|
|
<arg>-p <replaceable>port</replaceable></arg>
|
|
<arg>-y <replaceable>key</replaceable></arg>
|
|
<arg choice="plain"><replaceable>command</replaceable></arg>
|
|
<arg rep="repeat"><replaceable>command</replaceable></arg>
|
|
</cmdsynopsis>
|
|
<para><command>command</command> is one of the following
|
|
for <command>named</command>:</para>
|
|
<informaltable colsep = "0" rowsep = "0">
|
|
<tgroup cols = "2"
|
|
colsep = "0" rowsep = "0" tgroupstyle = "4Level-table">
|
|
<colspec colname = "1" colnum = "1"
|
|
colsep = "0" colwidth = "1.500in"/>
|
|
<colspec colname = "2" colnum = "2" colsep = "0"
|
|
colwidth = "3.000in"/>
|
|
<tbody>
|
|
<row rowsep = "0">
|
|
<entry colname = "1">
|
|
<para><userinput>status</userinput><footnote id="nyi1">
|
|
<para>not yet implemented</para>
|
|
</footnote></para></entry>
|
|
<entry colname = "2"><para>Display ps(1) status of named.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><userinput>dumpdb</userinput><footnoteref linkend="nyi1"/></para></entry>
|
|
<entry colname = "2"><para>Dump database and cache to /var/tmp/named_dump.db.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><userinput>reload</userinput></para></entry>
|
|
<entry colname = "2"><para>Reload configuration file and zones.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><userinput>stats</userinput><footnoteref linkend="nyi1"/></para></entry>
|
|
<entry colname = "2"><para>Dump statistics to /var/tmp/named.stats.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><userinput>trace</userinput><footnoteref linkend="nyi1"/></para></entry>
|
|
<entry colname = "2"><para>Increment debugging level by one.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1">
|
|
<para><userinput>notrace</userinput><footnoteref linkend="nyi1"/>
|
|
</para></entry>
|
|
<entry colname = "2"><para>Set debugging level to 0.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname =
|
|
"1"><para><userinput>querylog</userinput><footnoteref linkend="nyi1"/></para></entry>
|
|
<entry colname = "2"><para>Toggle query logging.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname =
|
|
"1"><para><userinput>stop</userinput><footnoteref linkend="nyi1"/></para></entry>
|
|
<entry colname = "2"><para>Stop the server.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname =
|
|
"1"><para><userinput>restart</userinput><footnoteref linkend="nyi1"/></para></entry>
|
|
<entry colname = "2"><para>Restart the server.</para></entry>
|
|
</row>
|
|
</tbody>
|
|
</tgroup>
|
|
</informaltable>
|
|
<para>As noted above, <command>reload</command> is the
|
|
only command available for <acronym>BIND</acronym> 9.0.0. The other
|
|
commands, and more, are planned to be implemented for
|
|
future releases.</para>
|
|
|
|
<para>A configuration file is required, since all
|
|
communication with the server is authenticated with
|
|
digital signatures that rely on a shared secret, and
|
|
there is no way to provide that secret other than with a
|
|
configuration file. The default location for the
|
|
<command>rndc</command> configuration file is
|
|
<filename>/etc/rndc.conf</filename>, but an alternate
|
|
location can be specified with the <option>-c</option>
|
|
option.</para>
|
|
|
|
<para>The format of the configuration file is similar to
|
|
that of <filename>named.conf</filename>, but limited to
|
|
only three statements, the <command>options{}</command>,
|
|
<command>key{}</command> and <command>server{}</command>
|
|
statements. These statements are what associate the
|
|
secret keys to the servers with which they are meant to
|
|
be shared. The order of statements is not
|
|
significant.</para>
|
|
|
|
<para>The <command>options{}</command> statement has two clauses: <command>default-server</command> and <command>default-key</command>. <command>default-server</command> takes a
|
|
host name or address argument and represents the server that will
|
|
be contacted if no <option>-s</option>
|
|
option is provided on the command line. <command>default-key</command> takes
|
|
the name of key as its argument, as defined by a <command>key{}</command> statement.
|
|
In the future a <command>default-port</command> clause will be
|
|
added to specify the port to which <command>rndc</command> should
|
|
connect.</para>
|
|
<para>The <command>key{}</command> statement names a key with its
|
|
string argument. The string is required by the server to be a valid
|
|
domain name, though it need not actually be hierarchical; thus,
|
|
a string like "<userinput>rndc_key</userinput>" is a valid name.
|
|
The <command>key{}</command> statement has two clauses: <command>algorithm</command> and <command>secret</command>.
|
|
While the configuration parser will accept any string as the argument
|
|
to algorithm, currently only the string "<userinput>hmac-md5</userinput>"
|
|
has any meaning. The secret is a base-64 encoded string, typically
|
|
generated with either <command>dnssec-keygen</command> or <command>mmencode</command>.</para>
|
|
<para>The <command>server{}</command> statement uses the key clause
|
|
to associate a <command>key{}</command>-defined key with a server.
|
|
The argument to the <command>server{}</command> statement is a
|
|
host name or address (addresses must be double quoted). The argument
|
|
to the key clause is the name of the key as defined by the <command>key{}</command> statement.
|
|
A <command>port</command> clause will be added to a future release
|
|
to specify the port to which <command>rndc</command> should connect
|
|
on the given server.</para>
|
|
<para>A sample minimal configuration file is as follows:</para>
|
|
<programlisting>
|
|
key rndc_key {
|
|
algorithm "hmac-md5";
|
|
secret "c3Ryb25nIGVub3VnaCBmb3IgYSBtYW4gYnV0IG1hZGUgZm9yIGEgd29tYW4K";
|
|
};
|
|
options {
|
|
default-server localhost;
|
|
default-key rndc_key;
|
|
};
|
|
</programlisting>
|
|
<para>This file, if installed as <filename>/etc/rndc.conf</filename>,
|
|
would allow the command:</para>
|
|
<para><prompt>$ </prompt><userinput>rndc reload</userinput></para>
|
|
<para>to connect to 127.0.0.1 port 953 and cause the nameserver
|
|
to reload, if a nameserver on the local machine were running with
|
|
following controls statements:</para>
|
|
<programlisting>
|
|
controls {
|
|
inet 127.0.0.1 allow { localhost; } keys { rndc_key; };
|
|
};
|
|
</programlisting>
|
|
<para>and it had an identical key statement for
|
|
<literal>rndc_key</literal>.</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
</variablelist>
|
|
|
|
</sect3>
|
|
</sect2>
|
|
<sect2>
|
|
<title>Signals</title>
|
|
<para>Certain UNIX signals cause the name server to take specific
|
|
actions, as described in the following table. These signals can
|
|
be sent using the <command>kill</command> command.</para>
|
|
<informaltable colsep = "0" rowsep = "0"><tgroup cols = "2"
|
|
colsep = "0" rowsep = "0" tgroupstyle = "3Level-table">
|
|
<colspec colname = "1" colnum = "1" colsep = "0" colwidth = "1.125in"/>
|
|
<colspec colname = "2" colnum = "2" colsep = "0" colwidth = "4.000in"/>
|
|
<tbody>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>SIGHUP</command></para></entry>
|
|
<entry colname = "2"><para>Causes the server to read <filename>named.conf</filename> and
|
|
reload the database. </para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>SIGTERM</command></para></entry>
|
|
<entry colname = "2"><para>Causes the server to clean up and exit.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1">
|
|
<para><command>SIGINT</command></para>
|
|
</entry>
|
|
<entry colname = "2"><para>Causes the server to clean up and exit.</para></entry>
|
|
</row>
|
|
</tbody>
|
|
</tgroup>
|
|
</informaltable>
|
|
</sect2>
|
|
</sect1>
|
|
</chapter>
|
|
|
|
<chapter id="ch04">
|
|
<title>Advanced Concepts</title>
|
|
<sect1 id="dynamic_update">
|
|
<title>Dynamic Update</title>
|
|
|
|
<para>Dynamic update is the term used for the ability under
|
|
certain specified conditions to add, modify or delete records or
|
|
RRsets in the master zone files. Dynamic update is fully described
|
|
in RFC 2136.</para>
|
|
|
|
<para>Dynamic update is enabled on a zone-by-zone basis, by
|
|
including an <command>allow-update</command> or
|
|
<command>update-policy</command> clause in the
|
|
<command>zone</command> statement.</para>
|
|
|
|
<para>Updating of secure zones (zones using DNSSEC) is modelled
|
|
after the <emphasis>simple-secure-update</emphasis> proposal, a
|
|
work in progress in the DNS Extensions working group of the IETF.
|
|
(See <ulink
|
|
url="http://www.ietf.org/html.charters/dnsext-charter.html">http://www.ietf.org/html.charters/dnsext-charter.html</ulink>
|
|
for information about the DNS Extensions working group.) SIG and
|
|
NXT records affected by updates are automatically regenerated by
|
|
the server using an online zone key. Update authorization is based
|
|
on transaction signatures and an explicit server policy.</para>
|
|
|
|
<para>The zone files of dynamic zones must not be edited by hand.
|
|
The zone file on disk at any given time may not contain the latest
|
|
changes performed by dynamic update. The zone file is written to
|
|
disk only periodically, and changes that have occurred since the
|
|
zone file was last written to disk are stored only in the zone's
|
|
journal (<filename>.jnl</filename>) file. <acronym>BIND</acronym> 9 currently does
|
|
not update the zone file when it exits as <acronym>BIND</acronym> 8 does, so editing
|
|
the zone file manually is unsafe even when the server has been
|
|
shut down. </para>
|
|
</sect1>
|
|
<sect1 id="incremental_zone_transfers">
|
|
<title>Incremental Zone Transfers (IXFR)</title>
|
|
|
|
<para>The incremental zone transfer (IXFR) protocol is a way for
|
|
slave servers to transfer only changed data, instead of having to
|
|
transfer the entire zone. The IXFR protocol is documented in RFC
|
|
1995. See <xref linkend="proposed_standards"/></para>
|
|
|
|
<para>When acting as a master, <acronym>BIND</acronym> 9 supports IXFR for those zones
|
|
where the necessary change history information is available. These
|
|
include master zones maintained by dynamic update and slave zones
|
|
whose data was obtained by IXFR, but not manually maintained master
|
|
zones nor slave zones obtained by performing a full zone transfer
|
|
(AXFR).</para>
|
|
<para>When acting as a slave, <acronym>BIND</acronym> 9 will attempt to use IXFR unless
|
|
it is explicitly disabled. For more information about disabling
|
|
IXFR, see the description of the <command>request-ixfr</command> clause
|
|
of the <command>server</command> statement.</para></sect1>
|
|
<sect1><title>Split DNS</title>
|
|
<para>Setting up different views, or visibility, of DNS space to
|
|
internal and external resolvers is usually referred to as a <emphasis>Split
|
|
DNS</emphasis> setup. There are several reasons an organization
|
|
would want to set up its DNS this way.</para>
|
|
<para>One common reason for setting up a DNS system this way is
|
|
to hide "internal" DNS information from "external" clients on the
|
|
Internet. There is some debate as to whether or not this is actually useful.
|
|
Internal DNS information leaks out in many ways (via email headers,
|
|
for example) and most savvy "attackers" can find the information
|
|
they need using other means.</para>
|
|
<para>Another common reason for setting up a Split DNS system is
|
|
to allow internal networks that are behind filters or in RFC 1918
|
|
space (reserved IP space, as documented in RFC 1918) to resolve DNS
|
|
on the Internet. Split DNS can also be used to allow mail from outside
|
|
back in to the internal network.</para>
|
|
<para>Here is an example of a split DNS setup:</para>
|
|
<para>Let's say a company named <emphasis>Example, Inc.</emphasis> (example.com)
|
|
has several corporate sites that have an internal network with reserved
|
|
Internet Protocol (IP) space and an external demilitarized zone (DMZ),
|
|
or "outside" section of a network, that is available to the public.</para>
|
|
<para><emphasis>Example, Inc.</emphasis> wants its internal clients
|
|
to be able to resolve external hostnames and to exchange mail with
|
|
people on the outside. The company also wants its internal resolvers
|
|
to have access to certain internal-only zones that are not available
|
|
at all outside of the internal network.</para>
|
|
<para>In order to accomplish this, the company will set up two sets
|
|
of nameservers. One set will be on the inside network (in the reserved
|
|
IP space) and the other set will be on bastion hosts, which are "proxy"
|
|
hosts that can talk to both sides of its network, in the DMZ.</para>
|
|
<para>The internal servers will be configured to forward all queries,
|
|
except queries for <filename>site1.internal</filename>, <filename>site2.internal</filename>, <filename>site1.example.com</filename>,
|
|
and <filename>site2.example.com</filename>, to the servers in the
|
|
DMZ. These internal servers will have complete sets of information
|
|
for <filename>site1.example.com</filename>, <filename>site2.example.com</filename>,<emphasis> </emphasis><filename>site1.internal</filename>,
|
|
and <filename>site2.internal</filename>.</para>
|
|
<para>To protect the<filename> site1.interna</filename><emphasis>l</emphasis> and<emphasis> </emphasis><filename>site2.internal</filename> domains,
|
|
the internal nameservers must be configured to disallow all queries
|
|
to these domains from any external hosts, including the bastion
|
|
hosts.</para>
|
|
<para>The external servers, which are on the bastion hosts, will
|
|
be configured to serve the "public" version of the <filename>site1</filename> and <filename>site2.example.com</filename> zones.
|
|
This could include things such as the host records for public servers
|
|
(<filename>www.example.com</filename> and <filename>ftp.example.com</filename>),
|
|
and mail exchange (MX) records (<filename>a.mx.example.com</filename> and <filename>b.mx.example.com</filename>).</para>
|
|
<para>In addition, the public <filename>site1</filename> and <filename>site2.example.com</filename> zones
|
|
should have special MX records that contain wildcard (`*') records
|
|
pointing to the bastion hosts. This is needed because external mail
|
|
servers do not have any other way of looking up how to deliver mail
|
|
to those internal hosts. With the wildcard records, the mail will
|
|
be delivered to the bastion host, which can then forward it on to
|
|
internal hosts.</para>
|
|
<para>Here's an example of a wildcard MX record:</para>
|
|
<programlisting><literal>* IN MX 10 external1.example.com.</literal></programlisting>
|
|
<para>Now that they accept mail on behalf of anything in the internal
|
|
network, the bastion hosts will need to know how to deliver mail
|
|
to internal hosts. In order for this to work properly, the resolvers on
|
|
the bastion hosts will need to be configured to point to the internal
|
|
nameservers for DNS resolution.</para>
|
|
<para>Queries for internal hostnames will be answered by the internal
|
|
servers, and queries for external hostnames will be forwarded back
|
|
out to the DNS servers on the bastion hosts.</para>
|
|
<para>In order for all this to work properly, internal clients will
|
|
need to be configured to query <emphasis>only</emphasis> the internal
|
|
nameservers for DNS queries. This could also be enforced via selective
|
|
filtering on the network.</para>
|
|
<para>If everything has been set properly, <emphasis>Example, Inc.</emphasis>'s
|
|
internal clients will now be able to:</para>
|
|
<itemizedlist><listitem>
|
|
<simpara>Look up any hostnames in the <systemitem class="systemname">site1</systemitem> and
|
|
<systemitem class="systemname">site2.example.com</systemitem> zones.</simpara></listitem>
|
|
<listitem>
|
|
<simpara>Look up any hostnames in the <systemitem class="systemname">site1.internal</systemitem> and
|
|
<systemitem class="systemname">site2.internal</systemitem> domains.</simpara></listitem>
|
|
<listitem>
|
|
<simpara>Look up any hostnames on the Internet.</simpara></listitem>
|
|
<listitem>
|
|
<simpara>Exchange mail with internal AND external people.</simpara></listitem></itemizedlist>
|
|
<para>Hosts on the Internet will be able to:</para>
|
|
<itemizedlist><listitem>
|
|
<simpara>Look up any hostnames in the <systemitem class="systemname">site1</systemitem> and
|
|
<systemitem class="systemname">site2.example.com </systemitem>zones.</simpara></listitem>
|
|
<listitem>
|
|
<simpara>Exchange mail with anyone in the <systemitem class="systemname">site1</systemitem> and
|
|
<systemitem class="systemname">site2.example.com</systemitem> zones.</simpara></listitem></itemizedlist>
|
|
|
|
<para>Here is an example configuration for the setup we just
|
|
described above. Note that this is only configuration information;
|
|
for information on how to configure your zone files, see <xref
|
|
linkend="sample_configuration"/></para>
|
|
|
|
<para>Internal DNS server config:</para>
|
|
<programlisting>
|
|
|
|
acl internals { 172.16.72.0/24; 192.168.1.0/24; };
|
|
|
|
acl externals { <varname>bastion-ips-go-here</varname>; };
|
|
|
|
options {
|
|
...
|
|
...
|
|
forward only;
|
|
forwarders { // forward to external servers
|
|
<varname>bastion-ips-go-here</varname>;
|
|
};
|
|
allow-transfer { none; }; // sample allow-transfer (no one)
|
|
allow-query { internals; externals; }; // restrict query access
|
|
allow-recursion { internals; }; // restrict recursion
|
|
...
|
|
...
|
|
};
|
|
|
|
zone "site1.example.com" { // sample slave zone
|
|
type master;
|
|
file "m/site1.example.com";
|
|
forwarders { }; // do normal iterative
|
|
// resolution (do not forward)
|
|
allow-query { internals; externals; };
|
|
allow-transfer { internals; };
|
|
};
|
|
|
|
zone "site2.example.com" {
|
|
type slave;
|
|
file "s/site2.example.com";
|
|
masters { 172.16.72.3; };
|
|
forwarders { };
|
|
allow-query { internals; externals; };
|
|
allow-transfer { internals; };
|
|
};
|
|
|
|
zone "site1.internal" {
|
|
type master;
|
|
file "m/site1.internal";
|
|
forwarders { };
|
|
allow-query { internals; };
|
|
allow-transfer { internals; }
|
|
};
|
|
|
|
zone "site2.internal" {
|
|
type slave;
|
|
file "s/site2.internal";
|
|
masters { 172.16.72.3; };
|
|
forwarders { };
|
|
allow-query { internals };
|
|
allow-transfer { internals; }
|
|
};
|
|
</programlisting>
|
|
<para>External (bastion host) DNS server config:</para>
|
|
<programlisting>
|
|
acl internals { 172.16.72.0/24; 192.168.1.0/24; };
|
|
|
|
acl externals { bastion-ips-go-here; };
|
|
|
|
options {
|
|
...
|
|
...
|
|
allow-transfer { none; }; // sample allow-transfer (no one)
|
|
allow-query { internals; externals; }; // restrict query access
|
|
allow-recursion { internals; externals; }; // restrict recursion
|
|
...
|
|
...
|
|
};
|
|
|
|
zone "site1.example.com" { // sample slave zone
|
|
type master;
|
|
file "m/site1.foo.com";
|
|
allow-query { any; };
|
|
allow-transfer { internals; externals; };
|
|
};
|
|
|
|
zone "site2.example.com" {
|
|
type slave;
|
|
file "s/site2.foo.com";
|
|
masters { another_bastion_host_maybe; };
|
|
allow-query { any; };
|
|
allow-transfer { internals; externals; }
|
|
};
|
|
</programlisting>
|
|
<para>In the <filename>resolv.conf</filename> (or equivalent) on
|
|
the bastion host(s):</para>
|
|
<programlisting>
|
|
search ...
|
|
nameserver 172.16.72.2
|
|
nameserver 172.16.72.3
|
|
nameserver 172.16.72.4
|
|
</programlisting>
|
|
</sect1>
|
|
<sect1 id="tsig"><title>TSIG</title>
|
|
<para>This is a short guide to setting up Transaction SIGnatures
|
|
(TSIG) based transaction security in <acronym>BIND</acronym>. It describes changes
|
|
to the configuration file as well as what changes are required for
|
|
different features, including the process of creating transaction
|
|
keys and using transaction signatures with <acronym>BIND</acronym>.</para>
|
|
<para><acronym>BIND</acronym> primarily supports TSIG for server to server communication.
|
|
This includes zone transfer, notify, and recursive query messages.
|
|
Resolvers based on newer versions of <acronym>BIND</acronym> 8 have limited support
|
|
for TSIG.</para>
|
|
|
|
<para>TSIG might be most useful for dynamic update. A primary
|
|
server for a dynamic zone should use access control to control
|
|
updates, but IP-based access control is insufficient. Key-based
|
|
access control is far superior, see <xref
|
|
linkend="proposed_standards"/>. The <command>nsupdate</command>
|
|
program supports TSIG via the <option>-k</option> and
|
|
<option>-y</option> command line options.</para>
|
|
|
|
<sect2><title>Generate Shared Keys for Each Pair of Hosts</title>
|
|
<para>A shared secret is generated to be shared between <emphasis>host1</emphasis> and <emphasis>host2</emphasis>.
|
|
An arbitrary key name is chosen: "host1-host2.". The key name must
|
|
be the same on both hosts.</para>
|
|
<sect3><title>Automatic Generation</title>
|
|
<para>The following command will generate a 128 bit (16 byte) HMAC-MD5
|
|
key as described above. Longer keys are better, but shorter keys
|
|
are easier to read. Note that the maximum key length is 512 bits;
|
|
keys longer than that will be digested with MD5 to produce a 128
|
|
bit key.</para>
|
|
<para><userinput>dnssec-keygen -a hmac-md5 -b 128 -n HOST host1-host2.</userinput></para>
|
|
<para>The key is in the file <filename>Khost1-host2.+157+00000.private</filename>.
|
|
Nothing directly uses this file, but the base-64 encoded string
|
|
following "<literal>Key:</literal>"
|
|
can be extracted from the file and used as a shared secret:</para>
|
|
<programlisting>Key: La/E5CjG9O+os1jq0a2jdA==</programlisting>
|
|
<para>The string "<literal>La/E5CjG9O+os1jq0a2jdA==</literal>" can
|
|
be used as the shared secret.</para></sect3>
|
|
<sect3><title>Manual Generation</title>
|
|
<para>The shared secret is simply a random sequence of bits, encoded
|
|
in base-64. Most ASCII strings are valid base-64 strings (assuming
|
|
the length is a multiple of 4 and only valid characters are used),
|
|
so the shared secret can be manually generated.</para>
|
|
<para>Also, a known string can be run through <command>mmencode</command> or
|
|
a similar program to generate base-64 encoded data.</para></sect3></sect2>
|
|
<sect2><title>Copying the Shared Secret to Both Machines</title>
|
|
<para>This is beyond the scope of DNS. A secure transport mechanism
|
|
should be used. This could be secure FTP, ssh, telephone, etc.</para></sect2>
|
|
<sect2><title>Informing the Servers of the Key's Existence</title>
|
|
<para>Imagine <emphasis>host1</emphasis> and <emphasis>host 2</emphasis> are
|
|
both servers. The following is added to each server's <filename>named.conf</filename> file:</para>
|
|
<programlisting>
|
|
key host1-host2. {
|
|
algorithm hmac-md5;
|
|
secret "La/E5CjG9O+os1jq0a2jdA==";
|
|
};
|
|
</programlisting>
|
|
<para>The algorithm, hmac-md5, is the only one supported by <acronym>BIND</acronym>.
|
|
The secret is the one generated above. Since this is a secret, it
|
|
is recommended that either <filename>named.conf</filename> be non-world
|
|
readable, or the key directive be added to a non-world readable
|
|
file that is included by <filename>named.conf</filename>.</para>
|
|
<para>At this point, the key is recognized. This means that if the
|
|
server receives a message signed by this key, it can verify the
|
|
signature. If the signature succeeds, the response is signed by
|
|
the same key.</para></sect2>
|
|
<sect2><title>Instructing the Server to Use the Key</title>
|
|
<para>Since keys are shared between two hosts only, the server must
|
|
be told when keys are to be used. The following is added to the <filename>named.conf</filename> file
|
|
for <emphasis>host1</emphasis>, if the IP address of <emphasis>host2</emphasis> is
|
|
10.1.2.3:</para>
|
|
<programlisting>
|
|
server 10.1.2.3 {
|
|
keys { host1-host2. ;};
|
|
};
|
|
</programlisting>
|
|
<para>Multiple keys may be present, but only the first is used.
|
|
This directive does not contain any secrets, so it may be in a world-readable
|
|
file.</para>
|
|
<para>If <emphasis>host1</emphasis> sends a message that is a response
|
|
to that address, the message will be signed with the specified key. <emphasis>host1</emphasis> will
|
|
expect any responses to signed messages to be signed with the same
|
|
key.</para>
|
|
<para>A similar statement must be present in <emphasis>host2</emphasis>'s
|
|
configuration file (with <emphasis>host1</emphasis>'s address) for <emphasis>host2</emphasis> to
|
|
sign non-response messages to <emphasis>host1</emphasis>.</para></sect2>
|
|
<sect2><title>TSIG Key Based Access Control</title>
|
|
<para><acronym>BIND</acronym> allows IP addresses and ranges to be specified in ACL
|
|
definitions and
|
|
<command>allow-{ query | transfer | update } </command>directives.
|
|
This has been extended to allow TSIG keys also. The above key would
|
|
be denoted <command>key host1-host2.</command></para>
|
|
<para>An example of an allow-update directive would be:</para>
|
|
<programlisting>
|
|
allow-update { key host1-host2. ;};
|
|
</programlisting>
|
|
|
|
<para>This allows dynamic updates to succeed only if the request
|
|
was signed by a key named
|
|
"<command>host1-host2.</command>".</para> <para>You may want to read about the more
|
|
powerful <command>update-policy</command> statement in <xref
|
|
linkend="dynamic_update_policies"/>.</para>
|
|
|
|
</sect2>
|
|
<sect2>
|
|
<title>Errors</title>
|
|
|
|
<para>The processing of TSIG signed messages can result in
|
|
several errors. If a signed message is sent to a non-TSIG aware
|
|
server, a FORMERR will be returned, since the server will not
|
|
understand the record. This is a result of misconfiguration,
|
|
since the server must be explicitly configured to send a TSIG
|
|
signed message to a specific server.</para>
|
|
|
|
<para>If a TSIG aware server receives a message signed by an
|
|
unknown key, the response will be unsigned with the TSIG
|
|
extended error code set to BADKEY. If a TSIG aware server
|
|
receives a message with a signature that does not validate, the
|
|
response will be unsigned with the TSIG extended error code set
|
|
to BADSIG. If a TSIG aware server receives a message with a time
|
|
outside of the allowed range, the response will be signed with
|
|
the TSIG extended error code set to BADTIME, and the time values
|
|
will be adjusted so that the response can be successfully
|
|
verified. In any of these cases, the message's rcode is set to
|
|
NOTAUTH.</para>
|
|
|
|
</sect2>
|
|
</sect1>
|
|
<sect1>
|
|
<title>TKEY</title>
|
|
|
|
<para><command>TKEY</command> is a mechanism for automatically
|
|
generating a shared secret between two hosts. There are several
|
|
"modes" of <command>TKEY</command> that specify how the key is
|
|
generated or assigned. <acronym>BIND</acronym> implements only one of these modes,
|
|
the Diffie-Hellman key exchange. Both hosts are required to have
|
|
a Diffie-Hellman KEY record (although this record is not required
|
|
to be present in a zone). The <command>TKEY</command> process
|
|
must use signed messages, signed either by TSIG or SIG(0). The
|
|
result of <command>TKEY</command> is a shared secret that can be
|
|
used to sign messages with TSIG. <command>TKEY</command> can also
|
|
be used to delete shared secrets that it had previously
|
|
generated.</para>
|
|
|
|
<para>The <command>TKEY</command> process is initiated by a client
|
|
or server by sending a signed <command>TKEY</command> query
|
|
(including any appropriate KEYs) to a TKEY-aware server. The
|
|
server response, if it indicates success, will contain a
|
|
<command>TKEY</command> record and any appropriate keys. After
|
|
this exchange, both participants have enough information to
|
|
determine the shared secret; the exact process depends on the
|
|
<command>TKEY</command> mode. When using the Diffie-Hellman
|
|
<command>TKEY</command> mode, Diffie-Hellman keys are exchanged,
|
|
and the shared secret is derived by both participants.</para>
|
|
|
|
</sect1>
|
|
<sect1>
|
|
<title>SIG(0)</title>
|
|
|
|
<para><acronym>BIND</acronym> 9 partially supports DNSSEC SIG(0) transaction
|
|
signatures as specified in RFC 2535. SIG(0) uses public/private
|
|
keys to authenticate messages. Access control is performed in the
|
|
same manner as TSIG keys; privileges can be granted or denied
|
|
based on the key name.</para>
|
|
|
|
<para>When a SIG(0) signed message is received, it will only be
|
|
verified if the key is known and trusted by the server; the server
|
|
will not attempt to locate and/or validate the key.</para>
|
|
|
|
<para><acronym>BIND</acronym> 9 does not ship with any tools that generate SIG(0)
|
|
signed messages.</para>
|
|
|
|
</sect1>
|
|
<sect1 id="DNSSEC">
|
|
<title>DNSSEC</title>
|
|
|
|
<para>Cryptographic authentication of DNS information is possible
|
|
through the DNS Security (<emphasis>DNSSEC</emphasis>) extensions,
|
|
defined in RFC 2535. This section describes the creation and use
|
|
of DNSSEC signed zones.</para>
|
|
|
|
<para>In order to set up a DNSSEC secure zone, there are a series
|
|
of steps which must be followed. <acronym>BIND</acronym> 9 ships with several tools
|
|
that are used in this process, which are explained in more detail
|
|
below. In all cases, the "<option>-h</option>" option prints a
|
|
full list of parameters. Note that the DNSSEC tools require the
|
|
keyset and signedkey files to be in the working directory.</para>
|
|
|
|
<para>There must also be communication with the administrators of
|
|
the parent and/or child zone to transmit keys and signatures. A
|
|
zone's security status must be indicated by the parent zone for a
|
|
DNSSEC capable resolver to trust its data.</para>
|
|
|
|
<para>For other servers to trust data in this zone, they must
|
|
either be statically configured with this zone's zone key or the
|
|
zone key of another zone above this one in the DNS tree.</para>
|
|
|
|
<sect2>
|
|
<title>Generating Keys</title>
|
|
|
|
<para>The <command>dnssec-keygen</command> program is used to
|
|
generate keys.</para>
|
|
|
|
<para>A secure zone must contain one or more zone keys. The
|
|
zone keys will sign all other records in the zone, as well as
|
|
the zone keys of any secure delegated zones. Zone keys must
|
|
have the same name as the zone, a name type of
|
|
<command>ZONE</command>, and must be usable for authentication.
|
|
It is recommended that zone keys be mandatory to implement a
|
|
cryptographic algorithm; currently the only key mandatory to
|
|
implement an algorithm is DSA.</para>
|
|
|
|
<para>The following command will generate a 768 bit DSA key for
|
|
the <filename>child.example</filename> zone:</para>
|
|
|
|
<para><userinput>dnssec-keygen -a DSA -b 768 -n ZONE child.example.</userinput></para>
|
|
|
|
<para>Two output files will be produced:
|
|
<filename>Kchild.example.+003+12345.key</filename> and
|
|
<filename>Kchild.example.+003+12345.private</filename> (where
|
|
12345 is an example of a key tag). The key file names contain
|
|
the key name (<filename>child.example.</filename>), algorithm (3
|
|
is DSA, 1 is RSA, etc.), and the key tag (12345 in this case).
|
|
The private key (in the <filename>.private</filename> file) is
|
|
used to generate signatures, and the public key (in the
|
|
<filename>.key</filename> file) is used for signature
|
|
verification.</para>
|
|
|
|
<para>To generate another key with the same properties (but with
|
|
a different key tag), repeat the above command.</para>
|
|
|
|
<para>The public keys should be inserted into the zone file with
|
|
<command>$INCLUDE</command> statements, including the
|
|
<filename>.key </filename>files.</para>
|
|
|
|
</sect2>
|
|
<sect2>
|
|
<title>Creating a Keyset</title>
|
|
|
|
<para>The <command>dnssec-makekeyset</command> program is used
|
|
to create a key set from one or more keys.</para>
|
|
|
|
<para>Once the zone keys have been generated, a key set must be
|
|
built for transmission to the administrator of the parent zone,
|
|
so that the parent zone can sign the keys with its own zone key
|
|
and correctly indicate the security status of this zone. When
|
|
building a key set, the list of keys to be included and the TTL
|
|
of the set must be specified, and the desired signature validity
|
|
period of the parent's signature may also be specified.</para>
|
|
|
|
<para>The list of keys to be inserted into the key set may also
|
|
included non-zone keys present at the top of the zone.
|
|
<command>dnssec-makekeyset</command> may also be used at other
|
|
names in the zone.</para>
|
|
|
|
<para>The following command generates a key set containing the
|
|
above key and another key similarly generated, with a TTL of
|
|
3600 and a signature validity period of 10 days starting from
|
|
now.</para>
|
|
|
|
<para><userinput>dnssec-makekeyset -t 3600 -e +86400 Kchild.example.+003+12345 Kchild.example.+003+23456</userinput></para>
|
|
|
|
<para>One output file is produced:
|
|
<filename>child.example.keyset</filename>. This file should be
|
|
transmitted to the parent to be signed. It includes the keys,
|
|
as well as signatures over the key set generated by the zone
|
|
keys themselves, which are used to prove ownership of the
|
|
private keys and encode the desired validity period.</para>
|
|
|
|
</sect2>
|
|
<sect2>
|
|
<title>Signing the Child's Keyset</title>
|
|
|
|
<para>The <command>dnssec-signkey</command> program is used to
|
|
sign one child's keyset.</para>
|
|
|
|
<para>If the <filename>child.example</filename> zone has any
|
|
delegations which are secure, for example,
|
|
<filename>grand.child.example</filename>, the
|
|
<filename>child.example</filename> administrator should receive
|
|
keyset files for each secure subzone. These keys must be signed
|
|
by this zone's zone keys.</para>
|
|
|
|
<para>The following command signs the child's key set with the
|
|
zone keys:</para>
|
|
|
|
<para><userinput>dnssec-signkey grand.child.example.keyset Kchild.example.+003+12345 Kchild.example.+003+23456</userinput></para>
|
|
|
|
<para>One output file is produced:
|
|
<filename>grand.child.example.signedkey</filename>. This file
|
|
should be both transmitted back to the child and retained. It
|
|
includes all keys (the child's keys) from the keyset file and
|
|
signatures generated by this zone's zone keys.</para>
|
|
|
|
</sect2>
|
|
<sect2>
|
|
<title>Signing the Zone</title>
|
|
|
|
<para>The <command>dnssec-signzone</command> program is used to
|
|
sign a zone.</para>
|
|
|
|
<para>Any <filename>signedkey</filename> files corresponding to
|
|
secure subzones should be present, as well as a
|
|
<filename>signedkey</filename> file for this zone generated by
|
|
the parent (if there is one). The zone signer will generate
|
|
<literal>NXT</literal> and <literal>SIG</literal> records for
|
|
the zone, as well as incorporate the zone key signature from the
|
|
parent and indicate the security status at all delegation
|
|
points.</para>
|
|
|
|
<para>The following command signs the zone, assuming it is in a
|
|
file called <filename>zone.child.example</filename>. By
|
|
default, all zone keys which have an available private key are
|
|
used to generate signatures.</para>
|
|
|
|
<para><userinput>dnssec-signzone -o child.example zone.child.example</userinput></para>
|
|
|
|
<para>One output file is produced:
|
|
<filename>zone.child.example.signed</filename>. This file
|
|
should be referenced by <filename>named.conf</filename> as the
|
|
input file for the zone.</para>
|
|
|
|
</sect2>
|
|
<sect2><title>Configuring Servers</title>
|
|
|
|
<para>Unlike in <acronym>BIND</acronym> 8, data is not verified on load in <acronym>BIND</acronym> 9,
|
|
so zone keys for authoritative zones do not need to be specified
|
|
in the configuration file.</para>
|
|
|
|
<para>The public key for any security root must be present in
|
|
the configuration file's <command>trusted-keys</command>
|
|
statement, as described later in this document. </para>
|
|
|
|
</sect2>
|
|
</sect1>
|
|
<sect1>
|
|
<title>IPv6 Support in <acronym>BIND</acronym> 9</title>
|
|
|
|
<para><acronym>BIND</acronym> 9 fully supports all currently defined forms of IPv6
|
|
name to address and address to name lookups. It will also use
|
|
IPv6 addresses to make queries when running on an IPv6 capable
|
|
system.</para>
|
|
|
|
<para>For forward lookups, <acronym>BIND</acronym> 9 supports both A6 and AAAA
|
|
records. The use of AAAA records is deprecated, but it is still
|
|
useful for hosts to have both AAAA and A6 records to maintain
|
|
backward compatibility with installations where AAAA records are
|
|
still used. In fact, the stub resolvers currently shipped with
|
|
most operating system support only AAAA lookups, because following
|
|
A6 chains is much harder than doing A or AAAA lookups.</para>
|
|
|
|
<para>For IPv6 reverse lookups, <acronym>BIND</acronym> 9 supports the new
|
|
"bitstring" format used in the <emphasis>ip6.arpa</emphasis>
|
|
domain, as well as the older, deprecated "nibble" format used in
|
|
the <emphasis>ip6.int</emphasis> domain.</para>
|
|
|
|
<para><acronym>BIND</acronym> 9 includes a new lightweight resolver library and
|
|
resolver daemon which new applications may choose to use to avoid
|
|
the complexities of A6 chain following and bitstring labels, see <xref
|
|
linkend="ch05"/>.</para>
|
|
|
|
<sect2>
|
|
<title>Address Lookups Using AAAA Records</title>
|
|
|
|
<para>The AAAA record is a parallel to the IPv4 A record. It
|
|
specifies the entire address in a single record. For
|
|
example,</para>
|
|
|
|
<programlisting>
|
|
$ORIGIN example.com.
|
|
host 3600 IN AAAA 3ffe:8050:201:1860:42::1
|
|
</programlisting>
|
|
|
|
<para>While their use is deprecated, they are useful to support
|
|
older IPv6 applications. They should not be added where they
|
|
are not absolutely necessary.</para>
|
|
|
|
</sect2>
|
|
<sect2>
|
|
<title>Address Lookups Using A6 Records</title>
|
|
|
|
<para>The A6 record is more flexible than the AAAA record, and
|
|
is therefore more complicated. The A6 record can be used to
|
|
form a chain of A6 records, each specifying part of the IPv6
|
|
address. It can also be used to specify the entire record as
|
|
well. For example, this record supplies the same data as the
|
|
AAAA record in the previous example:</para>
|
|
|
|
<programlisting>
|
|
$ORIGIN example.com.
|
|
host 3600 IN A6 0 3ffe:8050:201:1860:42::1
|
|
</programlisting>
|
|
<sect3>
|
|
<title>A6 Chains</title>
|
|
|
|
<para>A6 records are designed to allow network
|
|
renumbering. This works when an A6 record only specifies the
|
|
part of the address space the domain owner controls. For
|
|
example, a host may be at a company named "company." It has
|
|
two ISPs which provide IPv6 address space for it. These two
|
|
ISPs fully specify the IPv6 prefix they supply.</para>
|
|
|
|
<para>In the company's address space:</para>
|
|
|
|
<programlisting>
|
|
$ORIGIN example.com.
|
|
host 3600 IN A6 64 0:0:0:0:42::1 company.example1.net.
|
|
host 3600 IN A6 64 0:0:0:0:42::1 company.example2.net.
|
|
</programlisting>
|
|
|
|
<para>ISP1 will use:</para>
|
|
|
|
<programlisting>
|
|
$ORIGIN example1.net.
|
|
company 3600 IN A6 0 3ffe:8050:201:1860::
|
|
</programlisting>
|
|
|
|
<para>ISP2 will use:</para>
|
|
|
|
<programlisting>
|
|
$ORIGIN example2.net.
|
|
company 3600 IN A6 0 1234:5678:90ab:fffa::
|
|
</programlisting>
|
|
|
|
<para>When <systemitem
|
|
class="systemname">host.example.com</systemitem> is looked up,
|
|
the resolver (in the resolver daemon or caching name server)
|
|
will find two partial A6 records, and will use the additional
|
|
name to find the remainder of the data.</para>
|
|
|
|
</sect3>
|
|
<sect3>
|
|
<title>A6 Records for DNS Servers</title>
|
|
|
|
<para>When an A6 record specifies the address of a name
|
|
server, it should use the full address rather than specifying
|
|
a partial address. For example:</para>
|
|
|
|
<programlisting>
|
|
$ORIGIN example.com.
|
|
@ 14400 IN NS ns0
|
|
14400 IN NS ns1
|
|
ns0 14400 IN A6 0 3ffe:8050:201:1860:42::1
|
|
ns1 14400 IN A 192.168.42.1
|
|
</programlisting>
|
|
|
|
<para>It is recommended that IPv4-in-IPv6 mapped addresses not
|
|
be used. If a host has an IPv4 address, use an A record, not
|
|
an A6, with <literal>::ffff:192.168.42.1</literal> as the
|
|
address.</para>
|
|
|
|
</sect3>
|
|
</sect2>
|
|
<sect2>
|
|
<title>Address to Name Lookups Using Nibble Format</title>
|
|
|
|
<para>While the use of nibble format to look up names is
|
|
deprecated, it is supported for backwards compatiblity with
|
|
existing IPv6 applications.</para>
|
|
|
|
<para>When looking up an address in nibble format, the address
|
|
components are simply reversed, just as in IPv4, and
|
|
<literal>ip6.int.</literal> is appended to the resulting name.
|
|
For example, the following would provide reverse name lookup for
|
|
a host with address
|
|
<literal>3ffe:8050:201:1860:42::1</literal>.</para>
|
|
|
|
<programlisting>
|
|
$ORIGIN 0.6.8.1.1.0.2.0.0.5.0.8.e.f.f.3.ip6.int.
|
|
1.0.0.0.0.0.0.0.0.0.0.0.2.4.0.0 14400 IN PTR host.example.com.
|
|
</programlisting>
|
|
</sect2>
|
|
<sect2>
|
|
<title>Address to Name Lookups Using Bitstring Format</title>
|
|
|
|
<para>Bitstring labels can start and end on any bit boundary,
|
|
rather than on a multiple of 4 bits as in the nibble
|
|
format. They also use <emphasis>ip6.arpa</emphasis> rather than
|
|
<emphasis>ip6.int</emphasis>.</para>
|
|
|
|
<para>To replicate the previous example using bitstrings:</para>
|
|
|
|
<programlisting>
|
|
$ORIGIN \[x3ffe805002011860/64].ip6.arpa.
|
|
\[x0042000000000001/64] 14400 IN PTR host.example.com.
|
|
</programlisting>
|
|
</sect2>
|
|
<sect2>
|
|
<title>Using DNAME for Delegation of IPv6 Reverse Addresses</title>
|
|
|
|
<para>In IPV6, the same host may have many addresses from many
|
|
network providers. Since the trailing portion of the address
|
|
usually remains constant, <command>DNAME</command> can help
|
|
reduce the number of zone files used for reverse mapping that
|
|
need to be maintained.</para>
|
|
|
|
<para>For example, consider a host which has two providers
|
|
(<systemitem class="systemname">example.net</systemitem> and
|
|
<systemitem class="systemname">example2.net</systemitem>) and
|
|
therefore two IPv6 addresses. Since the host chooses its own 64
|
|
bit host address portion, the provider address is the only part
|
|
that changes:</para>
|
|
|
|
<programlisting>
|
|
$ORIGIN example.com.
|
|
host A6 64 ::1234:5678:1212:5675 cust1.example.net.
|
|
A6 64 ::1234:5678:1212:5675 subnet5.example2.net.
|
|
$ORIGIN example.net.
|
|
cust1 A6 48 0:0:0:dddd:: ipv6net.example.net.
|
|
ipv6net A6 0 aa:bb:cccc::
|
|
$ORIGIN example2.net.
|
|
subnet5 A6 48 0:0:0:1:: ipv6net2.example2.net.
|
|
ipv6net2 A6 0 6666:5555:4::
|
|
</programlisting>
|
|
|
|
<para>This sets up forward lookups. To handle the reverse lookups,
|
|
the provider <systemitem class="systemname">example.net</systemitem>
|
|
would have:</para>
|
|
|
|
<programlisting>
|
|
$ORIGIN \[x00aa00bbcccc/48].ip6.arpa.
|
|
\[xdddd/16] DNAME ipv6-rev.example.com.
|
|
</programlisting>
|
|
|
|
<para>and <systemitem
|
|
class="systemname">example2.net</systemitem> would have:</para>
|
|
|
|
<programlisting>
|
|
$ORIGIN \[x666655550004/48].ip6.arpa.
|
|
\[x0001/16] DNAME ipv6-rev.example.com.
|
|
</programlisting>
|
|
|
|
<para><systemitem class="systemname">example.com</systemitem>
|
|
needs only one zone file to handle both of these reverse
|
|
mappings:</para>
|
|
|
|
<programlisting>
|
|
$ORIGIN ipv6-rev.example.com.
|
|
\[x1234567812125675/64] PTR host.example.com.
|
|
</programlisting>
|
|
</sect2>
|
|
</sect1>
|
|
</chapter>
|
|
|
|
<chapter id="ch05"><title>The <acronym>BIND</acronym> 9 Lightweight Resolver</title>
|
|
<sect1><title>The Lightweight Resolver Library</title>
|
|
<para>Traditionally applications have been linked with a stub resolver
|
|
library that sends recursive DNS queries to a local caching name
|
|
server.</para>
|
|
<para>IPv6 introduces new complexity into the resolution process,
|
|
such as following A6 chains and DNAME records, and simultaneous
|
|
lookup of IPv4 and IPv6 addresses. These are hard or impossible
|
|
to implement in a traditional stub resolver.</para>
|
|
<para>Instead, <acronym>BIND</acronym> 9 provides resolution services to local clients
|
|
using a combination of a lightweight resolver library and a resolver
|
|
daemon process running on the local host. These communicate using
|
|
a simple UDP-based protocol, the "lightweight resolver protocol"
|
|
that is distinct from and simpler than the full DNS protocol.</para></sect1>
|
|
<sect1><title>Running a Resolver Daemon</title>
|
|
<para>To use the lightweight resolver interface, the system must
|
|
run the resolver daemon <command>lwresd</command>.</para>
|
|
<para>Applications using the lightweight resolver library will make
|
|
UDP requests to the IPv4 loopback address (127.0.0.1) on port 921.
|
|
The daemon will try to find the answer to the questions "what are the
|
|
addresses for host <systemitem class="systemname">foo.example.com</systemitem>?" and "what are
|
|
the names for IPv4 address 204.152.184.79?"</para>
|
|
<para>The daemon currently only looks in the DNS, but in the future
|
|
it may use other sources such as <literal>/etc/hosts</literal>,
|
|
NIS, etc.</para>
|
|
<para>The <command>lwresd</command> daemon is essentially a stripped-down,
|
|
caching-only name server that answers requests using the lightweight
|
|
resolver protocol rather than the DNS protocol. Because it needs
|
|
to run on each host, it is designed to require no or minimal configuration.
|
|
It uses the name servers listed on <command>nameserver</command> lines
|
|
in <filename>/etc/resolv.conf</filename> as forwarders, but is also
|
|
capable of doing the resolution autonomously if none are specified.</para></sect1></chapter>
|
|
|
|
<chapter id="ch06"><title><acronym>BIND</acronym> 9 Configuration Reference</title>
|
|
<para><acronym>BIND</acronym> 9 configuration is broadly similar to <acronym>BIND</acronym> 8.x; however,
|
|
there are a few new areas of configuration, such as views. <acronym>BIND</acronym>
|
|
8.x configuration files should work with few alterations in <acronym>BIND</acronym>
|
|
9, although more complex configurations should be reviewed to check
|
|
if they can be more efficiently implemented using the new features
|
|
found in <acronym>BIND</acronym> 9.</para>
|
|
<para><acronym>BIND</acronym> 4 configuration files can be converted to the new format
|
|
using the shell script
|
|
<filename>contrib/named-bootconf/named-bootconf.sh</filename>.</para>
|
|
<sect1 id="configuration_file_elements"><title>Configuration File Elements</title>
|
|
<para>Following is a list of elements used throughout the <acronym>BIND</acronym> configuration
|
|
file documentation:</para>
|
|
<informaltable colsep = "0" rowsep = "0"><tgroup cols = "2"
|
|
colsep = "0" rowsep = "0" tgroupstyle = "2Level-table">
|
|
<colspec colname = "1" colnum = "1" colsep = "0" colwidth = "1.855in"/>
|
|
<colspec colname = "2" colnum = "2" colsep = "0" colwidth = "3.770in"/>
|
|
<tbody>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><varname>acl_name</varname></para></entry>
|
|
<entry colname = "2"><para>The name of an <varname>address_match_list</varname> as
|
|
defined by the <command>acl</command> statement.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><varname>address_match_list</varname></para></entry>
|
|
<entry colname = "2"><para>A list of one or more <varname>ip_addr</varname><command>, </command><varname>ip_prefix</varname><command>, </command><varname>key_id</varname><command>, </command>or <varname>acl_name</varname> elements, see
|
|
<xref linkend="address_match_lists"/>.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><varname>domain_name</varname></para></entry>
|
|
<entry colname = "2"><para>A quoted string which will be used as
|
|
a DNS name, for example "<systemitem class="systemname">my.test.domain</systemitem>".</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><varname>dotted_decimal</varname></para></entry>
|
|
<entry colname = "2"><para>One or more integers valued 0 through
|
|
255 separated only by dots (`.'), such as <command>123</command>, <command>45.67</command> or <command>89.123.45.67</command>.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><varname>ip4_addr</varname></para></entry>
|
|
<entry colname = "2"><para>An IPv4 address with exactly four elements
|
|
in <varname>dotted_decimal</varname> notation.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><varname>ip6_addr</varname></para></entry>
|
|
<entry colname = "2"><para>An IPv6 address, such as <command>fe80::200:f8ff:fe01:9742</command>.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><varname>ip_addr</varname></para></entry>
|
|
<entry colname = "2"><para>An <varname>ip4_addr</varname> or<command> </command><varname>ip6_addr</varname>.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><varname>ip_port</varname></para></entry>
|
|
<entry colname = "2"><para>An IP port <varname>number</varname>.
|
|
<varname>number</varname> is limited to 0 through 65535, with values
|
|
below 1024 typically restricted to root-owned processes. In some
|
|
cases an asterisk (`*') character can be used as a placeholder to
|
|
select a random high-numbered port.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><varname>ip_prefix</varname></para></entry>
|
|
<entry colname = "2"><para>An IP network specified as an <varname>ip_addr</varname>,
|
|
followed by a slash (`/') and then the number of bits in the netmask.
|
|
Trailing zeros in a <varname>ip_addr</varname> may omitted.
|
|
For example, <command>127/8</command> is the network <command>127.0.0.0</command> with
|
|
netmask <command>255.0.0.0</command> and <command>1.2.3.0/28</command> is
|
|
network <command>1.2.3.0</command> with netmask <command>255.255.255.240</command>.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><varname>key_id</varname></para></entry>
|
|
<entry colname = "2"><para>A <varname>domain_name</varname> representing
|
|
the name of a shared key, to be used for transaction security.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><varname>key_list</varname></para></entry>
|
|
<entry colname = "2"><para>A list of one or more <varname>key_id</varname>s,
|
|
separated by semicolons and ending with a semicolon.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><varname>number</varname></para></entry>
|
|
<entry colname = "2"><para>A non-negative integer with an entire
|
|
range limited by the range of a C language signed integer (2,147,483,647
|
|
on a machine with 32 bit integers). Its acceptable value might further
|
|
be limited by the context in which it is used.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><varname>path_name</varname></para></entry>
|
|
<entry colname = "2"><para>A quoted string which will be used as
|
|
a pathname, such as <filename>zones/master/my.test.domain</filename>.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><varname>size_spec</varname></para></entry>
|
|
<entry colname = "2"><para>A number, the word <userinput>unlimited</userinput>,
|
|
or the word <userinput>default</userinput>.</para><para>The maximum
|
|
value of <varname>size_spec</varname> is that of unsigned long integers
|
|
on the machine. An <varname>unlimited</varname> <varname>size_spec</varname> requests unlimited
|
|
use, or the maximum available amount. A <varname>default size_spec</varname> uses
|
|
the limit that was in force when the server was started.</para><para>A <varname>number</varname> can
|
|
optionally be followed by a scaling factor: <userinput>K</userinput> or <userinput>k</userinput><command> </command>for
|
|
kilobytes, <userinput>M</userinput> or <userinput>m</userinput> for
|
|
megabytes, and <userinput>G</userinput> or <userinput>g</userinput> for gigabytes,
|
|
which scale by 1024, 1024*1024, and 1024*1024*1024 respectively.</para><para>Integer
|
|
storage overflow is currently silently ignored during conversion
|
|
of scaled values, resulting in values less than intended, possibly
|
|
even negative. Using <varname>unlimited</varname> is the best way
|
|
to safely set a really large number.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><varname>yes_or_no</varname></para></entry>
|
|
<entry colname = "2"><para>Either <userinput>yes</userinput> or <userinput>no</userinput>.
|
|
The words <userinput>true</userinput> and <userinput>false</userinput> are
|
|
also accepted, as are the numbers <userinput>1</userinput> and <userinput>0</userinput>.</para></entry>
|
|
</row>
|
|
</tbody>
|
|
</tgroup></informaltable>
|
|
<sect2 id="address_match_lists"><title>Address Match Lists</title>
|
|
<sect3><title>Syntax</title>
|
|
<programlisting><varname>address_match_list</varname> = address_match_list_element ;
|
|
<optional> address_match_list_element; ... </optional>
|
|
<varname>address_match_list_element</varname> = <optional> ! </optional> (ip_address <optional>/length</optional> |
|
|
key key_id | acl_name | { address_match_list } )
|
|
</programlisting>
|
|
</sect3>
|
|
<sect3><title>Definition and Usage</title>
|
|
<para>Address match lists are primarily used to determine access
|
|
control for various server operations. They are also used to define
|
|
priorities for querying other nameservers and to set the addresses
|
|
on which <command>named</command> will listen for queries. The elements
|
|
which constitute an address match list can be any of the following:</para>
|
|
<itemizedlist><listitem>
|
|
<simpara>an IP address (IPv4 or IPv6)</simpara></listitem>
|
|
<listitem>
|
|
<simpara>an IP prefix (in the `/'-notation)</simpara></listitem>
|
|
<listitem>
|
|
<simpara>a key ID, as defined by the key statement</simpara></listitem>
|
|
<listitem>
|
|
<simpara>the name of an address match list previously defined with
|
|
the <command>acl</command> statement</simpara></listitem>
|
|
<listitem>
|
|
<simpara>a nested address match list enclosed in braces</simpara></listitem></itemizedlist>
|
|
<para>Elements can be negated with a leading exclamation mark (`!')
|
|
and the match list names "any," "none," "localhost" and "localnets"
|
|
are predefined. More information on those names can be found in
|
|
the description of the acl statement.</para>
|
|
<para>The addition of the key clause made the name of this syntactic
|
|
element something of a misnomer, since security keys can be used
|
|
to validate access without regard to a host or network address. Nonetheless,
|
|
the term "address match list" is still used throughout the documentation.</para>
|
|
<para>When a given IP address or prefix is compared to an address
|
|
match list, the list is traversed in order until an element matches.
|
|
The interpretation of a match depends on whether the list is being used
|
|
for access control, defining listen-on ports, or as a topology,
|
|
and whether the element was negated.</para>
|
|
<para>When used as an access control list, a non-negated match allows
|
|
access and a negated match denies access. If there is no match,
|
|
access is denied. The clauses <command>allow-query</command>, <command>allow-transfer</command>, <command>allow-update</command> and <command>blackhole</command> all
|
|
use address match lists this. Similarly, the listen-on option will cause
|
|
the server to not accept queries on any of the machine's addresses
|
|
which do not match the list.</para>
|
|
<para>When used with the topology clause, a non-negated match returns
|
|
a distance based on its position on the list (the closer the match
|
|
is to the start of the list, the shorter the distance is between
|
|
it and the server). A negated match will be assigned the maximum
|
|
distance from the server. If there is no match, the address will
|
|
get a distance which is further than any non-negated list element,
|
|
and closer than any negated element.</para>
|
|
<para>Because of the first-match aspect of the algorithm, an element
|
|
that defines a subset of another element in the list should come
|
|
before the broader element, regardless of whether either is negated. For
|
|
example, in
|
|
<command>1.2.3/24; ! 1.2.3.13;</command> the 1.2.3.13 element is
|
|
completely useless because the algorithm will match any lookup for
|
|
1.2.3.13 to the 1.2.3/24 element. Using <command>! 1.2.3.13; 1.2.3/24</command> fixes
|
|
that problem by having 1.2.3.13 blocked by the negation but all
|
|
other 1.2.3.* hosts fall through.</para></sect3></sect2>
|
|
<sect2>
|
|
<title>Comment Syntax</title>
|
|
|
|
<para>The <acronym>BIND</acronym> 9 comment syntax allows for comments to appear
|
|
anywhere that white space may appear in a <acronym>BIND</acronym> configuration
|
|
file. To appeal to programmers of all kinds, they can be written
|
|
in C, C++, or shell/perl constructs.</para>
|
|
|
|
<sect3>
|
|
<title>Syntax</title>
|
|
|
|
<para><programlisting>/* This is a <acronym>BIND</acronym> comment as in C */</programlisting>
|
|
<programlisting>// This is a <acronym>BIND</acronym> comment as in C++</programlisting>
|
|
<programlisting># This is a <acronym>BIND</acronym> comment as in common UNIX shells and perl</programlisting>
|
|
</para>
|
|
</sect3>
|
|
<sect3>
|
|
<title>Definition and Usage</title>
|
|
<para>Comments may appear anywhere that whitespace may appear in
|
|
a <acronym>BIND</acronym> configuration file.</para>
|
|
<para>C-style comments start with the two characters /* (slash,
|
|
star) and end with */ (star, slash). Because they are completely
|
|
delimited with these characters, they can be used to comment only
|
|
a portion of a line or to span multiple lines.</para>
|
|
<para>C-style comments cannot be nested. For example, the following
|
|
is not valid because the entire comment ends with the first */:</para>
|
|
<para><programlisting>/* This is the start of a comment.
|
|
This is still part of the comment.
|
|
/* This is an incorrect attempt at nesting a comment. */
|
|
This is no longer in any comment. */
|
|
</programlisting></para>
|
|
|
|
<para>C++-style comments start with the two characters // (slash,
|
|
slash) and continue to the end of the physical line. They cannot
|
|
be continued across multiple physical lines; to have one logical
|
|
comment span multiple lines, each line must use the // pair.</para>
|
|
<para>For example:</para>
|
|
<para><programlisting>// This is the start of a comment. The next line
|
|
// is a new comment, even though it is logically
|
|
// part of the previous comment.
|
|
</programlisting></para>
|
|
<para>Shell-style (or perl-style, if you prefer) comments start
|
|
with the character <literal>#</literal> (number sign) and continue to the end of the
|
|
physical line, as in C++ comments.</para>
|
|
<para>For example:</para>
|
|
<para><programlisting># This is the start of a comment. The next line
|
|
# is a new comment, even though it is logically
|
|
# part of the previous comment.
|
|
</programlisting></para>
|
|
<warning>
|
|
<para>WARNING: you cannot use the semicolon (`;') character
|
|
to start a comment such as you would in a zone file. The
|
|
semicolon indicates the end of a configuration
|
|
statement.</para>
|
|
</warning>
|
|
</sect3>
|
|
</sect2>
|
|
</sect1>
|
|
<sect1 id="Configuration_File_Grammar">
|
|
<title>Configuration File Grammar</title>
|
|
|
|
<para>A <acronym>BIND</acronym> 9 configuration consists of statements and comments.
|
|
Statements end with a semicolon. Statements and comments are the
|
|
only elements that can appear without enclosing braces. Many
|
|
statements contain a block of substatements, which are also
|
|
terminated with a semicolon.</para>
|
|
|
|
<para>The following statements are supported:</para>
|
|
|
|
<informaltable colsep = "0" rowsep = "0">
|
|
<tgroup cols = "2" colsep = "0" rowsep = "0" tgroupstyle =
|
|
"2Level-table">
|
|
<colspec colname = "1" colnum = "1" colsep = "0" colwidth = "1.336in"/>
|
|
<colspec colname = "2" colnum = "2" colsep = "0" colwidth = "3.778in"/>
|
|
<tbody>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>acl</command></para></entry>
|
|
<entry colname = "2"><para>defines a named IP address
|
|
matching list, for access control and other uses.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>controls</command></para></entry>
|
|
<entry colname = "2"><para>declares control channels to be used
|
|
by the <command>rndc</command> utility.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>include</command></para></entry>
|
|
<entry colname = "2"><para>includes a file.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>key</command></para></entry>
|
|
<entry colname = "2"><para>specifies key information for use in
|
|
authentication and authorization using TSIG.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>logging</command></para></entry>
|
|
<entry colname = "2"><para>specifies what the server logs, and where
|
|
the log messages are sent.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>options</command></para></entry>
|
|
<entry colname = "2"><para>controls global server configuration
|
|
options and sets defaults for other statements.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>server</command></para></entry>
|
|
<entry colname = "2"><para>sets certain configuration options on
|
|
a per-server basis.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>trusted-keys</command></para></entry>
|
|
<entry colname = "2"><para>defines trusted DNSSEC keys.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>view</command></para></entry>
|
|
<entry colname = "2"><para>defines a view.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>zone</command></para></entry>
|
|
<entry colname = "2"><para>defines a zone.</para></entry>
|
|
</row>
|
|
</tbody>
|
|
</tgroup></informaltable>
|
|
|
|
<para>The <command>logging</command> and
|
|
<command>options</command> statements may only occur once per
|
|
configuration.</para>
|
|
|
|
<sect2>
|
|
<title><command>acl</command> Statement Grammar</title>
|
|
|
|
<programlisting><command>acl</command> acl-name {
|
|
address_match_list
|
|
};
|
|
</programlisting>
|
|
</sect2>
|
|
<sect2 id="acl">
|
|
<title><command>acl</command> Statement Definition and
|
|
Usage</title>
|
|
|
|
<para>The <command>acl</command> statement assigns a symbolic
|
|
name to an address match list. It gets its name from a primary
|
|
use of address match lists: Access Control Lists (ACLs).</para>
|
|
|
|
<para>Note that an address match list's name must be defined
|
|
with <command>acl</command> before it can be used elsewhere; no
|
|
forward references are allowed.</para>
|
|
|
|
<para>The following ACLs are built-in:</para>
|
|
|
|
<informaltable colsep = "0" rowsep = "0"><tgroup cols = "2"
|
|
colsep = "0" rowsep = "0" tgroupstyle = "3Level-table">
|
|
<colspec colname = "1" colnum = "1" colsep = "0" colwidth = "1.130in"/>
|
|
<colspec colname = "2" colnum = "2" colsep = "0" colwidth = "4.000in"/>
|
|
<tbody>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>any</command></para></entry>
|
|
<entry colname = "2"><para>Matches all hosts.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>none</command></para></entry>
|
|
<entry colname = "2"><para>Matches no hosts.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>localhost</command></para></entry>
|
|
<entry colname = "2"><para>Matches the IP addresses of all interfaces
|
|
on the system.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>localnets</command></para></entry>
|
|
<entry colname = "2"><para>Matches any host on a network for which
|
|
the system has an interface.</para></entry>
|
|
</row>
|
|
</tbody>
|
|
</tgroup></informaltable>
|
|
</sect2>
|
|
<sect2>
|
|
<title><command>controls</command> Statement Grammar</title>
|
|
<programlisting><command>controls</command> {
|
|
inet ( ip_addr | * ) <optional> port ip_port </optional> allow <replaceable> address_match_list </replaceable>
|
|
keys <replaceable> key_list </replaceable>;
|
|
<optional> inet ...; </optional>
|
|
};
|
|
</programlisting>
|
|
</sect2>
|
|
<sect2>
|
|
<title><command>controls</command> Statement Definition and
|
|
Usage</title>
|
|
|
|
<para>The <command>controls</command> statement declares control
|
|
channels to be used by system administrators to affect the
|
|
operation of the local nameserver. These control channels are
|
|
used by the <command>rndc</command> utility to send commands to
|
|
and retrieve non-DNS results from a nameserver.</para>
|
|
|
|
<para>An <command>inet</command> control channel is a TCP/IP
|
|
socket accessible to the Internet, created at the specified
|
|
<command>ip_port</command> on the specified
|
|
<command>ip_addr</command>. If no port is specified, port 953
|
|
is used by default. "*" cannot be used for
|
|
<command>ip_port</command>.</para>
|
|
|
|
<para>The ability to issue commands over the control channel is
|
|
restricted by the <command>allow</command> and
|
|
<command>keys</command> clauses. Connections to the control
|
|
channel are permitted based on the address permissions in
|
|
<command>address_match_list</command>. <command>key_id</command>
|
|
members of the <command>address_match_list</command> are
|
|
ignored, and instead are interpreted independently based the
|
|
<command>key_list</command>. Each <command>key_id</command> in
|
|
the <command>key_list</command> is allowed to be used to
|
|
authenticate commands and responses given over the control
|
|
channel by digitally signing each message between the server and
|
|
a command client (See <xref linkend="rndc"/> in <xref
|
|
linkend="admin_tools"/>). All commands to the
|
|
control channel must be signed by one of its specified keys to
|
|
be honored.</para>
|
|
|
|
<para> For the initial release of <acronym>BIND</acronym> 9.0.0, only one command
|
|
is possible over the command channel, the command to reload the
|
|
server. We will expand command set in future releases.</para>
|
|
|
|
<para>The UNIX control channel type of <acronym>BIND</acronym> 8 is not supported
|
|
in <acronym>BIND</acronym> 9.0.0, and is not expected to be added in future
|
|
releases. If it is present in the controls statement from a
|
|
<acronym>BIND</acronym> 8 configuration file, a non-fatal warning will be
|
|
logged.</para>
|
|
|
|
</sect2>
|
|
<sect2>
|
|
<title><command>include</command> Statement Grammar</title>
|
|
<programlisting>include <replaceable>filename</replaceable>;</programlisting>
|
|
</sect2>
|
|
<sect2>
|
|
<title><command>include</command> Statement Definition and
|
|
Usage</title>
|
|
|
|
<para>The <command>include</command> statement inserts the
|
|
specified file at the point that the <command>include</command>
|
|
statement is encountered. The <command>include</command>
|
|
statement facilitates the administration of configuration files
|
|
by permitting the reading or writing of some things but not
|
|
others. For example, the statement could include private keys
|
|
that are readable only by a nameserver.</para>
|
|
|
|
</sect2>
|
|
<sect2>
|
|
<title><command>key</command> Statement Grammar</title>
|
|
<programlisting>key <replaceable>key_id</replaceable> {
|
|
algorithm <replaceable>string</replaceable>;
|
|
secret <replaceable>string</replaceable>;
|
|
};
|
|
</programlisting>
|
|
</sect2>
|
|
<sect2>
|
|
<title><command>key</command> Statement Definition and Usage</title>
|
|
|
|
<para>The <command>key</command> statement defines a shared
|
|
secret key for use with TSIG, see <xref linkend="tsig"/>.</para>
|
|
|
|
<para>The <replaceable>key_id</replaceable>, also known as the
|
|
key name, is a domain name uniquely identifying the key. It can
|
|
be used in a "server" statement to cause requests sent to that
|
|
server to be signed with this key, or in address match lists to
|
|
verify that incoming requests have been signed with a key
|
|
matching this name, algorithm, and secret.</para>
|
|
|
|
<para>The <replaceable>algorithm_id</replaceable> is a string
|
|
that specifies a security/authentication algorithm. The only
|
|
algorithm currently supported with TSIG authentication is
|
|
<literal>hmac-md5</literal>. The
|
|
<replaceable>secret_string</replaceable> is the secret to be
|
|
used by the algorithm, and is treated as a base-64 encoded
|
|
string.</para>
|
|
|
|
</sect2>
|
|
<sect2>
|
|
<title><command>logging</command> Statement Grammar</title>
|
|
<programlisting><command>logging</command> {
|
|
[ <command>channel</command> <replaceable>channel_name</replaceable> {
|
|
( <command>file</command> <replaceable>path name</replaceable>
|
|
[ <command>versions</command> ( <replaceable>number</replaceable> | <literal>unlimited</literal> ) ]
|
|
[ <command>size</command> <replaceable>size spec</replaceable> ]
|
|
| <command>syslog</command> ( <replaceable>syslog_facility</replaceable> )
|
|
| <literal>null</literal> );
|
|
[ <command>severity</command> (<option>critical</option> | <option>error</option> | <option>warning</option> | <option>notice</option> |
|
|
<option>info</option> | <option>debug</option> [ <replaceable>level</replaceable> ] | <option>dynamic</option> ); ]
|
|
[ <command>print-category</command> <option>yes</option> or <option>no</option>; ]
|
|
[ <command>print-severity</command> <option>yes</option> or <option>no</option>; ]
|
|
[ <command>print-time</command> <option>yes</option> or <option>no</option>; ]
|
|
}; ]
|
|
[ <command>category</command> <replaceable>category_name</replaceable> {
|
|
<replaceable>channel_name</replaceable> ; [ <replaceable>channel_nam</replaceable>e ; ... ]
|
|
}; ]
|
|
...
|
|
};
|
|
</programlisting>
|
|
</sect2>
|
|
<sect2><title><command>logging</command> Statement Definition and
|
|
Usage</title>
|
|
<para>The <command>logging</command> statement configures a wide
|
|
variety of logging options for the nameserver. Its <command>channel</command> phrase
|
|
associates output methods, format options and severity levels with
|
|
a name that can then be used with the <command>category</command> phrase
|
|
to select how various classes of messages are logged.</para>
|
|
<para>Only one <command>logging</command> statement is used to define
|
|
as many channels and categories as are wanted. If there is no <command>logging</command> statement,
|
|
the logging configuration will be:</para>
|
|
<programlisting><command>logging</command> {
|
|
category "default" { "default_syslog"; "default_debug"; };
|
|
};
|
|
</programlisting>
|
|
<para>In <acronym>BIND</acronym> 9, the logging configuration is only established when
|
|
the entire configuration file has been parsed. In <acronym>BIND</acronym> 8, it was
|
|
established as soon as the <command>logging</command> statement
|
|
was parsed. When the server is starting up, all logging messages
|
|
regarding syntax errors in the configuration file go to the default
|
|
channels, or to standard error if the "<option>-g</option>" option
|
|
was specified.</para>
|
|
<sect3><title>The <command>channel</command> Phrase</title>
|
|
<para>All log output goes to one or more <emphasis>channels</emphasis>;
|
|
you can make as many of them as you want.</para>
|
|
<para>Every channel definition must include a clause that says whether
|
|
messages selected for the channel go to a file, to a particular
|
|
syslog facility, or are discarded. It can optionally also limit
|
|
the message severity level that will be accepted by the channel
|
|
(the default is <command>info</command>), and whether to include
|
|
a <command>named</command>-generated time stamp, the category name
|
|
and/or severity level (the default is not to include any).</para>
|
|
<para>The word <command>null</command> as the destination option
|
|
for the channel will cause all messages sent to it to be discarded;
|
|
in that case, other options for the channel are meaningless.</para>
|
|
<para>The <command>file</command> clause can include limitations
|
|
both on how large the file is allowed to become, and how many versions
|
|
of the file will be saved each time the file is opened.</para>
|
|
<para>The <command>size</command> option for files is simply a hard
|
|
ceiling on log growth. If the file ever exceeds the size, then <command>named</command> will
|
|
not write anything more to it until the file is reopened; exceeding
|
|
the size does not automatically trigger a reopen. The default behavior
|
|
is not to limit the size of the file.</para>
|
|
<para>If you use the <command>version</command> log file option,
|
|
then <command>named</command> will retain that many backup versions
|
|
of the file by renaming them when opening. For example, if you choose
|
|
to keep 3 old versions of the file <filename>lamers.log</filename> then
|
|
just before it is opened <filename>lamers.log.1</filename> is renamed
|
|
to <filename>lamers.log.2</filename>, <filename>lamers.log.0</filename> is
|
|
renamed to <filename>lamers.log.1</filename>, and <filename>lamers.log</filename> is
|
|
renamed to <filename>lamers.log.0</filename>. No rolled versions
|
|
are kept by default; any existing log file is simply appended. The <command>unlimited</command> keyword
|
|
is synonymous with <command>99</command> in current <acronym>BIND</acronym> releases.</para>
|
|
<para>Example usage of the size and versions options:</para>
|
|
<programlisting>channel "an_example_channel" {
|
|
file "example.log" versions 3 size 20m;
|
|
print-time yes;
|
|
print-category yes;
|
|
};
|
|
</programlisting>
|
|
<para>The argument for the <command>syslog</command> clause is a
|
|
syslog facility as described in the <command>syslog</command> man
|
|
page. How <command>syslog</command> will handle messages sent to
|
|
this facility is described in the <command>syslog.conf</command> man
|
|
page. If you have a system which uses a very old version of <command>syslog</command> that
|
|
only uses two arguments to the <command>openlog()</command> function,
|
|
then this clause is silently ignored.</para>
|
|
<para>The <command>severity</command> clause works like <command>syslog</command>'s
|
|
"priorities," except that they can also be used if you are writing
|
|
straight to a file rather than using <command>syslog</command>.
|
|
Messages which are not at least of the severity level given will
|
|
not be selected for the channel; messages of higher severity levels
|
|
will be accepted.</para>
|
|
<para>If you are using <command>syslog</command>, then the <command>syslog.conf</command> priorities
|
|
will also determine what eventually passes through. For example,
|
|
defining a channel facility and severity as <command>daemon</command> and <command>debug</command> but
|
|
only logging <command>daemon.warning</command> via <command>syslog.conf</command> will
|
|
cause messages of severity <command>info</command> and <command>notice</command> to
|
|
be dropped. If the situation were reversed, with <command>named</command> writing
|
|
messages of only <command>warning</command> or higher, then <command>syslogd</command> would
|
|
print all messages it received from the channel.</para>
|
|
<para>The server can supply extensive debugging information when
|
|
it is in debugging mode. If the server's global debug level is greater
|
|
than zero, then debugging mode will be active. The global debug
|
|
level is set either by starting the <command>named</command> server
|
|
with the <option>-d</option> flag followed by a positive integer,
|
|
or by running <command>rndc trace</command>. <note>
|
|
<simpara>the latter
|
|
method is not yet implemented</simpara></note> The global debug level
|
|
can be set to zero, and debugging mode turned off, by running <command>ndc
|
|
notrace</command>. All debugging messages in the server have a debug
|
|
level, and higher debug levels give more detailed output. Channels
|
|
that specify a specific debug severity, for example:</para>
|
|
<programlisting>channel "specific_debug_level" {
|
|
file "foo";
|
|
severity debug 3;
|
|
};
|
|
</programlisting>
|
|
<para>will get debugging output of level 3 or less any time the
|
|
server is in debugging mode, regardless of the global debugging
|
|
level. Channels with <command>dynamic</command> severity use the
|
|
server's global level to determine what messages to print.</para>
|
|
<para>If <command>print-time</command> has been turned on, then
|
|
the date and time will be logged. <command>print-time</command> may
|
|
be specified for a <command>syslog</command> channel, but is usually
|
|
pointless since <command>syslog</command> also prints the date and
|
|
time. If <command>print-category</command> is requested, then the
|
|
category of the message will be logged as well. Finally, if <command>print-severity</command> is
|
|
on, then the severity level of the message will be logged. The <command>print-</command> options may
|
|
be used in any combination, and will always be printed in the following
|
|
order: time, category, severity. Here is an example where all three <command>print-</command> options
|
|
are on:</para>
|
|
<para><computeroutput>28-Feb-2000 15:05:32.863 general: notice: running</computeroutput></para>
|
|
<para>There are four predefined channels that are used for
|
|
<command>named</command>'s default logging as follows. How they are
|
|
used is described in <xref linkend="the_category_phrase"/>.
|
|
</para>
|
|
<programlisting>channel "default_syslog" {
|
|
syslog daemon; // end to syslog's daemon
|
|
// facility
|
|
severity info; // only send priority info
|
|
// and higher
|
|
};
|
|
channel "default_debug" {
|
|
file "named.run"; // write to named.run in
|
|
// the working directory
|
|
// Note: stderr is used instead
|
|
// of "named.run"
|
|
// if the server is started
|
|
// with the '-f' option.
|
|
severity dynamic // log at the server's
|
|
// current debug level
|
|
};
|
|
channel "default_stderr" { // writes to stderr
|
|
file "<stderr>"; // this is illustrative only;
|
|
// there's currently no way of
|
|
// specifying an internal file
|
|
// descriptor in the
|
|
// configuration language.
|
|
severity info; // only send priority info
|
|
// and higher
|
|
};
|
|
channel "null" {
|
|
null; // toss anything sent to
|
|
// this channel
|
|
};
|
|
</programlisting>
|
|
<para>The <command>default_debug</command> channel normally writes
|
|
to a file <filename>named.run</filename> in the server's working
|
|
directory. For security reasons, when the "<option>-u</option>"
|
|
command line option is used, the <filename>named.run</filename> file
|
|
is created only after <command>named</command> has changed to the
|
|
new UID, and any debug output generated while <command>named</command> is
|
|
starting up and still running as root is discarded. If you need
|
|
to capture this output, you must run the server with the "<option>-g</option>"
|
|
option and redirect standard error to a file.</para>
|
|
<para>Once a channel is defined, it cannot be redefined. Thus you
|
|
cannot alter the built-in channels directly, but you can modify
|
|
the default logging by pointing categories at channels you have defined.</para></sect3>
|
|
<sect3 id="the_category_phrase"><title>The <command>category</command> Phrase</title>
|
|
<para>There are many categories, so you can send the logs you want
|
|
to see wherever you want, without seeing logs you don't want. If
|
|
you don't specify a list of channels for a category, then log messages
|
|
in that category will be sent to the <command>default</command> category
|
|
instead. If you don't specify a default category, the following
|
|
"default default" is used:</para>
|
|
<programlisting>category "default" { "default_syslog"; "default_debug"; };
|
|
</programlisting>
|
|
<para>As an example, let's say you want to log security events to
|
|
a file, but you also want keep the default logging behavior. You'd
|
|
specify the following:</para>
|
|
<programlisting>channel "my_security_channel" {
|
|
file "my_security_file";
|
|
severity info;
|
|
};
|
|
category "security" {
|
|
"my_security_channel";
|
|
"default_syslog";
|
|
"default_debug";
|
|
};</programlisting>
|
|
<para>To discard all messages in a category, specify the <command>null</command> channel:</para>
|
|
<programlisting>category "xfer-out" { "null"; };
|
|
category "notify" { "null"; };
|
|
</programlisting>
|
|
<para>Following are the available categories and brief descriptions
|
|
of the types of log information they contain. More
|
|
categories may be added in future <acronym>BIND</acronym> releases.</para>
|
|
<informaltable
|
|
colsep = "0" rowsep = "0"><tgroup cols = "2"
|
|
colsep = "0" rowsep = "0" tgroupstyle = "4Level-table">
|
|
<colspec colname = "1" colnum = "1" colsep = "0" colwidth = "1.150in"/>
|
|
<colspec colname = "2" colnum = "2" colsep = "0" colwidth = "3.350in"/>
|
|
<tbody>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>default</command></para></entry>
|
|
<entry colname = "2"><para>The default category defines the logging
|
|
options for those categories where no specific configuration has been
|
|
defined.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>general</command></para></entry>
|
|
<entry colname = "2"><para>The catch-all. Many things still aren't
|
|
classified into categories, and they all end up here.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>database</command></para></entry>
|
|
<entry colname = "2"><para>Messages relating to the databases used
|
|
internally by the name server to store zone and cache data.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>security</command></para></entry>
|
|
<entry colname = "2"><para>Approval and denial of requests.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>config</command></para></entry>
|
|
<entry colname = "2"><para>Configuration file parsing and processing.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>resolver</command></para></entry>
|
|
<entry colname = "2"><para>DNS resolution, such as the recursive
|
|
lookups performed on behalf of clients by a caching name server.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>xfer-in</command></para></entry>
|
|
<entry colname = "2"><para>Zone transfers the server is receiving.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>xfer-out</command></para></entry>
|
|
<entry colname = "2"><para>Zone transfers the server is sending.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>notify</command></para></entry>
|
|
<entry colname = "2"><para>The NOTIFY protocol.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>client</command></para></entry>
|
|
<entry colname = "2"><para>Processing of client requests.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>network</command></para></entry>
|
|
<entry colname = "2"><para>Network operations.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>update</command></para></entry>
|
|
<entry colname = "2"><para>Dynamic updates.</para></entry>
|
|
</row>
|
|
</tbody>
|
|
</tgroup></informaltable>
|
|
</sect3>
|
|
</sect2>
|
|
<sect2>
|
|
<title><command>options</command> Statement Grammar</title>
|
|
|
|
<para>This is the grammar of the <command>options</command>
|
|
statement in the <filename>named.conf</filename> file:</para>
|
|
<programlisting><command>options</command> {
|
|
<optional> version <replaceable>version_string</replaceable>; </optional>
|
|
<optional> directory <replaceable>path_name</replaceable>; </optional>
|
|
<optional> named-xfer <replaceable>path_name</replaceable>; </optional>
|
|
<optional> tkey-domain <replaceable>domainname</replaceable>; </optional>
|
|
<optional> tkey-dhkey <replaceable>key_name</replaceable> <replaceable>key_tag</replaceable>; </optional>
|
|
<optional> dump-file <replaceable>path_name</replaceable>; </optional>
|
|
<optional> memstatistics-file <replaceable>path_name</replaceable>; </optional>
|
|
<optional> pid-file <replaceable>path_name</replaceable>; </optional>
|
|
<optional> statistics-file <replaceable>path_name</replaceable>; </optional>
|
|
<optional> auth-nxdomain <replaceable>yes_or_no</replaceable>; </optional>
|
|
<optional> deallocate-on-exit <replaceable>yes_or_no</replaceable>; </optional>
|
|
<optional> dialup <replaceable>yes_or_no</replaceable>; </optional>
|
|
<optional> fake-iquery <replaceable>yes_or_no</replaceable>; </optional>
|
|
<optional> fetch-glue <replaceable>yes_or_no</replaceable>; </optional>
|
|
<optional> has-old-clients <replaceable>yes_or_no</replaceable>; </optional>
|
|
<optional> host-statistics <replaceable>yes_or_no</replaceable>; </optional>
|
|
<optional> multiple-cnames <replaceable>yes_or_no</replaceable>; </optional>
|
|
<optional> notify <replaceable>yes_or_no</replaceable>; </optional>
|
|
<optional> recursion <replaceable>yes_or_no</replaceable>; </optional>
|
|
<optional> rfc2308-type1 <replaceable>yes_or_no</replaceable>; </optional>
|
|
<optional> use-id-pool <replaceable>yes_or_no</replaceable>; </optional>
|
|
<optional> maintain-ixfr-base <replaceable>yes_or_no</replaceable>; </optional>
|
|
<optional> forward ( <replaceable>only</replaceable> | <replaceable>first</replaceable> ); </optional>
|
|
<optional> forwarders { <optional> <replaceable>in_addr</replaceable> ; <optional> <replaceable>in_addr</replaceable> ; ... </optional> </optional> }; </optional>
|
|
<optional> check-names ( <replaceable>master</replaceable> | <replaceable>slave</replaceable> | <replaceable> response</replaceable> )( <replaceable>warn</replaceable> | <replaceable>fail</replaceable> | <replaceable>ignore</replaceable> ); </optional>
|
|
<optional> allow-query { <replaceable>address_match_list</replaceable> }; </optional>
|
|
<optional> allow-transfer { <replaceable>address_match_list</replaceable> }; </optional>
|
|
<optional> allow-recursion { <replaceable>address_match_list</replaceable> }; </optional>
|
|
<optional> blackhole { <replaceable>address_match_list</replaceable> }; </optional>
|
|
<optional> listen-on <optional> port <replaceable>ip_port</replaceable> </optional> { <replaceable>address_match_list</replaceable> }; </optional>
|
|
<optional> listen-on-v6 <optional> port <replaceable>ip_port</replaceable> </optional> { <replaceable>address_match_list</replaceable> }; </optional>
|
|
<optional> query-source <optional> address ( <replaceable>ip_addr</replaceable> | <replaceable>*</replaceable> ) </optional> <optional> port ( <replaceable>ip_port</replaceable> | <replaceable>*</replaceable> ) </optional>; </optional>
|
|
<optional> max-transfer-time-in <replaceable>number</replaceable>; </optional>
|
|
<optional> max-transfer-time-out <replaceable>number</replaceable>; </optional>
|
|
<optional> max-transfer-idle-in <replaceable>number</replaceable>; </optional>
|
|
<optional> max-transfer-idle-out <replaceable>number</replaceable>; </optional>
|
|
<optional> tcp-clients <replaceable>number</replaceable>; </optional>
|
|
<optional> recursive-clients <replaceable>number</replaceable>; </optional>
|
|
<optional> serial-queries <replaceable>number</replaceable>; </optional>
|
|
<optional> transfer-format <replaceable>( one-answer | many-answers )</replaceable>; </optional>
|
|
<optional> transfers-in <replaceable>number</replaceable>; </optional>
|
|
<optional> transfers-out <replaceable>number</replaceable>; </optional>
|
|
<optional> transfers-per-ns <replaceable>number</replaceable>; </optional>
|
|
<optional> transfer-source <replaceable>ip4_addr</replaceable>; </optional>
|
|
<optional> transfer-source-v6 <replaceable>ip6_addr</replaceable>; </optional>
|
|
<optional> also-notify { <replaceable>ip_addr</replaceable>; <optional> <replaceable>ip_addr</replaceable>; ... </optional> }; </optional>
|
|
<optional> max-ixfr-log-size <replaceable>number</replaceable>; </optional>
|
|
<optional> coresize <replaceable>size_spec</replaceable> ; </optional>
|
|
<optional> datasize <replaceable>size_spec</replaceable> ; </optional>
|
|
<optional> files <replaceable>size_spec</replaceable> ; </optional>
|
|
<optional> stacksize <replaceable>size_spec</replaceable> ; </optional>
|
|
<optional> cleaning-interval <replaceable>number</replaceable>; </optional>
|
|
<optional> heartbeat-interval <replaceable>number</replaceable>; </optional>
|
|
<optional> interface-interval <replaceable>number</replaceable>; </optional>
|
|
<optional> statistics-interval <replaceable>number</replaceable>; </optional>
|
|
<optional> topology <optional>{ <replaceable>address_match_list</replaceable> }</optional>; </optional>
|
|
<optional> sortlist <optional>{ <replaceable>address_match_list</replaceable> }</optional>; </optional>
|
|
<optional> rrset-order <optional>{ <replaceable>order_spec</replaceable> ; <optional> <replaceable>order_spec</replaceable> ; ... </optional> </optional> }</optional>;
|
|
<optional> lame-ttl <replaceable>number</replaceable>; </optional>
|
|
<optional> max-ncache-ttl <replaceable>number</replaceable>; </optional>
|
|
<optional> max-cache-ttl <replaceable>number</replaceable>; </optional>
|
|
<optional> sig-validity-interval <replaceable>number</replaceable> ; </optional>
|
|
<optional> min-roots <replaceable>number</replaceable>; </optional>
|
|
<optional> use-ixfr <replaceable>yes_or_no</replaceable> ; </optional>
|
|
<optional> treat-cr-as-space <replaceable>yes_or_no</replaceable> ; </optional>
|
|
<optional> min-refresh-time <replaceable>number</replaceable> ; </optional>
|
|
<optional> max-refresh-time <replaceable>number</replaceable> ; </optional>
|
|
<optional> min-retry-time <replaceable>number</replaceable> ; </optional>
|
|
<optional> max-retry-time <replaceable>number</replaceable> ; </optional>
|
|
};
|
|
</programlisting>
|
|
</sect2>
|
|
<sect2><title><command>options</command> Statement Definition and
|
|
Usage</title>
|
|
<para>The <command>options</command> statement sets up global options
|
|
to be used by <acronym>BIND</acronym>. This statement may appear only once in a configuration
|
|
file. If more than one occurrence is found, the first occurrence
|
|
determines the actual options used, and a warning will be generated.
|
|
If there is no <command>options</command> statement, an options
|
|
block with each option set to its default will be used.<informaltable
|
|
colsep = "0" rowsep = "0"><tgroup cols = "2"
|
|
colsep = "0" rowsep = "0" tgroupstyle = "3Level-table">
|
|
<colspec colname = "1" colnum = "1" colsep = "0" colwidth = "1.591in"/>
|
|
<colspec colname = "2" colnum = "2" colsep = "0" colwidth = "3.159in"/>
|
|
<tbody>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>version</command></para></entry>
|
|
<entry colname = "2"><para>The version the server should report
|
|
via a query of name <filename>version.bind</filename> in class <command>chaos</command>.
|
|
The default is the real version number of this server.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>directory</command></para></entry>
|
|
<entry colname = "2"><para>The working directory of the server.
|
|
Any non-absolute pathnames in the configuration file will be taken
|
|
as relative to this directory. The default location for most server
|
|
output files (e.g. <filename>named.run</filename>) is this directory.
|
|
If a directory is not specified, the working directory defaults
|
|
to `<filename>.</filename>', the directory from which the server
|
|
was started. The directory specified should be an absolute path.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>named-xfer</command></para></entry>
|
|
<entry colname = "2"><para>
|
|
<emphasis>This option is obsolete.</emphasis>
|
|
It was used in <acronym>BIND</acronym> 8 to specify the pathname to the <command>named-xfer</command> program.
|
|
In <acronym>BIND</acronym> 9, no separate <command>named-xfer</command> program is
|
|
needed; its functionality is built into the name server.</para>
|
|
</entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>tkey-domain</command></para></entry>
|
|
<entry colname = "2"><para>The domain appended to the names of all
|
|
shared keys generated with <command>TKEY</command>. When a client
|
|
requests a <command>TKEY</command> exchange, it may or may not specify
|
|
the desired name for the key. If present, the name of the shared
|
|
key will be "<varname>client specified part</varname>" + "<varname>tkey-domain</varname>".
|
|
Otherwise, the name of the shared key will be "<varname>random hex
|
|
digits</varname>" + "<varname>tkey-domain</varname>". In most cases,
|
|
the <command>domainname</command> should be the server's domain
|
|
name.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>tkey-dhkey</command></para></entry>
|
|
<entry colname = "2"><para>The Diffie-Hellman key used by the server
|
|
to generate shared keys with clients using the Diffie-Hellman mode
|
|
of <command>TKEY</command>. The server must be able to load the
|
|
public and private keys from files in the working directory. In
|
|
most cases, the keyname should be the server's host name.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>dump-file</command></para></entry>
|
|
<entry colname = "2"><para>The pathname of the file the server dumps
|
|
the database to when it receives <command>SIGINT</command> signal
|
|
(<command>ndc dumpdb</command>). If not specified, the default is <filename>named_dump.db</filename>.</para><note>
|
|
<simpara>Not
|
|
yet implemented in <acronym>BIND</acronym> 9.</simpara></note></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>memstatistics-file</command></para></entry>
|
|
<entry colname = "2"><para>The pathname of the file the server writes memory
|
|
usage statistics to on exit. If not specified, the default is <filename>named.memstats</filename>.</para><note>
|
|
<simpara>Not
|
|
yet implemented in <acronym>BIND</acronym> 9.</simpara></note></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>pid-file</command></para></entry>
|
|
<entry colname = "2"><para>The pathname of the file the server writes
|
|
its process ID in. If not specified, the default is operating system
|
|
dependent, but is usually
|
|
<filename>/var/run/named.pid</filename> or <filename>/etc/named.pid</filename>.
|
|
The pid-file is used by programs that want to send signals to the running
|
|
nameserver.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>statistics-file</command></para></entry>
|
|
<entry colname = "2"><para>The pathname of the file the server appends statistics
|
|
to. If not specified, the default is <filename>named.stats</filename>.</para><note>
|
|
<simpara>Not
|
|
yet implemented in <acronym>BIND</acronym> 9.</simpara></note></entry>
|
|
</row>
|
|
</tbody>
|
|
</tgroup></informaltable> </para>
|
|
<sect3 id="boolean_options"><title>Boolean Options</title>
|
|
<informaltable colsep = "0"
|
|
rowsep = "0"><tgroup cols = "2" colsep = "0"
|
|
rowsep = "0" tgroupstyle = "4Level-table">
|
|
<colspec colname = "1" colnum = "1" colsep = "0" colwidth = "1.507in"/>
|
|
<colspec colname = "2" colnum = "2" colsep = "0" colwidth = "2.993in"/>
|
|
<tbody>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>auth-nxdomain</command></para></entry>
|
|
<entry colname = "2"><para>If <userinput>yes</userinput>, then the <command>AA</command> bit
|
|
is always set on NXDOMAIN responses, even if the server is not actually
|
|
authoritative. The default is <userinput>no</userinput>; this is
|
|
a change from <acronym>BIND</acronym> 8. If you are using very old DNS software, you
|
|
may need to set it to <userinput>yes</userinput>.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>deallocate-on-exit</command></para></entry>
|
|
<entry colname = "2"><para>This option was used in <acronym>BIND</acronym> 8 to enable checking
|
|
for memory leaks on exit. <acronym>BIND</acronym> 9 ignores the option and always performs
|
|
the checks.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>dialup</command></para></entry>
|
|
<entry colname = "2"><para>If <userinput>yes</userinput>, then the
|
|
server treats all zones as if they are doing zone transfers across
|
|
a dial on demand dialup link, which can be brought up by traffic
|
|
originating from this server. This has different effects according
|
|
to zone type and concentrates the zone maintenance so that it all
|
|
happens in a short interval, once every <command>heartbeat-interval</command> and
|
|
hopefully during the one call. It also suppresses some of the normal
|
|
zone maintenance traffic. The default is <userinput>no</userinput>.</para><para>The <command>dialup</command> option
|
|
may also be specified in the <command>zone</command> statement,
|
|
in which case it overrides the <command>options dialup </command>statement.</para><para>If
|
|
the zone is a master then the server will send out a NOTIFY request
|
|
to all the slaves. This will trigger the zone serial number check
|
|
in the slave (providing it supports NOTIFY) allowing the slave to
|
|
verify the zone while the connection is active.</para><para>If the
|
|
zone is a slave or stub then the server will suppress the regular
|
|
"zone up to date" queries and only perform them when the
|
|
<command>heartbeat-interval</command> expires.</para><note>
|
|
<simpara>Not yet implemented
|
|
in <acronym>BIND</acronym> 9.</simpara></note></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>fake-iquery</command></para></entry>
|
|
<entry colname = "2"><para>In <acronym>BIND</acronym> 8, this option was used to enable simulating
|
|
the obsolete DNS query type IQUERY. <acronym>BIND</acronym> 9 never does IQUERY simulation.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>fetch-glue</command></para></entry>
|
|
<entry colname = "2"><para>(Information present outside of the authoritative
|
|
nodes in the zone is called <emphasis>glue</emphasis> information).
|
|
If <userinput>yes</userinput> (the default), the server will fetch
|
|
glue resource records it doesn't have when constructing the additional
|
|
data section of a response. <command>fetch-glue </command><userinput>no</userinput><command> </command>can
|
|
be used in conjunction with <command>recursion </command><userinput>no</userinput><command> </command>to
|
|
prevent the server's cache from growing or becoming corrupted (at
|
|
the cost of requiring more work from the client).</para><note>
|
|
<simpara>Not yet
|
|
implemented in <acronym>BIND</acronym> 9.</simpara></note></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>has-old-clients</command></para></entry>
|
|
<entry colname = "2"><para>This option was incorrectly implemented
|
|
in <acronym>BIND</acronym> 8, and is ignored by <acronym>BIND</acronym> 9. To achieve the intended effect
|
|
of
|
|
<command>has-old-clients </command><userinput>yes</userinput>, specify
|
|
the two separate options <command>auth-nxdomain </command><userinput>yes</userinput> and <command>rfc2308-type1 </command><userinput>no</userinput> instead.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>host-statistics</command></para></entry>
|
|
<entry colname = "2"><para>If <userinput>yes</userinput>, then statistics
|
|
are kept for every host that the nameserver interacts with. The
|
|
default is <userinput>no</userinput>.</para><note>
|
|
<simpara>turning on <command>host-statistics</command> can consume
|
|
huge amounts of memory.</simpara></note><note>
|
|
<simpara>Not yet implemented in <acronym>BIND</acronym> 9.</simpara></note></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>maintain-ixfr-base</command></para></entry>
|
|
<entry colname = "2"><para><emphasis>This option is obsolete</emphasis>.
|
|
It was used in <acronym>BIND</acronym> 8 to determine whether a transaction log was
|
|
kept for Incremental Zone Transfer. <acronym>BIND</acronym> 9 maintains a transaction
|
|
log whenever possible. If you need to disable outgoing incremental zone
|
|
transfers, use <command>provide-ixfr </command><userinput>no</userinput>.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>multiple-cnames</command></para></entry>
|
|
<entry colname = "2"><para>This option was used in <acronym>BIND</acronym> 8 to allow
|
|
a domain name to allow multiple CNAME records in violation of the
|
|
DNS standards. <acronym>BIND</acronym> 9 currently does not check for multiple CNAMEs
|
|
in zone data loaded from master files, but such checks may be introduced
|
|
in a later release. <acronym>BIND</acronym> 9 always strictly enforces the CNAME rules
|
|
in dynamic updates.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>notify</command></para></entry>
|
|
<entry colname = "2"><para>If <userinput>yes</userinput> (the default),
|
|
DNS NOTIFY messages are sent when a zone the server is authoritative for
|
|
changes, see <xref linkend="notify"/>.
|
|
The <command>notify</command> option may also be specified in the <command>zone</command> statement,
|
|
in which case it overrides the <command>options notify</command> statement.
|
|
It would only be necessary to turn off this option if it caused slaves
|
|
to crash<varname>.</varname></para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>recursion</command></para></entry>
|
|
<entry colname = "2"><para>If <userinput>yes</userinput>, and a
|
|
DNS query requests recursion, then the server will attempt to do
|
|
all the work required to answer the query. If recursion is off
|
|
and the server does not already know the answer, it will return a
|
|
referral response. The default is <userinput>yes</userinput>.
|
|
Note that setting <command>recursion no;</command> does not prevent
|
|
clients from getting data from the server's cache; it only
|
|
prevents new data from being cached as an effect of client queries.
|
|
Caching may still occur as an effect the server's internal
|
|
operation, such as NOTIFY address lookups.
|
|
See also <command>fetch-glue</command> above.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>rfc2308-type1</command></para></entry>
|
|
<entry colname = "2"><para>Setting this to <userinput>yes</userinput> will
|
|
cause the server to send NS records along with the SOA record for negative
|
|
answers. The default is <userinput>no</userinput>.</para>
|
|
<note>
|
|
<simpara>Not yet implemented in <acronym>BIND</acronym> 9.</simpara></note></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>use-id-pool</command></para></entry>
|
|
<entry colname = "2"><para><emphasis>This option is obsolete</emphasis>.
|
|
<acronym>BIND</acronym> 9 always allocates query IDs from a pool.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>treat-cr-as-space</command></para></entry>
|
|
<entry colname = "2"><para>This option was used in <acronym>BIND</acronym> 8 to make
|
|
the server treat "<command>\r</command>" characters the same way
|
|
as <command><space> </command>" " or "<command>\t</command>",
|
|
to facilitate loading of zone files on a UNIX system that were generated
|
|
on an NT or DOS machine. In <acronym>BIND</acronym> 9, both UNIX "<command>\n</command>"
|
|
and NT/DOS "<command>\r\n</command>" newlines are always accepted,
|
|
and the option is ignored.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1">
|
|
<para><command>min-refresh-time</command></para>
|
|
<para><command>max-refresh-time</command></para>
|
|
<para><command>min-retry-time</command></para>
|
|
<para><command>max-retry-time</command></para>
|
|
</entry>
|
|
<entry colname = "2"><para>
|
|
These options control the server's behavior on refreshing a zone
|
|
(querying for SOA changes) or retrying failed transfers.
|
|
Usually the SOA values for the zone are used, but these values
|
|
are set by the master, giving slave server administrators little
|
|
control over their contents.
|
|
</para><para>
|
|
These options allow the administrator to set a minimum and maximum
|
|
refresh and retry time either per-zone, per-view, or per-server.
|
|
These options are valid for slave and stub zones, and clamp the SOA
|
|
refresh and retry times to the specified values.
|
|
</para>
|
|
<note><para>These options are not yet implemented in <acronym>BIND</acronym> 9.0.</para></note>
|
|
</entry>
|
|
</row>
|
|
|
|
</tbody>
|
|
</tgroup></informaltable></sect3>
|
|
<sect3><title>Forwarding</title>
|
|
<para>The forwarding facility can be used to create a large site-wide
|
|
cache on a few servers, reducing traffic over links to external
|
|
nameservers. It can also be used to allow queries by servers that
|
|
do not have direct access to the Internet, but wish to look up exterior
|
|
names anyway. Forwarding occurs only on those queries for which
|
|
the server is not authoritative and does not have the answer in
|
|
its cache.</para>
|
|
<para><informaltable colsep = "0" rowsep = "0"><tgroup cols = "2"
|
|
colsep = "0" rowsep = "0" tgroupstyle = "4Level-table">
|
|
<colspec colname = "1" colnum = "1" colsep = "0" colwidth = "0.973in"/>
|
|
<colspec colname = "2" colnum = "2" colsep = "0" colwidth = "3.527in"/>
|
|
<tbody>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>forward</command></para></entry>
|
|
<entry colname = "2"><para>This option is only meaningful if the
|
|
forwarders list is not empty. A value of <varname>first</varname>,
|
|
the default, causes the server to query the forwarders first, and
|
|
if that doesn't answer the question the server will then look for
|
|
the answer itself. If <varname>only</varname> is specified, the
|
|
server will only query the forwarders.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>forwarders</command></para></entry>
|
|
<entry colname = "2"><para>Specifies the IP addresses to be used
|
|
for forwarding. The default is the empty list (no forwarding).</para></entry>
|
|
</row>
|
|
</tbody>
|
|
</tgroup></informaltable></para>
|
|
<para>Forwarding can also be configured on a per-domain basis, allowing
|
|
for the global forwarding options to be overridden in a variety
|
|
of ways. You can set particular domains to use different forwarders,
|
|
or have a different <command>forward only/first</command> behavior,
|
|
or not forward at all, see <xref linkend="zone_statement_grammar"/>.</para></sect3>
|
|
<sect3 id="name_checking"><title>Name Checking</title>
|
|
<para>The server can check domain names based upon their expected
|
|
client contexts. For example, a domain name used as a hostname can
|
|
be checked for compliance with the RFCs defining valid hostnames.</para>
|
|
<para>Three checking methods are available:</para>
|
|
<para><informaltable colsep = "0" rowsep = "0"><tgroup cols = "2"
|
|
colsep = "0" rowsep = "0" tgroupstyle = "4Level-table">
|
|
<colspec colname = "1" colnum = "1" colsep = "0" colwidth = "0.797in"/>
|
|
<colspec colname = "2" colnum = "2" colsep = "0" colwidth = "3.703in"/>
|
|
<tbody>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>ignore</command></para></entry>
|
|
<entry colname = "2"><para>No checking is done.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>warn</command></para></entry>
|
|
<entry colname = "2"><para>Names are checked against their expected
|
|
client contexts. Invalid names are logged, but processing continues normally.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>fail</command></para></entry>
|
|
<entry colname = "2"><para>Names are checked against their expected
|
|
client contexts. Invalid names are logged, and the offending data
|
|
is rejected.</para></entry>
|
|
</row>
|
|
</tbody>
|
|
</tgroup></informaltable></para>
|
|
<para>The server can check names in three areas: master zone files,
|
|
slave zone files, and in responses to queries the server has initiated.
|
|
If <command>check-names response fail</command> has been specified,
|
|
and answering the client's question would require sending an invalid
|
|
name to the client, the server will send a REFUSED response code
|
|
to the client.</para>
|
|
<para>The defaults are:</para>
|
|
<programlisting> check-names master fail;
|
|
check-names slave warn;
|
|
check-names response ignore;
|
|
</programlisting>
|
|
<para><command>check-names</command> may also be specified in the <command>zone</command> statement,
|
|
in which case it overrides the <command>options check-names</command> statement.
|
|
When used in a <command>zone</command> statement, the area is not
|
|
specified because it can be deduced from the zone type.</para>
|
|
<note>
|
|
<para>Name checking is not yet implemented in <acronym>BIND</acronym> 9.</para></note></sect3>
|
|
<sect3 id="access_control"><title>Access Control</title>
|
|
<para>Access to the server can be restricted based on the IP address
|
|
of the requesting system. See <xref linkend="address_match_lists"/> for
|
|
details on how to specify IP address lists.</para>
|
|
<para><informaltable colsep = "0" rowsep = "0"><tgroup cols = "2"
|
|
colsep = "0" rowsep = "0" tgroupstyle = "4Level-table">
|
|
<colspec colname = "1" colnum = "1" colsep = "0" colwidth = "1.375in"/>
|
|
<colspec colname = "2" colnum = "2" colsep = "0" colwidth = "3.125in"/>
|
|
<tbody>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>allow-query</command></para></entry>
|
|
<entry colname = "2"><para>Specifies which hosts are allowed to
|
|
ask ordinary questions. <command>allow-query</command> may also
|
|
be specified in the <command>zone</command> statement, in which
|
|
case it overrides the <command>options allow-query</command> statement. If
|
|
not specified, the default is to allow queries from all hosts.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>allow-recursion</command></para></entry>
|
|
<entry colname = "2"><para>Specifies which hosts are allowed to
|
|
make recursive queries through this server. If not specified, the
|
|
default is to allow recursive queries from all hosts.
|
|
Note that disallowing recursive queries for a host does not prevent the
|
|
host from retrieving data that is already in the server's cache.
|
|
</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>allow-transfer</command></para></entry>
|
|
<entry colname = "2"><para>Specifies which hosts are allowed to
|
|
receive zone transfers from the server. <command>allow-transfer</command> may
|
|
also be specified in the <command>zone</command> statement, in which
|
|
case it overrides the <command>options allow-transfer</command> statement.
|
|
If not specified, the default is to allow transfers from all hosts.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>blackhole</command></para></entry>
|
|
<entry colname = "2"><para>Specifies a list of addresses that the
|
|
server will not accept queries from or use to resolve a query. Queries
|
|
from these addresses will not be responded to. The default is <userinput>none</userinput>.</para>
|
|
<note>
|
|
<simpara>Not yet implemented in <acronym>BIND</acronym> 9.</simpara></note></entry>
|
|
</row>
|
|
</tbody>
|
|
</tgroup></informaltable></para></sect3>
|
|
<sect3><title>Interfaces</title>
|
|
<para>The interfaces and ports that the server will answer queries
|
|
from may be specified using the <command>listen-on</command> option. <command>listen-on</command> takes
|
|
an optional port, and an <varname>address_match_list</varname>.
|
|
The server will listen on all interfaces allowed by the address
|
|
match list. If a port is not specified, port 53 will be used.</para>
|
|
<para>Multiple <command>listen-on</command> statements are allowed.
|
|
For example,</para>
|
|
<programlisting>listen-on { 5.6.7.8; };
|
|
listen-on port 1234 { !1.2.3.4; 1.2/16; };
|
|
</programlisting>
|
|
|
|
<para>will enable the nameserver on port 53 for the IP address
|
|
5.6.7.8, and on port 1234 of an address on the machine in net
|
|
1.2 that is not 1.2.3.4.</para>
|
|
|
|
<para>If no <command>listen-on</command> is specified, the
|
|
server will listen on port 53 on all interfaces.</para>
|
|
|
|
<para>The <command>listen-on-v6</command> option is used to
|
|
specify the ports on which the server will listen for incoming
|
|
queries sent using IPv6.</para>
|
|
|
|
<para>The server does not bind a separate socket to each IPv6
|
|
interface address as it does for IPv4. Instead, it always
|
|
listens on the IPv6 wildcard address. Therefore, the only
|
|
values allowed for the <varname>address_match_list</varname>
|
|
argument to the <command>listen-on-v6</command> statement are
|
|
<programlisting>{ any; }</programlisting> and
|
|
<programlisting>{ none;}</programlisting></para>
|
|
|
|
<para>Multiple <command>listen-on-v6</command> options can be
|
|
used to listen on multiple ports:</para>
|
|
|
|
<programlisting>listen-on-v6 port 53 { any; };
|
|
listen-on-v6 port 1234 { any; };
|
|
</programlisting>
|
|
<para>To make the server not listen on any IPv6 address, use</para>
|
|
<programlisting>listen-on-v6 { none; };
|
|
</programlisting>
|
|
<para>If no <command>listen-on-v6 </command>statement is specified,
|
|
the server will not listen on any IPv6 address.</para></sect3>
|
|
<sect3><title>Query Address</title>
|
|
<para>If the server doesn't know the answer to a question, it will
|
|
query other nameservers. <command>query-source</command> specifies
|
|
the address and port used for such queries. For queries sent over
|
|
IPv6, there is a separate <command>query-source-v6</command> option.
|
|
If <command>address</command> is <command>*</command> or is omitted,
|
|
a wildcard IP address (<command>INADDR_ANY</command>) will be used.
|
|
If <command>port</command> is <command>*</command> or is omitted,
|
|
a random unprivileged port will be used. The defaults are</para>
|
|
<programlisting>query-source address * port *;
|
|
query-source-v6 address * port *
|
|
</programlisting>
|
|
<note>
|
|
<para><command>query-source</command> currently applies only
|
|
to UDP queries; TCP queries always use a wildcard IP address and
|
|
a random unprivileged port.</para></note></sect3>
|
|
<sect3 id="zone_transfers"><title>Zone Transfers</title>
|
|
<para><acronym>BIND</acronym> has mechanisms in place to facilitate zone transfers
|
|
and set limits on the amount of load that transfers place on the
|
|
system. The following options apply to zone transfers.</para>
|
|
|
|
<informaltable colsep = "0" rowsep = "0"><tgroup cols = "2"
|
|
colsep = "0" rowsep = "0" tgroupstyle = "4Level-table">
|
|
<colspec colname = "1" colnum = "1" colsep = "0" colwidth = "1.750in"/>
|
|
<colspec colname = "2" colnum = "2" colsep = "0" colwidth = "2.750in"/>
|
|
<tbody>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>also-notify</command></para></entry>
|
|
<entry colname = "2"><para>Defines a global list of IP addresses
|
|
that are also sent NOTIFY messages whenever a fresh copy of the
|
|
zone is loaded. This helps to ensure that copies of the zones will
|
|
quickly converge on stealth servers. If an <command>also-notify</command> list
|
|
is given in a <command>zone</command> statement, it will override
|
|
the <command>options also-notify</command> statement. When a <command>zone notify</command> statement
|
|
is set to <command>no</command>, the IP addresses in the global <command>also-notify</command> list will
|
|
not be sent NOTIFY messages for that zone. The default is the empty
|
|
list (no global notification list).</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>max-transfer-time-in</command></para></entry>
|
|
<entry colname = "2"><para>Inbound zone transfers running longer than
|
|
this many minutes will be terminated. The default is 120 minutes
|
|
(2 hours).</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>max-transfer-idle-in</command></para></entry>
|
|
<entry colname = "2"><para>Inbound zone transfers making no progress
|
|
in this many minutes will be terminated. The default is 60 minutes
|
|
(1 hour).</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>max-transfer-time-out</command></para></entry>
|
|
<entry colname = "2"><para>Outbound zone transfers running longer than
|
|
this many minutes will be terminated. The default is 120 minutes
|
|
(2 hours).</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>max-transfer-idle-out</command></para></entry>
|
|
<entry colname = "2"><para>Outbound zone transfers making no progress
|
|
in this many minutes will be terminated. The default is 60 minutes (1
|
|
hour).</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>serial-queries</command></para></entry>
|
|
<entry colname = "2"><para>Slave servers will periodically query master
|
|
servers to find out if zone serial numbers have changed. Each such
|
|
query uses a minute amount of the slave server's network bandwidth,
|
|
but more importantly each query uses a small amount of memory in
|
|
the slave server while waiting for the master server to respond.
|
|
The <command>serial-queries </command>option sets the maximum number
|
|
of concurrent serial-number queries allowed to be outstanding at
|
|
any given time. The default is 4.</para><note>
|
|
|
|
<simpara>If a server loads a large (tens or
|
|
hundreds of thousands) number of slave zones, then
|
|
this limit should be raised to the high hundreds
|
|
or low thousands, otherwise the slave server may
|
|
never actually become aware of zone changes in the
|
|
master servers. Beware, though, that setting this
|
|
limit arbitrarily high can spend a considerable
|
|
amount of your slave server's network, CPU, and
|
|
memory resources. As with all tunable limits, this
|
|
one should be changed gently and monitored for its
|
|
effects.</simpara>
|
|
|
|
</note>
|
|
<note>
|
|
<simpara>Not yet implemented in <acronym>BIND</acronym> 9.</simpara></note>
|
|
</entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>transfer-format</command></para></entry>
|
|
<entry colname = "2"><para>The server supports two zone transfer methods. <command>one-answer</command> uses
|
|
one DNS message per resource record transferred. <command>many-answers</command> packs
|
|
as many resource records as possible into a message. <command>many-answers</command> is
|
|
more efficient, but is only known to be understood by <acronym>BIND</acronym> 9, <acronym>BIND</acronym>
|
|
8.x and patched versions of <acronym>BIND</acronym> 4.9.5. The default is <command>many-answers</command>. <command>transfer-format</command> may
|
|
be overridden on a per-server basis by using the <command>server</command> statement.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>transfers-in</command></para></entry>
|
|
<entry colname = "2"><para>The maximum number of inbound zone transfers
|
|
that can be running concurrently. The default value is <literal>10</literal>.
|
|
Increasing <command>transfers-in</command> may speed up the convergence
|
|
of slave zones, but it also may increase the load on the local system.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>transfers-out</command></para></entry>
|
|
<entry colname = "2"><para>The maximum number of outbound zone transfers
|
|
that can be running concurrently. Zone transfer requests in excess
|
|
of the limit will be refused. The default value is <literal>10</literal>.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>transfers-per-ns</command></para></entry>
|
|
<entry colname = "2"><para>The maximum number of inbound zone transfers
|
|
that can be concurrently transferring from a given remote nameserver.
|
|
The default value is <literal>2</literal>. Increasing <command>transfers-per-ns</command> may
|
|
speed up the convergence of slave zones, but it also may increase
|
|
the load on the remote nameserver. <command>transfers-per-ns</command> may
|
|
be overridden on a per-server basis by using the <command>transfers</command> phrase
|
|
of the <command>server</command> statement.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>transfer-source</command></para></entry>
|
|
<entry colname = "2"><para><command>transfer-source</command> determines
|
|
which local address will be bound to IPv4 TCP connections used to
|
|
fetch zones transferred inbound by the server. If not set, it defaults
|
|
to a system controlled value which will usually be the address of
|
|
the interface "closest to" the remote end. This address must appear
|
|
in the remote end's <command>allow-transfer</command> option for
|
|
the zone being transferred, if one is specified. This statement
|
|
sets the <command>transfer-source</command> for all zones, but can
|
|
be overridden on a per-zone basis by including a
|
|
<command>transfer-source</command> statement within the <command>zone</command> block
|
|
in the configuration file.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>transfer-source-v6</command></para></entry>
|
|
<entry colname = "2"><para>The same as <command>transfer-source</command>,
|
|
except zone transfers are performed using IPv6.</para></entry>
|
|
</row>
|
|
</tbody>
|
|
</tgroup>
|
|
</informaltable>
|
|
</sect3>
|
|
<sect3>
|
|
<title>Resource Limits</title>
|
|
|
|
<para>The server's usage of many system resources can be
|
|
limited. Some operating systems don't support some of the
|
|
limits. On such systems, a warning will be issued if the
|
|
unsupported limit is used. Some operating systems don't
|
|
support limiting resources.</para> <para>Scaled values are
|
|
allowed when specifying resource limits. For example,
|
|
<command>1G</command> can be used instead of
|
|
<command>1073741824</command> to specify a limit of one
|
|
gigabyte. <command>unlimited</command> requests unlimited use,
|
|
or the maximum available amount. <command>default</command>
|
|
uses the limit that was in force when the server was
|
|
started. See the description of <command>size_spec</command>
|
|
in <xref linkend="configuration_file_elements"/>.</para>
|
|
|
|
<informaltable colsep = "0" rowsep = "0"><tgroup cols = "2"
|
|
colsep = "0" rowsep = "0" tgroupstyle = "4Level-table">
|
|
<colspec colname = "1" colnum = "1" colsep = "0" colwidth = "1.500in"/>
|
|
<colspec colname = "2" colnum = "2" colsep = "0" colwidth = "3.000in"/>
|
|
<tbody>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>coresize</command></para></entry>
|
|
<entry colname = "2"><para>The maximum size of a core dump. The default
|
|
is <literal>default</literal>.</para><note>
|
|
<simpara>Not yet implemented in <acronym>BIND</acronym>
|
|
9.</simpara></note></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>datasize</command></para></entry>
|
|
<entry colname = "2"><para>The maximum amount of data memory the server
|
|
may use. The default is <literal>default</literal>.</para><note>
|
|
<simpara>Not
|
|
yet implemented in <acronym>BIND</acronym> 9.</simpara></note></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>files</command></para></entry>
|
|
<entry colname = "2"><para>The maximum number of files the server
|
|
may have open concurrently. The default is <literal>unlimited</literal>.
|
|
</para><note>
|
|
<simpara>on some operating systems the server cannot set an unlimited
|
|
value and cannot determine the maximum number of open files the
|
|
kernel can support. On such systems, choosing
|
|
<literal>unlimited</literal> will
|
|
cause the server to use the larger of the <command>rlim_max</command> for <command>RLIMIT_NOFILE</command> and
|
|
the value returned by <command>sysconf(_SC_OPEN_MAX)</command>.
|
|
If the actual kernel limit is larger than this value, use <command>limit
|
|
files </command>to specify the limit explicitly.</simpara></note><note><simpara>Not yet
|
|
implemented in <acronym>BIND</acronym> 9.</simpara></note></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>max-ixfr-log-size</command></para></entry>
|
|
<entry colname = "2"><para>The <command>max-ixfr-log-size</command> will
|
|
be used in a future release of the server to limit the size of the
|
|
transaction log kept for Incremental Zone Transfer.</para><note>
|
|
<simpara>Not
|
|
yet implemented in <acronym>BIND</acronym> 9.</simpara></note></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>recursive-clients</command></para></entry>
|
|
<entry colname = "2"><para>The maximum number of simultaneous recursive
|
|
lookups the server will perform on behalf of clients. The default
|
|
is <literal>1000</literal>.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>stacksize</command></para></entry>
|
|
<entry colname = "2"><para>The maximum amount of stack memory the server
|
|
may use. The default is <literal>default</literal>.</para><note>
|
|
<simpara>Not
|
|
yet implemented in <acronym>BIND</acronym> 9.</simpara></note></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>tcp-clients</command></para></entry>
|
|
<entry colname = "2"><para>The maximum number of simultaneous client TCP
|
|
connections that the server will accept. The default is <literal>100</literal>.</para></entry>
|
|
</row>
|
|
</tbody>
|
|
</tgroup></informaltable>
|
|
<note>
|
|
<para>Resource limits are not yet implemented in <acronym>BIND</acronym> 9.</para></note></sect3>
|
|
<sect3><title>Periodic Task Intervals</title>
|
|
<informaltable colsep = "0" rowsep = "0"><tgroup cols = "2"
|
|
colsep = "0" rowsep = "0" tgroupstyle = "4Level-table">
|
|
<colspec colname = "1" colnum = "1" colsep = "0" colwidth = "1.625in"/>
|
|
<colspec colname = "2" colnum = "2" colsep = "0" colwidth = "2.875in"/>
|
|
<tbody>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>cleaning-interval</command></para></entry>
|
|
<entry colname = "2"><para>The server will remove expired resource records
|
|
from the cache every <command>cleaning-interval</command> minutes.
|
|
The default is 60 minutes.
|
|
If set to 0, no periodic cleaning will occur.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>heartbeat-interval</command></para></entry>
|
|
<entry colname = "2"><para>The server will perform zone maintenance tasks
|
|
for all zones marked <command>dialup yes</command> whenever this
|
|
interval expires. The default is 60 minutes. Reasonable values are up
|
|
to 1 day (1440 minutes). If set to 0, no zone maintenance for these zones will occur.</para><note>
|
|
<simpara>Not yet
|
|
implemented in <acronym>BIND</acronym> 9.</simpara></note></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>interface-interval</command></para></entry>
|
|
<entry colname = "2"><para>The server will scan the network interface list
|
|
every <command>interface-interval</command> minutes. The default
|
|
is 60 minutes. If set to 0, interface scanning will only occur when
|
|
the configuration file is loaded. After the scan, listeners will be
|
|
started on any new interfaces (provided they are allowed by the
|
|
<command>listen-on</command> configuration). Listeners on interfaces
|
|
that have gone away will be cleaned up.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>statistics-interval</command></para></entry>
|
|
<entry colname = "2"><para>Nameserver statistics will be logged
|
|
every <command>statistics-interval</command> minutes. The default is
|
|
60. If set to 0, no statistics will be logged.</para><note>
|
|
<simpara>Not yet implemented in <acronym>BIND</acronym>9.</simpara></note></entry>
|
|
</row>
|
|
</tbody>
|
|
</tgroup></informaltable></sect3>
|
|
<sect3 id="topology"><title>Topology</title>
|
|
<para>All other things being equal, when the server chooses a nameserver
|
|
to query from a list of nameservers, it prefers the one that is
|
|
topologically closest to itself. The <command>topology</command> statement
|
|
takes an <command>address_match_list</command> and interprets it
|
|
in a special way. Each top-level list element is assigned a distance.
|
|
Non-negated elements get a distance based on their position in the
|
|
list, where the closer the match is to the start of the list, the
|
|
shorter the distance is between it and the server. A negated match
|
|
will be assigned the maximum distance from the server. If there
|
|
is no match, the address will get a distance which is further than
|
|
any non-negated list element, and closer than any negated element.
|
|
For example,</para>
|
|
<programlisting>topology {
|
|
10/8;
|
|
!1.2.3/24;
|
|
{ 1.2/16; 3/8; };
|
|
};</programlisting>
|
|
<para>will prefer servers on network 10 the most, followed by hosts
|
|
on network 1.2.0.0 (netmask 255.255.0.0) and network 3, with the
|
|
exception of hosts on network 1.2.3 (netmask 255.255.255.0), which
|
|
is preferred least of all.</para>
|
|
<para>The default topology is</para>
|
|
<programlisting> topology { localhost; localnets; };
|
|
</programlisting>
|
|
<note><simpara>The <command>topology</command> option
|
|
is not yet implemented in <acronym>BIND</acronym> 9.</simpara></note>
|
|
</sect3>
|
|
<sect3 id="the_sortlist_statement">
|
|
<title>The <command>sortlist</command> Statement</title>
|
|
<para>Resource Records (RRs) are the data associated with the names
|
|
in a domain name space. The data is maintained in the form of sets
|
|
of RRs. The order of RRs in a set is, by default, not significant.
|
|
Therefore, to control the sorting of records in a set of resource
|
|
records, or <varname>RRset</varname>, you must use the <command>sortlist</command> statement.</para>
|
|
<para>RRs are explained more fully in <xref
|
|
linkend="types_of_resource_records_and_when_to_use_them"/>. Specifications for RRs
|
|
are documented in RFC 1035.</para>
|
|
<para>When returning multiple RRs the nameserver will normally return
|
|
them in <varname>Round Robin</varname><varname> </varname>order,
|
|
that is, after each request the first RR is put at the end of the
|
|
list. The client resolver code should rearrange the RRs as appropriate,
|
|
that is, using any addresses on the local net in preference to other addresses.
|
|
However, not all resolvers can do this or are correctly configured.
|
|
When a client is using a local server the sorting can be performed
|
|
in the server, based on the client's address. This only requires
|
|
configuring the nameservers, not all the clients.</para>
|
|
<para>The <command>sortlist</command> statement (see below) takes
|
|
an <command>address_match_list </command>and interprets it even
|
|
more specifically than the <command>topology</command> statement
|
|
does (<xref linkend="topology"/>). Each top level statement in the <command>sortlist</command> must
|
|
itself be an explicit <command>address_match_list</command> with
|
|
one or two elements. The first element (which may be an IP address,
|
|
an IP prefix, an ACL name or a nested <command>address_match_list</command>)
|
|
of each top level list is checked against the source address of
|
|
the query until a match is found.</para>
|
|
<para>Once the source address of the query has been matched, if
|
|
the top level statement contains only one element, the actual primitive
|
|
element that matched the source address is used to select the address
|
|
in the response to move to the beginning of the response. If the
|
|
statement is a list of two elements, then the second element is
|
|
treated the same as the <command>address_match_list</command> in
|
|
a <command>topology</command> statement. Each top level element
|
|
is assigned a distance and the address in the response with the minimum
|
|
distance is moved to the beginning of the response.</para>
|
|
<para>In the following example, any queries received from any of
|
|
the addresses of the host itself will get responses preferring addresses
|
|
on any of the locally connected networks. Next most preferred are addresses
|
|
on the 192.168.1/24 network, and after that either the 192.168.2/24
|
|
or
|
|
192.168.3/24 network with no preference shown between these two
|
|
networks. Queries received from a host on the 192.168.1/24 network
|
|
will prefer other addresses on that network to the 192.168.2/24
|
|
and
|
|
192.168.3/24 networks. Queries received from a host on the 192.168.4/24
|
|
or the 192.168.5/24 network will only prefer other addresses on
|
|
their directly connected networks.</para>
|
|
<programlisting>sortlist {
|
|
{ localhost; // IF the local host
|
|
{ localnets; // THEN first fit on the
|
|
192.168.1/24; // following nets
|
|
{ 192,168.2/24; 192.168.3/24; }; }; };
|
|
{ 192.168.1/24; // IF on class C 192.168.1
|
|
{ 192.168.1/24; // THEN use .1, or .2 or .3
|
|
{ 192.168.2/24; 192.168.3/24; }; }; };
|
|
{ 192.168.2/24; // IF on class C 192.168.2
|
|
{ 192.168.2/24; // THEN use .2, or .1 or .3
|
|
{ 192.168.1/24; 192.168.3/24; }; }; };
|
|
{ 192.168.3/24; // IF on class C 192.168.3
|
|
{ 192.168.3/24; // THEN use .3, or .1 or .2
|
|
{ 192.168.1/24; 192.168.2/24; }; }; };
|
|
{ { 192.168.4/24; 192.168.5/24; }; // if .4 or .5, prefer that net
|
|
};
|
|
};</programlisting>
|
|
<para>The following example will give reasonable behavior for the
|
|
local host and hosts on directly connected networks. It is similar
|
|
to the behavior of the address sort in <acronym>BIND</acronym> 8.x. Responses sent
|
|
to queries from the local host will favor any of the directly connected
|
|
networks. Responses sent to queries from any other hosts on a directly
|
|
connected network will prefer addresses on that same network. Responses
|
|
to other queries will not be sorted.</para>
|
|
<programlisting>sortlist {
|
|
{ localhost; localnets; };
|
|
{ localnets; };
|
|
};
|
|
</programlisting>
|
|
<note><simpara>The <command>sortlist</command> option
|
|
is not yet implemented in <acronym>BIND</acronym> 9.</simpara></note>
|
|
</sect3>
|
|
<sect3 id="rrset_ordering"><title id="rrset_ordering_title">RRset Ordering</title>
|
|
<para>When multiple records are returned in an answer it may be
|
|
useful to configure the order of the records placed into the response.
|
|
For example, the records for a zone might be configured always to
|
|
be returned in the order they are defined in the zone file. Or perhaps
|
|
a random shuffle of the records as they are returned is wanted.
|
|
The <command>rrset-order</command> statement permits configuration
|
|
of the ordering made of the records in a multiple record response.
|
|
The default, if no ordering is defined, is a cyclic ordering (round
|
|
robin).</para>
|
|
<para>An <command>order_spec</command> is defined as follows:</para>
|
|
<programlisting><optional> class <replaceable>class_name</replaceable> </optional><optional> type <replaceable>type_name</replaceable> </optional><optional> name <replaceable>"domain_name"</replaceable></optional>
|
|
order <replaceable>ordering</replaceable>
|
|
</programlisting>
|
|
<para>If no class is specified, the default is <command>ANY</command>.
|
|
If no type is specified, the default is <command>ANY</command>.
|
|
If no name is specified, the default is "<command>*</command>".</para>
|
|
<para>The legal values for <command>ordering</command> are:</para>
|
|
<informaltable colsep = "0" rowsep = "0"><tgroup cols = "2"
|
|
colsep = "0" rowsep = "0" tgroupstyle = "4Level-table">
|
|
<colspec colname = "1" colnum = "1" colsep = "0" colwidth = "0.750in"/>
|
|
<colspec colname = "2" colnum = "2" colsep = "0" colwidth = "3.750in"/>
|
|
<tbody>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>fixed</command></para></entry>
|
|
<entry colname = "2"><para>Records are returned in the order they
|
|
are defined in the zone file.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>random</command></para></entry>
|
|
<entry colname = "2"><para>Records are returned in some random order.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>cyclic</command></para></entry>
|
|
<entry colname = "2"><para>Records are returned in a round-robin
|
|
order.</para></entry>
|
|
</row>
|
|
</tbody>
|
|
</tgroup></informaltable>
|
|
<para>For example:</para>
|
|
<programlisting>rrset-order {
|
|
class IN type A name "host.example.com" order random;
|
|
order cyclic;
|
|
};
|
|
</programlisting>
|
|
<para>will cause any responses for type A records in class IN that
|
|
have "<systemitem class="systemname">host.example.com</systemitem>" as a suffix, to always be returned
|
|
in random order. All other records are returned in cyclic order.</para>
|
|
<para>If multiple <command>rrset-order</command> statements appear,
|
|
they are not combined-the last one applies.</para>
|
|
<para>If no <command>rrset-order</command> statement is specified,
|
|
then a default one of:
|
|
<programlisting>rrset-order { class ANY type ANY name "*"; order cyclic ; };
|
|
</programlisting>
|
|
is used.</para>
|
|
<note><simpara>The <command>rrset-order</command> statement
|
|
is not yet implemented in <acronym>BIND</acronym> 9.</simpara></note>
|
|
</sect3>
|
|
<sect3 id="tuning"><title>Tuning</title>
|
|
<informaltable colsep = "0" rowsep = "0"><tgroup cols = "2"
|
|
colsep = "0" rowsep = "0" tgroupstyle = "4Level-table">
|
|
<colspec colname = "1" colnum = "1" colsep = "0" colwidth = "1.250in"/>
|
|
<colspec colname = "2" colnum = "2" colsep = "0" colwidth = "3.250in"/>
|
|
<tbody>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>lame-ttl</command></para></entry>
|
|
<entry colname = "2"><para>Sets the number of seconds to cache a
|
|
lame server indication. 0 disables caching. (This is
|
|
<emphasis role="bold">NOT</emphasis> recommended.)
|
|
Default is <literal>600</literal> (10 minutes). Maximum value is
|
|
<literal>1800</literal> (30 minutes).</para>
|
|
<note>
|
|
<simpara>Not yet implemented in <acronym>BIND</acronym> 9.</simpara></note>
|
|
</entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>max-ncache-ttl</command></para></entry>
|
|
<entry colname = "2"><para>To reduce network traffic and increase performance
|
|
the server stores negative answers. <command>max-ncache-ttl</command> is
|
|
used to set a maximum retention time for these answers in the server
|
|
in seconds. The default
|
|
<command>max-ncache-ttl</command> is <literal>10800</literal> seconds (3 hours).
|
|
<command>max-ncache-ttl</command> cannot exceed 7 days and will
|
|
be silently truncated to 7 days if set to a greater value.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>max-cache-ttl</command></para></entry>
|
|
<entry colname = "2"><para><command>max-cache-ttl</command> sets
|
|
the maximum time for which the server will cache ordinary (positive)
|
|
answers. The default is one week (7 days).</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>min-roots</command></para></entry>
|
|
<entry colname = "2"><para>The minimum number of root servers that
|
|
is required for a request for the root servers to be accepted. Default
|
|
is <userinput>2</userinput>.</para>
|
|
<note>
|
|
<simpara>Not yet implemented in <acronym>BIND</acronym>
|
|
9.</simpara></note>
|
|
</entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>sig-validity-interval</command></para></entry>
|
|
<entry colname = "2"><para>Specifies the number of days into the
|
|
future when DNSSEC signatures automatically generated as a result
|
|
of dynamic updates (<xref linkend="dynamic_update"/>)
|
|
will expire. The default is <literal>30</literal> days. The signature
|
|
inception time is unconditionally set to one hour before the current time
|
|
to allow for a limited amount of clock skew.</para></entry>
|
|
</row>
|
|
</tbody>
|
|
</tgroup></informaltable></sect3>
|
|
<sect3>
|
|
<title>Deprecated Features</title>
|
|
|
|
<para><command>use-ixfr</command> is deprecated in <acronym>BIND</acronym> 9. If
|
|
you need to disable IXFR to a particular server or servers see
|
|
the information on the <command>provide-ixfr</command> option
|
|
in <xref
|
|
linkend="server_statement_definition_and_usage"/>. See also
|
|
<xref linkend="incremental_zone_transfers"/>.</para>
|
|
|
|
</sect3></sect2>
|
|
<sect2 id="server_statement_grammar">
|
|
<title><command>server</command>
|
|
Statement Grammar</title>
|
|
<programlisting>server <replaceable>ip_addr</replaceable> {
|
|
<optional> bogus <replaceable>yes_or_no</replaceable> ; </optional>
|
|
<optional> provide-ixfr <replaceable>yes_or_no</replaceable> ; </optional>
|
|
<optional> request-ixfr <replaceable>yes_or_no</replaceable> ; </optional>
|
|
<optional> transfers <replaceable>number</replaceable> ; </optional>
|
|
<optional> transfer-format <replaceable>( one-answer | many-answers )</replaceable> ; ]</optional>
|
|
<optional> keys <replaceable>{ string ; <optional> string ; <optional>...</optional></optional> }</replaceable> ; </optional>
|
|
};
|
|
</programlisting>
|
|
</sect2>
|
|
<sect2 id="server_statement_definition_and_usage"><title><command>server</command> Statement Definition
|
|
and Usage</title>
|
|
<para>The <command>server</command> statement defines the characteristics
|
|
to be associated with a remote nameserver.</para>
|
|
<para>If you discover that a remote server is giving out bad data,
|
|
marking it as bogus will prevent further queries to it. The default
|
|
value of <command>bogus</command> is <command>no</command>.</para>
|
|
<note>
|
|
<simpara>The <command>bogus</command> clause
|
|
is not yet implemented in <acronym>BIND</acronym> 9.</simpara></note>
|
|
<para>The <command>provide-ixfr</command> clause determines whether
|
|
the local server, acting as master, will respond with an incremental
|
|
zone transfer when the given remote server, a slave, requests it.
|
|
If set to <command>yes</command>, incremental transfer will be provided
|
|
whenever possible. If set to <command>no</command>, all transfers
|
|
to the remote server will be nonincremental. If not set, the value
|
|
of the <command>provide-ixfr </command>option in the global options block
|
|
is used as a default.</para>
|
|
<para>The <command>request-ixfr</command> clause determines whether
|
|
the local server, acting as a slave, will request incremental zone
|
|
transfers from the given remote server, a master. If not set, the
|
|
value of the <command>request-ixfr</command> option in the global
|
|
options block is used as a default.</para>
|
|
<para>IXFR requests to servers that do not support IXFR will automatically
|
|
fall back to AXFR. Therefore, there is no need to manually list
|
|
which servers support IXFR and which ones do not; the global default
|
|
of <command>yes</command> should always work. The purpose of the <command>provide-ixfr</command> and <command>request-ixfr</command> clauses is
|
|
to make it possible to disable the use of IXFR even when both master
|
|
and slave claim to support it, for example if one of the servers
|
|
is buggy and crashes or corrupts data when IXFR is used.</para>
|
|
<para>The server supports two zone transfer methods. The first, <command>one-answer</command>,
|
|
uses one DNS message per resource record transferred. <command>many-answers</command> packs
|
|
as many resource records as possible into a message. <command>many-answers</command> is
|
|
more efficient, but is only known to be understood by <acronym>BIND</acronym> 9, <acronym>BIND</acronym>
|
|
8.x, and patched versions of <acronym>BIND</acronym> 4.9.5. You can specify which method
|
|
to use for a server with the <command>transfer-format </command>option.
|
|
If <command>transfer-format </command>is not specified, the <command>transfer-format</command> specified
|
|
by the <command>options</command> statement will be used.</para>
|
|
<para><command>transfers</command> is used to limit the number of
|
|
concurrent inbound zone transfers from the specified server. If
|
|
no <command>transfers</command> clause is specified, the limit is
|
|
set according to the <command>transfers-per-ns</command> option.</para>
|
|
<para>The <command>keys</command> clause is used to identify a <command>key_id </command>defined
|
|
by the <command>key</command> statement, to be used for transaction
|
|
security when talking to the remote server. The <command>key</command> statement
|
|
must come before the <command>server</command> statement that references
|
|
it. When a request is sent to the remote server, a request signature
|
|
will be generated using the key specified here and appended to the
|
|
message. A request originating from the remote server is not required
|
|
to be signed by this key.</para>
|
|
<para>Although the grammar of the <command>keys</command> clause
|
|
allows for multiple keys, only a single key per server is currently
|
|
supported.</para></sect2>
|
|
<sect2><title><command>trusted-keys</command> Statement Grammar</title>
|
|
<programlisting>trusted-keys {
|
|
<replaceable>string</replaceable> <replaceable>number</replaceable> <replaceable>number</replaceable> <replaceable>number</replaceable> <replaceable>string</replaceable> ;
|
|
<optional> <replaceable>string</replaceable> <replaceable>number</replaceable> <replaceable>number</replaceable> <replaceable>number</replaceable> <replaceable>string</replaceable> ; <optional>...</optional></optional>
|
|
};
|
|
</programlisting>
|
|
</sect2>
|
|
<sect2><title><command>trusted-keys</command> Statement Definition
|
|
and Usage</title>
|
|
<para>The <command>trusted-keys</command> statement defines DNSSEC
|
|
security roots. DNSSEC is described in <xref linkend="DNSSEC"/>. A security root is defined when the public key for a non-authoritative
|
|
zone is known, but cannot be securely obtained through DNS, either
|
|
because it is the DNS root zone or its parent zone is unsigned.
|
|
Once a key has been configured as a trusted key, it is treated as
|
|
if it had been validated and proven secure. The resolver attempts
|
|
DNSSEC validation on all DNS data in subdomains of a security root.</para>
|
|
<para>The <command>trusted-keys</command> statement can contain
|
|
multiple key entries, each consisting of the key's domain name,
|
|
flags, protocol, algorithm, and the base-64 representation of the
|
|
key data.</para></sect2>
|
|
<sect2><title><command>view</command> Statement Grammar</title>
|
|
<programlisting>view <replaceable>view_name</replaceable> {
|
|
match-clients { <replaceable>address_match_list</replaceable> } ;
|
|
<optional> <replaceable>view_option</replaceable>; ...</optional>
|
|
<optional> <replaceable>zone_statement</replaceable>; ...</optional>
|
|
};
|
|
</programlisting></sect2>
|
|
<sect2><title><command>view</command> Statement Definition and Usage</title>
|
|
<para>The <command>view</command> statement is a powerful new feature
|
|
of <acronym>BIND</acronym> 9 that lets a name server answer a DNS query differently
|
|
depending on who is asking. It is particularly useful for implementing
|
|
split DNS setups without having to run multiple servers.</para>
|
|
<para>Each <command>view</command> statement defines a view of the
|
|
DNS namespace that will be seen by those clients whose IP addresses
|
|
match the <varname>address_match_list</varname> of the view's <command>match-clients</command> clause.
|
|
The order of the <command>view</command> statements is significant-a
|
|
client query will be resolved in the context of the first <command>view</command> whose <command>match-clients </command>list
|
|
matches the client's IP address.</para>
|
|
<para>Zones defined within a <command>view</command> statement will
|
|
be only be accessible to clients that match the <command>view</command>.
|
|
By defining a zone of the same name in multiple views, different
|
|
zone data can be given to different clients, for example, "internal"
|
|
and "external" clients in a split DNS setup.</para>
|
|
<para>Many of the options given in the <command>options</command> statement
|
|
can also be used within a <command>view</command> statement, and then
|
|
apply only when resolving queries with that view. When no view-specific
|
|
value is given, the value in the <command>options</command> statement
|
|
is used as a default. Also, zone options can have default values specified
|
|
in the <command>view</command> statement; these view-specific defaults
|
|
take precedence over those in the <command>options</command> statement. </para>
|
|
<para>Views are class specific. If no class is given, class IN
|
|
is assumed.</para>
|
|
<para>If there are no <command>view</command> statements in the
|
|
config file, a default view that matches any client is automatically
|
|
created in class IN, and any <command>zone</command> statements
|
|
specified on the top level of the configuration file are considered
|
|
to be part of this default view. If any explicit <command>view</command> statements
|
|
are present, all <command>zone</command> statements must occur inside <command>view</command> statements.</para>
|
|
<para>Here is an example of a typical split DNS setup implemented
|
|
using <command>view</command> statements.</para>
|
|
<programlisting>view "internal" {
|
|
// This should match our internal networks.
|
|
match-clients { 10.0.0.0/8; };
|
|
// Provide recursive service to internal clients only.
|
|
recursion yes;
|
|
// Provide a complete view of the example.com zone
|
|
// including addresses of internal hosts.
|
|
zone "example.com" {
|
|
type master;
|
|
file "example-internal.db";
|
|
};
|
|
};
|
|
view "external" {
|
|
match-clients { any; };
|
|
// Refuse recursive service to external clients.
|
|
recursion no;
|
|
// Provide a restricted view of the example.com zone
|
|
// containing only publicly accessible hosts.
|
|
zone "example.com" {
|
|
type master;
|
|
file "example-external.db";
|
|
};
|
|
};
|
|
</programlisting>
|
|
</sect2>
|
|
<sect2 id="zone_statement_grammar"><title><command>zone</command>
|
|
Statement Grammar</title>
|
|
<programlisting>zone <replaceable>zone_name</replaceable> <optional><replaceable>class</replaceable></optional> <optional>{
|
|
type ( master | slave | hint | stub | forward ) ;
|
|
<optional> allow-query { <replaceable>address_match_list</replaceable> } ; </optional>
|
|
<optional> allow-transfer { <replaceable>address_match_list</replaceable> } ; </optional>
|
|
<optional> allow-update { <replaceable>address_match_list</replaceable> } ; </optional>
|
|
<optional> update-policy { <replaceable>update_policy_rule</replaceable> <optional>...</optional> } ; </optional>
|
|
<optional> allow-update-forwarding { <replaceable>address_match_list</replaceable> } ; </optional>
|
|
<optional> also-notify { <optional> <replaceable>ip_addr</replaceable> ; <optional><replaceable>ip_addr</replaceable> ; <optional>...</optional></optional></optional> } ; </optional>
|
|
<optional> check-names (<constant>warn</constant>|<constant>fail</constant>|<constant>ignore</constant>) ; </optional>
|
|
<optional> dialup <replaceable>true_or_false</replaceable> ; </optional>
|
|
<optional> file <replaceable>string</replaceable> ; </optional>
|
|
<optional> forward (<constant>only</constant>|<constant>first</constant>) ; </optional>
|
|
<optional> forwarders { <optional> <replaceable>ip_addr</replaceable> ; <optional> <replaceable>ip_addr</replaceable> ; <optional>...</optional></optional></optional> } ; </optional>
|
|
<optional> ixfr-base <replaceable>string</replaceable> ; </optional>
|
|
<optional> ixfr-tmp-file <replaceable>string</replaceable> ; </optional>
|
|
<optional> maintain-ixfr-base <replaceable>true_or_false</replaceable> ; </optional>
|
|
<optional> masters <optional>port <replaceable>number</replaceable></optional> { <replaceable>ip_addr</replaceable> ; <optional><replaceable>ip_addr</replaceable> ; <optional>...</optional></optional> } ; </optional>
|
|
<optional> max-ixfr-log-size <replaceable>number</replaceable> ; </optional>
|
|
<optional> max-transfer-idle-in <replaceable>number</replaceable> ; </optional>
|
|
<optional> max-transfer-idle-out <replaceable>number</replaceable> ; </optional>
|
|
<optional> max-transfer-time-in <replaceable>number</replaceable> ; </optional>
|
|
<optional> max-transfer-time-out <replaceable>number</replaceable> ; </optional>
|
|
<optional> notify <replaceable>true_or_false</replaceable> ; </optional>
|
|
<optional> pubkey <replaceable>number</replaceable> <replaceable>number</replaceable> <replaceable>number</replaceable> <replaceable>string</replaceable> ; </optional>
|
|
<optional> transfer-source (<replaceable>ip4_addr</replaceable> | <constant>*</constant>) ; </optional>
|
|
<optional> transfer-source-v6 (<replaceable>ip6_addr</replaceable> | <constant>*</constant>) ; </optional>
|
|
<optional> sig-validity-interval <replaceable>number</replaceable> ; </optional>
|
|
}</optional>;
|
|
</programlisting>
|
|
</sect2>
|
|
<sect2><title><command>zone</command> Statement Definition and Usage</title>
|
|
<sect3><title>Zone Types</title>
|
|
<informaltable colsep = "0" rowsep = "0">
|
|
<tgroup cols = "2" colsep = "0" rowsep = "0"
|
|
tgroupstyle = "3Level-table">
|
|
<colspec colname = "1" colnum = "1" colsep = "0" colwidth = "0.908in"/>
|
|
<colspec colname = "2" colnum = "2" colsep = "0" colwidth = "4.217in"/>
|
|
<tbody>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><varname>master</varname></para></entry>
|
|
<entry colname = "2"><para>The server has a master copy of the data
|
|
for the zone and will be able to provide authoritative answers for
|
|
it.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><varname>slave</varname></para></entry>
|
|
<entry colname = "2"><para>A slave zone is a replica of a master
|
|
zone. The masters list specifies one or more IP addresses that the
|
|
slave contacts to update its copy of the zone. If a port is specified,
|
|
the slave then checks to see if the zone is current and zone transfers
|
|
will be done to the port given. If a file is specified, then the
|
|
replica will be written to this file whenever the zone is changed,
|
|
and reloaded from this file on a server restart. Use of a file is
|
|
recommended, since it often speeds server start-up and eliminates
|
|
a needless waste of bandwidth. Note that for large numbers (in the
|
|
tens or hundreds of thousands) of zones per server, it is best to
|
|
use a two level naming scheme for zone file names. For example,
|
|
a slave server for the zone <systemitem class="systemname">example.com</systemitem> might place
|
|
the zone contents into a file called
|
|
<filename>ex/example.com</filename> where <filename>ex/ </filename>is
|
|
just the first two letters of the zone name. (Most operating systems
|
|
behave very slowly if you put 100K files into a single directory.)</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><varname>stub</varname></para></entry>
|
|
<entry colname = "2"><para>A stub zone is similar to a slave zone,
|
|
except that it replicates only the NS records of a master zone instead
|
|
of the entire zone. Stub zones are not a standard part of the DNS;
|
|
they are a peculiarity of <acronym>BIND</acronym> 4 and <acronym>BIND</acronym> 8 that relies heavily
|
|
on the particular way the zone data is structured in those servers.
|
|
<acronym>BIND</acronym> 9 attempts to emulate the <acronym>BIND</acronym> 4/8 stub zone feature for backwards compatibility,
|
|
but we do not recommend its use in new configurations.</para><para>In
|
|
<acronym>BIND</acronym> 4/8, zone transfers of a parent zone included the NS records
|
|
from stub children of that zone. This meant that, in some cases,
|
|
users could get away with configuring child stubs only in the master
|
|
server for the parent zone. <acronym>BIND</acronym> 9 never mixes together zone data
|
|
from different zones in this way. Therefore, if a <acronym>BIND</acronym> 9 master
|
|
serving a parent zone has child stub zones configured, all the slave
|
|
servers for the parent zone also need to have the same child stub
|
|
zones configured..</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><varname>forward</varname></para></entry>
|
|
<entry colname = "2"><para>A "forward zone" is a way to configure
|
|
forwarding on a per-domain basis. A <command>zone</command> statement
|
|
of type <command>forward</command> can contain a <command>forward</command> and/or <command>forwarders</command> statement,
|
|
which will apply to queries within the domain given by the zone
|
|
name. If no <command>forwarders</command> statement is present or
|
|
an empty list for <command>forwarders</command> is given, then no
|
|
forwarding will be done for the domain, cancelling the effects of
|
|
any forwarders in the <command>options</command> statement. Thus
|
|
if you want to use this type of zone to change the behavior of the
|
|
global <command>forward</command> option (that is, "forward first
|
|
to", then "forward only", or vice versa, but want to use the same
|
|
servers as set globally) you need to respecify the global forwarders.</para>
|
|
<note>
|
|
<simpara>Domain-specific
|
|
forwarding is not yet implemented in <acronym>BIND</acronym> 9.</simpara></note></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><varname>hint</varname></para></entry>
|
|
<entry colname = "2"><para>The initial set of root nameservers is
|
|
specified using a "hint zone". When the server starts up, it uses
|
|
the root hints to find a root nameserver and get the most recent
|
|
list of root nameservers. If no hint zone is specified for class
|
|
IN, the server users a compiled-in default set of root servers hints.
|
|
Classes other than IN have no built-in defaults hints.</para></entry>
|
|
</row>
|
|
</tbody>
|
|
</tgroup></informaltable></sect3>
|
|
<sect3><title>Class</title>
|
|
<para>The zone's name may optionally be followed by a class. If
|
|
a class is not specified, class <literal>IN</literal> (for <varname>Internet</varname>),
|
|
is assumed. This is correct for the vast majority of cases.</para>
|
|
<para>The <literal>hesiod</literal> class is
|
|
named for an information service from MIT's Project Athena. It is
|
|
used to share information about various systems databases, such
|
|
as users, groups, printers and so on. The keyword
|
|
<literal>HS</literal> is
|
|
a synonym for hesiod.</para>
|
|
<para>Another MIT development is CHAOSnet, a LAN protocol created
|
|
in the mid-1970s. Zone data for it can be specified with the <literal>CHAOS</literal> class.</para></sect3>
|
|
<sect3>
|
|
<title>Zone Options</title>
|
|
<informaltable colsep = "0"
|
|
rowsep = "0">
|
|
<tgroup cols = "2" colsep = "0" rowsep = "0" tgroupstyle = "4Level-table">
|
|
<colspec colname = "1" colnum = "1" colsep = "0" colwidth = "1.653in"/>
|
|
<colspec colname = "2" colnum = "2" colsep = "0" colwidth = "2.847in"/>
|
|
<tbody>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>allow-query</command></para></entry>
|
|
<entry colname = "2"><para>See the description of
|
|
<command>allow-query</command> in <xref linkend="access_control"/></para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>allow-transfer</command></para></entry>
|
|
<entry colname = "2"><para>See the description of <command>allow-transfer</command> in <xref linkend="access_control"/>.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>allow-update</command></para></entry>
|
|
<entry colname = "2"><para>Specifies which hosts are allowed to
|
|
submit Dynamic DNS updates for master zones. The default is to deny
|
|
updates from all hosts.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>update-policy</command></para></entry>
|
|
<entry colname = "2"><para>Specifies a "Simple Secure Update" policy. See
|
|
<xref linkend="dynamic_update_policies"/>.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>allow-update-forwarding</command></para></entry>
|
|
<entry colname = "2"><para>Specifies which hosts are allowed to
|
|
submit Dynamic DNS updates to slave zones to be forwarded to the
|
|
master. The default is to deny update forwarding from all hosts.</para><note>
|
|
<simpara>Update
|
|
forwarding is not yet implemented.</simpara></note></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>also-notify</command></para></entry>
|
|
<entry colname = "2"><para>Only meaningful if <command>notify</command> is
|
|
active for this zone. The set of machines that will receive a
|
|
<literal>DNS NOTIFY</literal> message
|
|
for this zone is made up of all the listed nameservers (other than
|
|
the primary master) for the zone plus any IP addresses specified
|
|
with <command>also-notify</command>.
|
|
<command>also-notify</command> is not meaningful for stub zones.
|
|
The default is the empty list.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>check-names</command></para></entry>
|
|
<entry colname = "2"><para>See <xref
|
|
linkend="name_checking"/>.</para>
|
|
<note>
|
|
<simpara>Not yet implemented in <acronym>BIND</acronym> 9.</simpara></note></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>dialup</command></para></entry>
|
|
<entry colname = "2"><para>See the description of
|
|
<command>dialup</command> under <xref linkend="boolean_options"/>.
|
|
<note><simpara>Not yet implemented in <acronym>BIND</acronym> 9.</simpara></note></para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>forward</command></para></entry>
|
|
<entry colname = "2"><para>Only meaningful if the zone has a forwarders
|
|
list. The <command>only</command> value causes the lookup to fail
|
|
after trying the forwarders and getting no answer, while <command>first</command> would
|
|
allow a normal lookup to be tried.</para>
|
|
<note>
|
|
<simpara>Not yet implemented in <acronym>BIND</acronym> 9.</simpara></note></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>forwarders</command></para></entry>
|
|
<entry colname = "2"><para>Used to override the list of global forwarders.
|
|
If it is not specified in a zone of type <command>forward</command>,
|
|
no forwarding is done for the zone; the global options are not used.</para><note>
|
|
<para>Not
|
|
yet implemented in <acronym>BIND</acronym> 9.</para></note></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>ixfr-base</command></para></entry>
|
|
<entry colname = "2"><para>Was used in <acronym>BIND</acronym> 8 to specify the name
|
|
of the transaction log (journal) file for dynamic update and IXFR.
|
|
<acronym>BIND</acronym> 9 ignores the option and constructs the name of the journal
|
|
file by appending ".<filename>jnl</filename>" to the name of the
|
|
zone file.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>max-transfer-time-in</command></para></entry>
|
|
<entry colname = "2"><para>See the description of
|
|
<command>max-transfer-time-in</command> under <xref linkend="zone_transfers"/>.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>max-transfer-idle-in</command></para></entry>
|
|
<entry colname = "2"><para>See the description of
|
|
<command>max-transfer-idle-in</command> under <xref linkend="zone_transfers"/>.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>max-transfer-time-out</command></para></entry>
|
|
<entry colname = "2"><para>See the description of
|
|
<command>max-transfer-time-out</command> under <xref linkend="zone_transfers"/>.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>max-transfer-idle-out</command></para></entry>
|
|
<entry colname = "2"><para>See the description of
|
|
<command>max-transfer-idle-out</command> under <xref linkend="zone_transfers"/>.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>notify</command></para></entry>
|
|
<entry colname = "2"><para>See the description of
|
|
<command>notify</command> under <xref linkend="boolean_options"/>.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>pubkey</command></para></entry>
|
|
<entry colname = "2"><para>In <acronym>BIND</acronym> 8, this option was intended for specifying
|
|
a public zone key for verification of signatures in DNSSEC signed
|
|
zones when they are loaded from disk. <acronym>BIND</acronym> 9 does not verify signatures
|
|
on loading and ignores the option.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>sig-validity-interval</command></para></entry>
|
|
<entry colname = "2"><para>See the description of
|
|
<command>sig-validity-interval</command> under <xref linkend="tuning"/>.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>transfer-source</command></para></entry>
|
|
<entry colname = "2"><para>Determines which local address will be bound
|
|
to the IPv4 TCP connection used to fetch this zone. If not set,
|
|
it defaults to a system controlled value which will usually be the
|
|
address of the interface "closest to" the remote end. If the remote
|
|
end user is an <command>allow-transfer</command> option for this
|
|
zone, the address, supplied by the <command>transfer-source</command> option,
|
|
needs to be specified in that <command>allow-transfer</command> option.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para>transfer-source-v6</para></entry>
|
|
<entry colname = "2"><para>Similar to transfer-source, but for zone transfers
|
|
performed using IPv6.</para></entry>
|
|
</row>
|
|
</tbody>
|
|
</tgroup></informaltable></sect3>
|
|
<sect3 id="dynamic_update_policies"><title>Dynamic Update Policies</title>
|
|
<para><acronym>BIND</acronym> 9 supports two alternative methods of granting clients
|
|
the right to perform dynamic updates to a zone, configured by the <command>allow-update</command> and <command>update-policy</command> option,
|
|
respectively.</para>
|
|
<para>The <command>allow-update</command> clause works the same
|
|
way as in previous versions of <acronym>BIND</acronym>. It grants given clients the
|
|
permission to update any record of any name in the zone.</para>
|
|
<para>The <command>update-policy</command> clause is new in <acronym>BIND</acronym>
|
|
9 and allows more fine-grained control over what updates are allowed.
|
|
A set of rules is specified, where each rule either grants or denies
|
|
permissions for one or more names to be updated by one or more identities.
|
|
If the dynamic update request message is signed (that is, it includes
|
|
either a TSIG or SIG(0) record), the identity of the signer can
|
|
be determined.</para>
|
|
<para>Rules are specified in the <command>update-policy</command> zone
|
|
option, and are only meaningful for master zones. When the <command>update-policy</command> statement
|
|
is present, it is a configuration error for the <command>allow-update</command> statement
|
|
to be present. The <command>update-policy</command> statement only
|
|
examines the signer of a message; the source address is not relevant.</para>
|
|
<para>This is how a rule definition looks:</para>
|
|
<programlisting>
|
|
( <command>grant</command> | <command>deny</command> ) <replaceable>identity</replaceable> <replaceable>nametype</replaceable> <replaceable>name</replaceable> <optional> <replaceable>types</replaceable> </optional>
|
|
</programlisting>
|
|
<para>Each rule grants or denies privileges. Once a message has
|
|
successfully matched a rule, the operation is immediately granted
|
|
or denied and no further rules are examined. A rule is matched
|
|
when the signer matches the identity field, the name matches the
|
|
name field, and the type is specified in the type field.</para>
|
|
<para>The identity field specifies a name or a wildcard name. The
|
|
nametype field has 4 values: <varname>name</varname>, <varname>subdomain</varname>, <varname>wildcard</varname>,
|
|
and <varname>self</varname>
|
|
</para>
|
|
<informaltable>
|
|
<tgroup cols = "2" colsep = "0"
|
|
rowsep = "0" tgroupstyle = "4Level-table">
|
|
<colspec colname = "1" colnum = "1" colsep = "0" colwidth = "0.819in"/>
|
|
<colspec colname = "2" colnum = "2" colsep = "0" colwidth = "3.681in"/>
|
|
<tbody>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><varname>name</varname></para></entry>
|
|
<entry colname = "2"><para>Matches when the updated name is the
|
|
same as the name in the name field.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><varname>subdomain</varname></para></entry>
|
|
<entry colname = "2"><para>Matches when the updated name is a subdomain
|
|
of the name in the name field.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><varname>wildcard</varname></para></entry>
|
|
<entry colname = "2"><para>Matches when the updated name is a valid
|
|
expansion of the wildcard name in the name field.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><varname>self</varname></para></entry>
|
|
<entry colname = "2"><para>Matches when the updated name is the
|
|
same as the message signer. The name field is ignored.</para></entry>
|
|
</row>
|
|
</tbody>
|
|
</tgroup></informaltable>
|
|
<para>If no types are specified, the rule matches all types except
|
|
SIG, NS, SOA, and NXT. Types may be specified by name, including
|
|
"ANY" (ANY matches all types except NXT, which can never be updated).
|
|
</para>
|
|
</sect3>
|
|
</sect2>
|
|
</sect1>
|
|
<sect1>
|
|
<title>Zone File</title>
|
|
<sect2 id="types_of_resource_records_and_when_to_use_them">
|
|
<title>Types of Resource Records and When to Use Them</title>
|
|
<para>This section, largely borrowed from RFC 1034, describes the
|
|
concept of a Resource Record (RR) and explains when each is used.
|
|
Since the publication of RFC 1034, several new RRs have been identified
|
|
and implemented in the DNS. These are also included.</para>
|
|
<sect3>
|
|
<title>Resource Records</title>
|
|
|
|
<para>A domain name identifies a node. Each node has a set of
|
|
resource information, which may be empty. The set of resource
|
|
information associated with a particular name is composed of
|
|
separate RRs. The order of RRs in a set is not significant and
|
|
need not be preserved by nameservers, resolvers, or other
|
|
parts of the DNS. However, sorting of multiple RRs is
|
|
permitted for optimization purposes, for example, to specify
|
|
that a particular nearby server be tried first. See <xref
|
|
linkend="the_sortlist_statement"/> and <xref
|
|
linkend="rrset_ordering"/>.</para>
|
|
|
|
<para>The components of a Resource Record are:</para>
|
|
<informaltable colsep = "0"
|
|
rowsep = "0"><tgroup cols = "2" colsep = "0"
|
|
rowsep = "0" tgroupstyle = "4Level-table">
|
|
<colspec colname = "1" colnum = "1" colsep = "0" colwidth = "1.000in"/>
|
|
<colspec colname = "2" colnum = "2" colsep = "0" colwidth = "3.500in"/>
|
|
<tbody>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para>owner name</para></entry>
|
|
<entry colname = "2"><para>the domain name where the RR is found.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para>type</para></entry>
|
|
<entry colname = "2"><para>an encoded 16 bit value that specifies
|
|
the type of the resource in this resource record. Types refer to
|
|
abstract resources.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para>TTL</para></entry>
|
|
<entry colname = "2"><para>the time to live of the RR. This field
|
|
is a 32 bit integer in units of seconds, and is primarily used by
|
|
resolvers when they cache RRs. The TTL describes how long a RR can
|
|
be cached before it should be discarded.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para>class</para></entry>
|
|
<entry colname = "2"><para>an encoded 16 bit value that identifies
|
|
a protocol family or instance of a protocol.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para>RDATA</para></entry>
|
|
<entry colname = "2"><para>the type and sometimes class-dependent
|
|
data that describes the resource.</para></entry>
|
|
</row>
|
|
</tbody>
|
|
</tgroup></informaltable>
|
|
<para>The following are <emphasis>types</emphasis> of valid RRs
|
|
(some of these listed, although not obsolete, are experimental (x)
|
|
or historical (h) and no longer in general use):</para>
|
|
<informaltable colsep = "0"
|
|
rowsep = "0"><tgroup cols = "2" colsep = "0"
|
|
rowsep = "0" tgroupstyle = "4Level-table">
|
|
<colspec colname = "1" colnum = "1" colsep = "0" colwidth = "0.875in"/>
|
|
<colspec colname = "2" colnum = "2" colsep = "0" colwidth = "3.625in"/>
|
|
<tbody>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para>A</para></entry>
|
|
<entry colname = "2"><para>a host address.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para>A6</para></entry>
|
|
<entry colname = "2"><para>an IPv6 address.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para>AAAA</para></entry>
|
|
<entry colname = "2"><para>Obsolete format of IPv6 address</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para>AFSDB</para></entry>
|
|
<entry colname = "2"><para>(x) location of AFS database servers.
|
|
Experimental.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para>CNAME</para></entry>
|
|
<entry colname = "2"><para>identifies the canonical name of an alias.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para>DNAME</para></entry>
|
|
<entry colname = "2"><para>for delegation of reverse addresses.
|
|
Replaces the domain name specified with another name to be looked
|
|
up. Described in RFC 2672.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para>HINFO</para></entry>
|
|
<entry colname = "2"><para>identifies the CPU and OS used by a host.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para>ISDN</para></entry>
|
|
<entry colname = "2"><para>(x) representation of ISDN addresses.
|
|
Experimental.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para>KEY</para></entry>
|
|
<entry colname = "2"><para>stores a public key associated with a
|
|
DNS name.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para>LOC</para></entry>
|
|
<entry colname = "2"><para>(x) for storing GPS info. See RFC 1876.
|
|
Experimental.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para>MX</para></entry>
|
|
<entry colname = "2"><para>identifies a mail exchange for the domain.
|
|
See RFC 974 for details.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para>NS</para></entry>
|
|
<entry colname = "2"><para>the authoritative nameserver for the
|
|
domain.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para>NXT</para></entry>
|
|
<entry colname = "2"><para>used in DNSSEC to securely indicate that
|
|
RRs with an owner name in a certain name interval do not exist in
|
|
a zone and indicate what RR types are present for an existing name.
|
|
See RFC 2535 for details.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para>PTR</para></entry>
|
|
<entry colname = "2"><para>a pointer to another part of the domain
|
|
name space.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para>RP</para></entry>
|
|
<entry colname = "2"><para>(x) information on persons responsible
|
|
for the domain. Experimental.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para>RT</para></entry>
|
|
<entry colname = "2"><para>(x) route-through binding for hosts that
|
|
do not have their own direct wide area network addresses. Experimental.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para>SIG</para></entry>
|
|
<entry colname = "2"><para>("signature") contains data authenticated
|
|
in the secure DNS. See RFC 2535 for details.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para>SOA</para></entry>
|
|
<entry colname = "2"><para>identifies the start of a zone of authority.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para>SRV</para></entry>
|
|
<entry colname = "2"><para>information about well known network
|
|
services (replaces WKS).</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para>WKS</para></entry>
|
|
<entry colname = "2"><para>(h) information about which well known
|
|
network services, such as SMTP, that a domain supports. Historical,
|
|
replaced by newer RR SRV.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para>X25</para></entry>
|
|
<entry colname = "2"><para>(x) representation of X.25 network addresses. Experimental.</para></entry>
|
|
</row>
|
|
</tbody>
|
|
</tgroup></informaltable>
|
|
<para>The following <emphasis>classes</emphasis> of resource records
|
|
are currently valid in the DNS:</para><informaltable colsep = "0"
|
|
rowsep = "0"><tgroup cols = "2" colsep = "0" rowsep = "0"
|
|
tgroupstyle = "4Level-table">
|
|
<colspec colname = "1" colnum = "1" colsep = "0" colwidth = "0.875in"/>
|
|
<colspec colname = "2" colnum = "2" colsep = "0" colwidth = "3.625in"/>
|
|
<tbody>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para>IN</para></entry>
|
|
<entry colname = "2"><para>the Internet system.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry nameend = "2" namest = "1"><para>For information about other,
|
|
older classes of RRs, see <xref linkend="classes_of_resource_records"/>.</para></entry>
|
|
</row>
|
|
</tbody>
|
|
</tgroup></informaltable>
|
|
<para><emphasis>RDATA</emphasis> is the type-dependent or class-dependent
|
|
data that describes the resource:</para><informaltable colsep = "0"
|
|
rowsep = "0"><tgroup cols = "2" colsep = "0" rowsep = "0"
|
|
tgroupstyle = "4Level-table">
|
|
<colspec colname = "1" colnum = "1" colsep = "0" colwidth = "0.875in"/>
|
|
<colspec colname = "2" colnum = "2" colsep = "0" colwidth = "3.625in"/>
|
|
<tbody>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para>A</para></entry>
|
|
<entry colname = "2"><para>for the IN class, a 32 bit IP address.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para>A6</para></entry>
|
|
<entry colname = "2"><para>maps a domain name to an IPv6 address,
|
|
with a provision for indirection for leading "prefix" bits.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para>CNAME</para></entry>
|
|
<entry colname = "2"><para>a domain name.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para>DNAME</para></entry>
|
|
<entry colname = "2"><para>provides alternate naming to an entire
|
|
subtree of the domain name space, rather than to a single node.
|
|
It causes some suffix of a queried name to be substituted with
|
|
a name from the DNAME record's RDATA.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para>MX</para></entry>
|
|
<entry colname = "2"><para>a 16 bit preference value (lower is better)
|
|
followed by a host name willing to act as a mail exchange for the
|
|
owner domain.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para>NS</para></entry>
|
|
<entry colname = "2"><para>a fully qualified domain name.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para>PTR</para></entry>
|
|
<entry colname = "2"><para>a fully qualified domain name.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para>SOA</para></entry>
|
|
<entry colname = "2"><para>several fields.</para></entry>
|
|
</row>
|
|
</tbody>
|
|
</tgroup></informaltable>
|
|
<para>The owner name is often implicit, rather than forming an integral
|
|
part of the RR. For example, many nameservers internally form tree
|
|
or hash structures for the name space, and chain RRs off nodes.
|
|
The remaining RR parts are the fixed header (type, class, TTL)
|
|
which is consistent for all RRs, and a variable part (RDATA) that
|
|
fits the needs of the resource being described.</para>
|
|
<para>The meaning of the TTL field is a time limit on how long an
|
|
RR can be kept in a cache. This limit does not apply to authoritative
|
|
data in zones; it is also timed out, but by the refreshing policies
|
|
for the zone. The TTL is assigned by the administrator for the
|
|
zone where the data originates. While short TTLs can be used to
|
|
minimize caching, and a zero TTL prohibits caching, the realities
|
|
of Internet performance suggest that these times should be on the
|
|
order of days for the typical host. If a change can be anticipated,
|
|
the TTL can be reduced prior to the change to minimize inconsistency
|
|
during the change, and then increased back to its former value following
|
|
the change.</para>
|
|
<para>The data in the RDATA section of RRs is carried as a combination
|
|
of binary strings and domain names. The domain names are frequently
|
|
used as "pointers" to other data in the DNS.</para></sect3>
|
|
<sect3><title>Textual expression of RRs</title>
|
|
<para>RRs are represented in binary form in the packets of the DNS
|
|
protocol, and are usually represented in highly encoded form when
|
|
stored in a nameserver or resolver. In the examples provided in
|
|
RFC 1034, a style similar to that used in master files was employed
|
|
in order to show the contents of RRs. In this format, most RRs
|
|
are shown on a single line, although continuation lines are possible
|
|
using parentheses.</para>
|
|
<para>The start of the line gives the owner of the RR. If a line
|
|
begins with a blank, then the owner is assumed to be the same as
|
|
that of the previous RR. Blank lines are often included for readability.</para>
|
|
<para>Following the owner, we list the TTL, type, and class of the
|
|
RR. Class and type use the mnemonics defined above, and TTL is
|
|
an integer before the type field. In order to avoid ambiguity in
|
|
parsing, type and class mnemonics are disjoint, TTLs are integers,
|
|
and the type mnemonic is always last. The IN class and TTL values
|
|
are often omitted from examples in the interests of clarity.</para>
|
|
<para>The resource data or RDATA section of the RR are given using
|
|
knowledge of the typical representation for the data.</para>
|
|
<para>For example, we might show the RRs carried in a message as:</para> <informaltable
|
|
colsep = "0" rowsep = "0"><tgroup cols = "3"
|
|
colsep = "0" rowsep = "0" tgroupstyle = "4Level-table">
|
|
<colspec colname = "1" colnum = "1" colsep = "0" colwidth = "1.381in"/>
|
|
<colspec colname = "2" colnum = "2" colsep = "0" colwidth = "1.020in"/>
|
|
<colspec colname = "3" colnum = "3" colsep = "0" colwidth = "2.099in"/>
|
|
<tbody>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><literal>ISI.EDU.</literal></para></entry>
|
|
<entry colname = "2"><para><literal>MX</literal></para></entry>
|
|
<entry colname = "3"><para><literal>10 VENERA.ISI.EDU.</literal></para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para></para></entry>
|
|
<entry colname = "2"><para><literal>MX</literal></para></entry>
|
|
<entry colname = "3"><para><literal>10 VAXA.ISI.EDU</literal></para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><literal>VENERA.ISI.EDU</literal></para></entry>
|
|
<entry colname = "2"><para><literal>A</literal></para></entry>
|
|
<entry colname = "3"><para><literal>128.9.0.32</literal></para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para></para></entry>
|
|
<entry colname = "2"><para><literal>A</literal></para></entry>
|
|
<entry colname = "3"><para><literal>10.1.0.52</literal></para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><literal>VAXA.ISI.EDU</literal></para></entry>
|
|
<entry colname = "2"><para><literal>A</literal></para></entry>
|
|
<entry colname = "3"><para><literal>10.2.0.27</literal></para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para></para></entry>
|
|
<entry colname = "2"><para><literal>A</literal></para></entry>
|
|
<entry colname = "3"><para><literal>128.9.0.33</literal></para></entry>
|
|
</row>
|
|
</tbody>
|
|
</tgroup></informaltable>
|
|
<para>The MX RRs have an RDATA section which consists of a 16 bit
|
|
number followed by a domain name. The address RRs use a standard
|
|
IP address format to contain a 32 bit internet address.</para>
|
|
<para>This example shows six RRs, with two RRs at each of three
|
|
domain names.</para>
|
|
<para>Similarly we might see:</para><informaltable colsep = "0"
|
|
rowsep = "0"><tgroup cols = "3" colsep = "0" rowsep = "0"
|
|
tgroupstyle = "4Level-table">
|
|
<colspec colname = "1" colnum = "1" colsep = "0" colwidth = "1.491in"/>
|
|
<colspec colname = "2" colnum = "2" colsep = "0" colwidth = "1.067in"/>
|
|
<colspec colname = "3" colnum = "3" colsep = "0" colwidth = "2.067in"/>
|
|
<tbody>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><literal>XX.LCS.MIT.EDU. IN</literal></para></entry>
|
|
<entry colname = "2"><para><literal>A</literal></para></entry>
|
|
<entry colname = "3"><para><literal>10.0.0.44</literal></para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><literal>CH</literal></para></entry>
|
|
<entry colname = "2"><para><literal>A</literal></para></entry>
|
|
<entry colname = "3"><para><literal>MIT.EDU. 2420</literal></para></entry>
|
|
</row>
|
|
</tbody>
|
|
</tgroup></informaltable>
|
|
<para>This example shows two addresses for <systemitem class="systemname">XX.LCS.MIT.EDU</systemitem>,
|
|
each of a different class.</para></sect3></sect2>
|
|
<sect2><title>Discussion of MX Records</title>
|
|
<para>As described above, domain servers store information as a
|
|
series of resource records, each of which contains a particular
|
|
piece of information about a given domain name (which is usually,
|
|
but not always, a host). The simplest way to think of a RR is as
|
|
a typed pair of datum, a domain name matched with relevant data,
|
|
and stored with some additional type information to help systems determine
|
|
when the RR is relevant.</para>
|
|
<para>MX records are used to control delivery of email. The data
|
|
specified in the record is a priority and a domain name. The priority
|
|
controls the order in which email delivery is attempted, with the
|
|
lowest number first. If two priorities are the same, a server is
|
|
chosen randomly. If no servers at a given priority are responding,
|
|
the mail transport agent will fall back to the next largest priority.
|
|
Priority numbers do not have any absolute meaning — they are relevant
|
|
only respective to other MX records for that domain name. The domain
|
|
name given is the machine to which the mail will be delivered. It <emphasis>must</emphasis> have
|
|
an associated A record — CNAME is not sufficient.</para>
|
|
<para>For a given domain, if there is both a CNAME record and an
|
|
MX record, the MX record is in error, and will be ignored. Instead,
|
|
the mail will be delivered to the server specified in the MX record
|
|
pointed to by the CNAME.</para>
|
|
<informaltable colsep = "0" rowsep = "0"><tgroup cols = "5"
|
|
colsep = "0" rowsep = "0" tgroupstyle = "3Level-table">
|
|
<colspec colname = "1" colnum = "1" colsep = "0" colwidth = "1.708in"/>
|
|
<colspec colname = "2" colnum = "2" colsep = "0" colwidth = "0.444in"/>
|
|
<colspec colname = "3" colnum = "3" colsep = "0" colwidth = "0.444in"/>
|
|
<colspec colname = "4" colnum = "4" colsep = "0" colwidth = "0.976in"/>
|
|
<colspec colname = "5" colnum = "5" colsep = "0" colwidth = "1.553in"/>
|
|
<tbody>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><literal>example.com.</literal></para></entry>
|
|
<entry colname = "2"><para><literal>IN</literal></para></entry>
|
|
<entry colname = "3"><para><literal>MX</literal></para></entry>
|
|
<entry colname = "4"><para><literal>10</literal></para></entry>
|
|
<entry colname = "5"><para><literal>mail.example.com.</literal></para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para></para></entry>
|
|
<entry colname = "2"><para><literal>IN</literal></para></entry>
|
|
<entry colname = "3"><para><literal>MX</literal></para></entry>
|
|
<entry colname = "4"><para><literal>10</literal></para></entry>
|
|
<entry colname = "5"><para><literal>mail2.example.com.</literal></para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para></para></entry>
|
|
<entry colname = "2"><para><literal>IN</literal></para></entry>
|
|
<entry colname = "3"><para><literal>MX</literal></para></entry>
|
|
<entry colname = "4"><para><literal>20</literal></para></entry>
|
|
<entry colname = "5"><para><literal>mail.backup.org.</literal></para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><literal>mail.example.com.</literal></para></entry>
|
|
<entry colname = "2"><para><literal>IN</literal></para></entry>
|
|
<entry colname = "3"><para><literal>A</literal></para></entry>
|
|
<entry colname = "4"><para><literal>10.0.0.1</literal></para></entry>
|
|
<entry colname = "5"><para></para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><literal>mail2.example.com.</literal></para></entry>
|
|
<entry colname = "2"><para><literal>IN</literal></para></entry>
|
|
<entry colname = "3"><para><literal>A</literal></para></entry>
|
|
<entry colname = "4"><para><literal>10.0.0.2</literal></para></entry>
|
|
<entry colname = "5"><para></para></entry>
|
|
</row>
|
|
</tbody>
|
|
</tgroup></informaltable><para>For example:</para>
|
|
<para>Mail delivery will be attempted to <systemitem class="systemname">mail.example.com</systemitem> and <systemitem class="systemname">mail2.example.com</systemitem> (in
|
|
any order), and if neither of those succeed, delivery to <systemitem class="systemname">mail.backup.org</systemitem> will
|
|
be attempted.</para></sect2>
|
|
<sect2 id="Setting_TTLs"><title>Setting TTLs</title>
|
|
<para>The time to live of the RR field is a 32 bit integer represented
|
|
in units of seconds, and is primarily used by resolvers when they
|
|
cache RRs. The TTL describes how long a RR can be cached before it
|
|
should be discarded. The following three types of TTL are currently
|
|
used in a zone file.</para>
|
|
<informaltable colsep = "0" rowsep = "0"><tgroup cols = "2"
|
|
colsep = "0" rowsep = "0" tgroupstyle = "3Level-table">
|
|
<colspec colname = "1" colnum = "1" colsep = "0" colwidth = "0.750in"/>
|
|
<colspec colname = "2" colnum = "2" colsep = "0" colwidth = "4.375in"/>
|
|
<tbody>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para>SOA</para></entry>
|
|
<entry colname = "2"><para>The last field in the SOA is the negative
|
|
caching TTL. This controls how long other servers will cache no-such-domain
|
|
(NXDOMAIN) responses from you.</para><para>The maximum time for
|
|
negative caching is 3 hours (3h).</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para>$TTL</para></entry>
|
|
<entry colname = "2"><para>The $TTL directive at the top of the
|
|
zone file (before the SOA) gives a default TTL for every RR without
|
|
a specific TTL set.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para>RR TTLs</para></entry>
|
|
<entry colname = "2"><para>Each RR can have a TTL as the second
|
|
field in the RR, which will control how long other servers can cache
|
|
the it.</para></entry>
|
|
</row>
|
|
</tbody>
|
|
</tgroup></informaltable>
|
|
<para>All of these TTLs default to units of seconds, though units
|
|
can be explicitly specified, for example, <literal>1h30m</literal>. </para></sect2>
|
|
<sect2><title>Inverse Mapping in IPv4</title>
|
|
<para>Reverse name resolution (that is, translation from IP address
|
|
to name) is achieved by means of the <emphasis>in-addr.arpa</emphasis> domain
|
|
and PTR records. Entries in the in-addr.arpa domain are made in
|
|
least-to-most significant order, read left to right. This is the
|
|
opposite order to the way IP addresses are usually written. Thus,
|
|
a machine with an IP address of 10.1.2.3 would have a corresponding
|
|
in-addr.arpa name of
|
|
3.2.1.10.in-addr.arpa. This name should have a PTR resource record
|
|
whose data field is the name of the machine or, optionally, multiple
|
|
PTR records if the machine has more than one name. For example,
|
|
in the <optional>example.com</optional> domain:</para>
|
|
<informaltable colsep = "0" rowsep = "0">
|
|
<tgroup cols = "2" colsep = "0" rowsep = "0"
|
|
tgroupstyle = "3Level-table">
|
|
<colspec colname = "1" colnum = "1" colsep = "0" colwidth = "1.125in"/>
|
|
<colspec colname = "2" colnum = "2" colsep = "0" colwidth = "4.000in"/>
|
|
<tbody>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><literal>$ORIGIN</literal></para></entry>
|
|
<entry colname = "2"><para><literal>2.1.10.in-addr.arpa</literal></para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><literal>3</literal></para></entry>
|
|
<entry colname = "2"><para><literal>IN PTR foo.example.com.</literal></para></entry>
|
|
</row>
|
|
</tbody>
|
|
</tgroup></informaltable>
|
|
<note>
|
|
<para>The <command>$ORIGIN</command> lines in the examples
|
|
are for providing context to the examples only-they do not necessarily
|
|
appear in the actual usage. They are only used here to indicate
|
|
that the example is relative to the listed origin.</para></note></sect2>
|
|
<sect2><title>Other Zone File Directives</title>
|
|
<para>The Master File Format was initially defined in RFC 1035 and
|
|
has subsequently been extended. While the Master File Format itself
|
|
is class independent all records in a Master File must be of the same
|
|
class.</para>
|
|
<para>Master File Directives include <command>$ORIGIN</command>, <command>$INCLUDE</command>,
|
|
and <command>$TTL.</command></para>
|
|
<sect3><title>The <command>$ORIGIN</command> Directive</title>
|
|
<para>Syntax: <command>$ORIGIN
|
|
</command><replaceable>domain-name</replaceable> <optional> <replaceable>comment</replaceable></optional></para>
|
|
<para><command>$ORIGIN </command>sets the domain name that will
|
|
be appended to any unqualified records. When a zone is first read
|
|
in there is an implicit <command>$ORIGIN </command><<varname>zone-name</varname>><command>.</command> The
|
|
current <command>$ORIGIN</command> is appended to the domain specified
|
|
in the <command>$ORIGIN</command> argument if it is not absolute.</para>
|
|
<programlisting><literal>$ORIGIN example.com
|
|
WWW CNAME MAIN-SERVER</literal></programlisting>
|
|
<para>is equivalent to</para>
|
|
<programlisting><literal>WWW.EXAMPLE.COM CNAME MAIN-SERVER.EXAMPLE.COM.</literal></programlisting></sect3>
|
|
<sect3><title>The <command>$INCLUDE</command> Directive</title>
|
|
<para>Syntax: <command>$INCLUDE</command>
|
|
<replaceable>filename</replaceable> <optional>
|
|
<replaceable>origin</replaceable> </optional> <optional> <replaceable>comment</replaceable> </optional></para>
|
|
<para>Read and process the file <filename>filename</filename> as
|
|
if it were included into the file at this point. If <command>origin</command> is
|
|
specified the file is processed with <command>$ORIGIN</command> set
|
|
to that value, otherwise the current <command>$ORIGIN</command> is
|
|
used.</para>
|
|
<note>
|
|
<para>The behavior when <command>origin</command> is
|
|
specified differs from that described in RFC 1035. The origin and
|
|
current domain revert to the values they were prior to the <command>$INCLUDE</command> once
|
|
the file has been read.</para></note></sect3>
|
|
<sect3><title>The <command>$TTL</command> Directive</title>
|
|
<para>Syntax: <command>$TTL</command>
|
|
<replaceable>default-ttl</replaceable> <optional>
|
|
<replaceable>comment</replaceable> </optional></para>
|
|
<para>Set the default Time To Live (TTL) for subsequent records
|
|
with undefined TTLs. Valid TTLs are of the range 0-2147483647 seconds.</para>
|
|
<para><command>$TTL</command> is defined in RFC 2308.</para></sect3></sect2>
|
|
<sect2><title><acronym>BIND</acronym> Master File Extension: the <command>$GENERATE</command> Directive</title>
|
|
<para>Syntax: <command>$GENERATE</command> <replaceable>range</replaceable> <replaceable>hs</replaceable> <replaceable>type</replaceable> <replaceable>rhs</replaceable> <optional> <replaceable>comment</replaceable> </optional></para>
|
|
<para><command>$GENERATE</command> is used to create a series of
|
|
resource records that only differ from each other by an iterator. <command>$GENERATE </command>can
|
|
be used to easily generate the sets of records required to support
|
|
sub /24 reverse delegations described in RFC 2317: Classless IN-ADDR.ARPA
|
|
delegation.</para>
|
|
<programlisting><literal>$ORIGIN 0.0.192.IN-ADDR.ARPA.
|
|
$GENERATE 1-2 0 NS SERVER$.EXAMPLE.
|
|
$GENERATE 1-127 $ CNAME $.0</literal></programlisting>
|
|
<para>is equivalent to</para>
|
|
<programlisting><literal>0.0.0.192.IN-ADDR.ARPA NS SERVER1.EXAMPLE.
|
|
0.0.0.192.IN-ADDR.ARPA NS SERVER2.EXAMPLE.
|
|
1.0.0.192.IN-ADDR.ARPA CNAME 1.0.0.0.192.IN-ADDR.ARPA
|
|
2.0.0.192.IN-ADDR.ARPA CNAME 2.0.0.0.192.IN-ADDR.ARPA
|
|
...
|
|
127.0.0.192.IN-ADDR.ARPA CNAME 127.0.0.0.192.IN-ADDR.ARPA
|
|
.</literal></programlisting>
|
|
<informaltable colsep = "0" rowsep = "0">
|
|
<tgroup cols = "2" colsep = "0" rowsep = "0" tgroupstyle = "3Level-table">
|
|
<colspec colname = "1" colnum = "1" colsep = "0" colwidth = "0.875in"/>
|
|
<colspec colname = "2" colnum = "2" colsep = "0" colwidth = "4.250in"/>
|
|
<tbody>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>range</command></para></entry>
|
|
<entry colname = "2"><para>This can be one of two forms: start-stop
|
|
or start-stop/step. If the first form is used then step is set to
|
|
1. All of start, stop and step must be positive.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>lhs</command></para></entry>
|
|
<entry colname = "2"><para><command>lhs</command> describes the
|
|
owner name of the resource records to be created. Any single <command>$</command> symbols
|
|
within the <command>lhs</command> side are replaced by the iterator
|
|
value. To get a $ in the output use a double <command>$</command>,
|
|
e.g. <command>$$</command>. If the <command>lhs</command> is not
|
|
absolute, the current <command>$ORIGIN </command>is appended to
|
|
the name.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>type</command></para></entry>
|
|
<entry colname = "2"><para>At present the only supported types are
|
|
PTR, CNAME and NS.</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para><command>rhs</command></para></entry>
|
|
<entry colname = "2"><para>rhs is a domain name. It is processed
|
|
similarly to lhs.</para></entry>
|
|
</row>
|
|
</tbody>
|
|
</tgroup></informaltable>
|
|
<para>The <command>$GENERATE</command> directive is a <acronym>BIND</acronym> extension
|
|
and not part of the standard zone file format.
|
|
<note>
|
|
<simpara>It is not yet implemented in <acronym>BIND</acronym> 9.</simpara>
|
|
</note>
|
|
</para>
|
|
</sect2>
|
|
</sect1>
|
|
</chapter>
|
|
<chapter id="ch07"><title><acronym>BIND</acronym> 9 Security Considerations</title>
|
|
<sect1 id="Access_Control_Lists"><title>Access Control Lists</title>
|
|
<para>Access Control Lists (ACLs), are address match lists that
|
|
you can set up and nickname for future use in <command>allow-query</command>, <command>allow-recursion</command>, <command>blackhole</command>, <command>allow-transfer</command>,
|
|
etc.</para>
|
|
<para>Using ACLs allows you to have finer control over who can access
|
|
your nameserver, without cluttering up your config files with huge
|
|
lists of IP addresses.</para>
|
|
<para>It is a <emphasis>good idea</emphasis> to use ACLs, and to
|
|
control access to your server. Limiting access to your server by
|
|
outside parties can help prevent spoofing and DoS attacks against
|
|
your server.</para>
|
|
<para>Here is an example of how to properly apply ACLs:</para>
|
|
<programlisting>
|
|
// Set up an ACL named "bogusnets" that will block RFC1918 space,
|
|
// which is commonly used in spoofing attacks.
|
|
acl bogusnets { 0.0.0.0/8; 1.0.0.0/8; 2.0.0.0/8; 192.0.2.0/24; 224.0.0.0/3; 10.0.0.0/8; 172.16.0.0/12; 192.168.0.0/16; };
|
|
// Set up an ACL called our-nets. Replace this with the real IP numbers.
|
|
acl our-nets { x.x.x.x/24; x.x.x.x/21; };
|
|
options {
|
|
...
|
|
...
|
|
allow-query { our-nets; };
|
|
allow-recursion { our-nets; };
|
|
...
|
|
blackhole { bogusnets; };
|
|
...
|
|
};
|
|
zone "example.com" {
|
|
type master;
|
|
file "m/example.com";
|
|
allow-query { any; };
|
|
};
|
|
</programlisting>
|
|
<para>This allows recursive queries of the server from the outside
|
|
unless recursion has been previously disabled.</para>
|
|
<para>For more information on how to use ACLs to protect your server,
|
|
see the <emphasis>AUSCERT</emphasis> advisory at
|
|
<ulink url="ftp://ftp.auscert.org.au/pub/auscert/advisory/AL-1999.004.dns_dos">ftp://ftp.auscert.org.au/pub/auscert/advisory/AL-1999.004.dns_dos</ulink></para></sect1>
|
|
<sect1><title><command>chroot</command> and <command>setuid</command> (for
|
|
UNIX servers)</title>
|
|
<para>On UNIX servers, it is possible to run <acronym>BIND</acronym> in a <emphasis>chrooted</emphasis> environment
|
|
(<command>chroot()</command>) by specifying the "<option>-t</option>"
|
|
option. This can help improve system security by placing <acronym>BIND</acronym> in
|
|
a "sandbox," which will limit the damage done if a server is compromised.</para>
|
|
<para>Another useful feature in the UNIX version of <acronym>BIND</acronym> is the
|
|
ability to run the daemon as a nonprivileged user ( <option>-u</option> <replaceable>user</replaceable> ).
|
|
We suggest running as a nonprivileged user when using the <command>chroot</command> feature.</para>
|
|
<para>Here is an example command line to load <acronym>BIND</acronym> in a <command>chroot()</command> sandbox,
|
|
<command>/var/named</command>, and to run <command>named</command> <command>setuid</command> to
|
|
user 202:</para>
|
|
<para><userinput>/usr/local/bin/named -u 202 -t /var/named</userinput></para>
|
|
<sect2><title>The <command>chroot</command> Environment</title>
|
|
<para>In order for a <command>chroot()</command> environment to
|
|
work properly in a particular directory (for example, <filename>/var/named</filename>),
|
|
you will need to set up an environment that includes everything
|
|
<acronym>BIND</acronym> needs to run. From <acronym>BIND</acronym>'s point of view, <filename>/var/named</filename> is
|
|
the root of the filesystem. You will need <filename>/dev/null</filename>,
|
|
and any library directories and files that <acronym>BIND</acronym> needs to run on
|
|
your system. Please consult your operating system's instructions
|
|
if you need help figuring out which library files you need to copy
|
|
over to the <command>chroot()</command> sandbox.</para>
|
|
<para>If you are running an operating system that supports static
|
|
binaries, you can also compile <acronym>BIND</acronym> statically and avoid the need
|
|
to copy system libraries over to your <command>chroot()</command> sandbox.</para></sect2>
|
|
<sect2><title>Using the <command>setuid</command> Function </title>
|
|
<para>Prior to running the <command>named</command> daemon, use
|
|
the <command>touch</command> utility (to change file access and
|
|
modification times) or the <command>chown</command> utility (to
|
|
set the user id and/or group id) on files to which you want <acronym>BIND</acronym>
|
|
to write.</para></sect2></sect1>
|
|
<sect1><title>Dynamic Updates</title>
|
|
<para>Access to the dynamic update facility should be strictly limited.
|
|
In earlier versions of <acronym>BIND</acronym> the only way to do this was based on
|
|
the IP address of the host requesting the update. <acronym>BIND9</acronym> also
|
|
supports authenticating updates cryptographically by means of transaction
|
|
signatures (TSIG). The use of TSIG is strongly recommended.</para>
|
|
<para>Some sites choose to keep all dynamically updated DNS data
|
|
in a subdomain and delegate that subdomain to a separate zone. This
|
|
way, the top-level zone containing critical data such as the IP addresses
|
|
of public web and mail servers need not allow dynamic update at
|
|
all.</para></sect1></chapter>
|
|
|
|
<chapter id="ch08">
|
|
<title>Troubleshooting</title>
|
|
<sect1>
|
|
<title>Common Problems</title>
|
|
<sect2>
|
|
<title>It's not working; how can I figure out what's wrong?</title>
|
|
|
|
<para>The best solution to solving installation and
|
|
configuration issues is to take preventative measures by setting
|
|
up logging files beforehand (see the sample configurations in
|
|
<xref linkend="sample_configuration"/>). The log files provide a
|
|
source of hints and information that can be used to figure out
|
|
what went wrong and how to fix the problem.</para>
|
|
|
|
</sect2>
|
|
</sect1>
|
|
<sect1>
|
|
<title>Incrementing and Changing the Serial Number</title>
|
|
|
|
<para>Zone serial numbers are just numbers-they aren't date
|
|
related. A lot of people set them to a number that represents a
|
|
date, usually of the form YYYYMMDDRR. A number of people have been
|
|
testing these numbers for Y2K compliance and have set the number
|
|
to the year 2000 to see if it will work. They then try to restore
|
|
the old serial number. This will cause problems because serial
|
|
numbers are used to indicate that a zone has been updated. If the
|
|
serial number on the slave server is lower than the serial number
|
|
on the master, the slave server will attempt to update its copy of
|
|
the zone.</para>
|
|
|
|
<para>Setting the serial number to a lower number on the master
|
|
server than the slave server means that the slave will not perform
|
|
updates to its copy of the zone.</para>
|
|
|
|
<para>The solution to this is to add 2147483647 (2^31-1) to the
|
|
number, reload the zone and make sure all slaves have updated to
|
|
the new zone serial number, then reset the number to what you want
|
|
it to be, and reload the zone again.</para>
|
|
|
|
</sect1>
|
|
<sect1>
|
|
<title>Where Can I Get Help?</title>
|
|
|
|
<para>The Internet Software Consortium (<acronym>ISC</acronym>) offers a wide range
|
|
of support and service agreements for <acronym>BIND</acronym> and <acronym>DHCP</acronym> servers. Four
|
|
levels of premium support are available and each level includes
|
|
support for all <acronym>ISC</acronym> programs, significant discounts on products
|
|
and training, and a recognized priority on bug fixes and
|
|
non-funded feature requests. In addition, <acronym>ISC</acronym> offers a standard
|
|
support agreement package which includes services ranging from bug
|
|
fix announcements to remote support. It also includes training in
|
|
<acronym>BIND</acronym> and <acronym>DHCP</acronym>.</para>
|
|
|
|
<para>To discuss arrangements for support, contact
|
|
<ulink url="email:info@isc.org">info@isc.org</ulink> or visit the
|
|
<acronym>ISC</acronym> web page at <ulink
|
|
url="http://www.isc.org/services/support/">http://www.isc.org/services/support/</ulink>
|
|
to read more.</para>
|
|
</sect1>
|
|
</chapter>
|
|
<appendix id="ch09">
|
|
<title>Appendices</title>
|
|
<sect1>
|
|
<title>Acknowledgements</title>
|
|
<sect2>
|
|
<title>A Brief History of the <acronym>DNS</acronym> and <acronym>BIND</acronym></title>
|
|
|
|
<para>Although the "official" beginning of the Domain Name
|
|
System occurred in 1984 with the publication of RFC 920, the
|
|
core of the new system was described in 1983 in RFCs 882 and
|
|
883. From 1984 to 1987, the ARPAnet (the precursor to today's
|
|
Internet) became a testbed of experimentation for developing the
|
|
new naming/addressing scheme in an rapidly expanding,
|
|
operational network environment. New RFCs were written and
|
|
published in 1987 that modified the original documents to
|
|
incorporate improvements based on the working model. RFC 1034,
|
|
"Domain Names-Concepts and Facilities," and RFC 1035, "Domain
|
|
Names-Implementation and Specification" were published and
|
|
became the standards upon which all <acronym>DNS</acronym> implementations are
|
|
built.
|
|
</para>
|
|
|
|
<para>The first working domain name server, called "Jeeves," was
|
|
written in 1983-84 by Paul Mockapetris for operation on DEC Tops-20
|
|
machines located at the University of Southern California's Information
|
|
Sciences Institute (USC-ISI) and SRI International's Network Information
|
|
Center (SRI-NIC). A <acronym>DNS</acronym> server for Unix machines, the Berkeley Internet
|
|
Name Domain (<acronym>BIND</acronym>) package, was written soon after by a group of
|
|
graduate students at the University of California at Berkeley under
|
|
a grant from the US Defense Advanced Research Projects Administration
|
|
(DARPA). Versions of <acronym>BIND</acronym> through 4.8.3 were maintained by the Computer
|
|
Systems Research Group (CSRG) at UC Berkeley. Douglas Terry, Mark
|
|
Painter, David Riggle and Songnian Zhou made up the initial <acronym>BIND</acronym>
|
|
project team. After that, additional work on the software package
|
|
was done by Ralph Campbell. Kevin Dunlap, a Digital Equipment Corporation
|
|
employee on loan to the CSRG, worked on <acronym>BIND</acronym> for 2 years, from 1985
|
|
to 1987. Many other people also contributed to <acronym>BIND</acronym> development
|
|
during that time: Doug Kingston, Craig Partridge, Smoot Carl-Mitchell,
|
|
Mike Muuss, Jim Bloom and Mike Schwartz. <acronym>BIND</acronym> maintenance was subsequently
|
|
handled by Mike Karels and O. Kure.</para>
|
|
<para><acronym>BIND</acronym> versions 4.9 and 4.9.1 were released by Digital Equipment
|
|
Corporation (now Compaq Computer Corporation). Paul Vixie, then
|
|
a DEC employee, became <acronym>BIND</acronym>'s primary caretaker. Paul was assisted
|
|
by Phil Almquist, Robert Elz, Alan Barrett, Paul Albitz, Bryan Beecher, Andrew
|
|
Partan, Andy Cherenson, Tom Limoncelli, Berthold Paffrath, Fuat
|
|
Baran, Anant Kumar, Art Harkin, Win Treese, Don Lewis, Christophe
|
|
Wolfhugel, and others.</para>
|
|
<para><acronym>BIND</acronym> Version 4.9.2 was sponsored by Vixie Enterprises. Paul
|
|
Vixie became <acronym>BIND</acronym>'s principal architect/programmer.</para>
|
|
<para><acronym>BIND</acronym> versions from 4.9.3 onward have been developed and maintained
|
|
by the Internet Software Consortium with support being provided
|
|
by ISC's sponsors. As co-architects/programmers, Bob Halley and
|
|
Paul Vixie released the first production-ready version of <acronym>BIND</acronym> version
|
|
8 in May 1997.</para>
|
|
<para><acronym>BIND</acronym> development work is made possible today by the sponsorship
|
|
of several corporations, and by the tireless work efforts of numerous
|
|
individuals.</para>
|
|
</sect2>
|
|
</sect1>
|
|
<sect1 id="historical_dns_information">
|
|
<title>Historical <acronym>DNS</acronym> Information</title>
|
|
<sect2 id="classes_of_resource_records">
|
|
<title>Classes of Resource Records</title>
|
|
<sect3>
|
|
<title>HS = hesiod</title>
|
|
<para>The <optional>hesiod</optional> class is an information service
|
|
developed by MIT's Project Athena. It is used to share information
|
|
about various systems databases, such as users, groups, printers
|
|
and so on. The keyword <command>hs</command> is a synonym for
|
|
hesiod.</para>
|
|
</sect3>
|
|
<sect3>
|
|
<title>CH = chaos</title>
|
|
<para>The <command>chaos</command> class is used to specify zone
|
|
data for the MIT-developed CHAOSnet, a LAN protocol created in the
|
|
mid-1970s.</para>
|
|
</sect3>
|
|
</sect2>
|
|
</sect1>
|
|
<sect1>
|
|
<title>General <acronym>DNS</acronym> Reference Information</title>
|
|
<sect2>
|
|
<title>IPv6 addresses (A6)</title>
|
|
<para>IPv6 addresses are 128-bit identifiers for interfaces and
|
|
sets of interfaces which were introduced in the <acronym>DNS</acronym> to facilitate
|
|
scalable Internet routing. There are three types of addresses: <emphasis>Unicast</emphasis>,
|
|
an identifier for a single interface; <emphasis>Anycast</emphasis>,
|
|
an identifier for a set of interfaces; and <emphasis>Multicast</emphasis>,
|
|
an identifier for a set of interfaces. Here we describe the global
|
|
Unicast address scheme. For more information, see RFC 2374.</para>
|
|
<para>The aggregatable global Unicast address format is as follows:</para>
|
|
<informaltable colsep = "0" rowsep = "0"><tgroup cols = "6"
|
|
colsep = "0" rowsep = "0" tgroupstyle = "1Level-table">
|
|
<colspec colname = "1" colnum = "1" colsep = "0" colwidth = "0.477in"/>
|
|
<colspec colname = "2" colnum = "2" colsep = "0" colwidth = "0.501in"/>
|
|
<colspec colname = "3" colnum = "3" colsep = "0" colwidth = "0.523in"/>
|
|
<colspec colname = "4" colnum = "4" colsep = "0" colwidth = "0.731in"/>
|
|
<colspec colname = "5" colnum = "5" colsep = "0" colwidth = "1.339in"/>
|
|
<colspec colname = "6" colnum = "6" colsep = "0" colwidth = "2.529in"/>
|
|
<tbody>
|
|
<row rowsep = "0">
|
|
<entry colname = "1" colsep = "1" rowsep = "1"><para>3</para></entry>
|
|
<entry colname = "2" colsep = "1" rowsep = "1"><para>13</para></entry>
|
|
<entry colname = "3" colsep = "1" rowsep = "1"><para>8</para></entry>
|
|
<entry colname = "4" colsep = "1" rowsep = "1"><para>24</para></entry>
|
|
<entry colname = "5" colsep = "1" rowsep = "1"><para>16</para></entry>
|
|
<entry colname = "6" rowsep = "1"><para>64 bits</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1" colsep = "1"><para>FP</para></entry>
|
|
<entry colname = "2" colsep = "1"><para>TLA ID</para></entry>
|
|
<entry colname = "3" colsep = "1"><para>RES</para></entry>
|
|
<entry colname = "4" colsep = "1"><para>NLA ID</para></entry>
|
|
<entry colname = "5" colsep = "1"><para>SLA ID</para></entry>
|
|
<entry colname = "6"><para>Interface ID</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry nameend = "4" namest = "1"><para><------ Public Topology
|
|
------></para></entry>
|
|
<entry colname = "5"><para></para></entry>
|
|
<entry colname = "6"><para></para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para></para></entry>
|
|
<entry colname = "2"><para></para></entry>
|
|
<entry colname = "3"><para></para></entry>
|
|
<entry colname = "4"><para></para></entry>
|
|
<entry colname = "5"><para><-Site Topology-></para></entry>
|
|
<entry colname = "6"><para></para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para></para></entry>
|
|
<entry colname = "2"><para></para></entry>
|
|
<entry colname = "3"><para></para></entry>
|
|
<entry colname = "4"><para></para></entry>
|
|
<entry colname = "5"><para></para></entry>
|
|
<entry colname = "6"><para><------ Interface Identifier ------></para></entry>
|
|
</row>
|
|
</tbody>
|
|
</tgroup></informaltable>
|
|
<para>Where
|
|
<informaltable colsep = "0" rowsep = "0"><tgroup
|
|
cols = "3" colsep = "0" rowsep = "0" tgroupstyle = "2Level-table">
|
|
<colspec colname = "1" colnum = "1" colsep = "0" colwidth = "1.375in"/>
|
|
<colspec colname = "2" colnum = "2" colsep = "0" colwidth = "0.250in"/>
|
|
<colspec colname = "3" colnum = "3" colsep = "0" colwidth = "3.500in"/>
|
|
<tbody>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para>FP</para></entry>
|
|
<entry colname = "2"><para>=</para></entry>
|
|
<entry colname = "3"><para>Format Prefix (001)</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para>TLA ID</para></entry>
|
|
<entry colname = "2"><para>=</para></entry>
|
|
<entry colname = "3"><para>Top-Level Aggregation Identifier</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para>RES</para></entry>
|
|
<entry colname = "2"><para>=</para></entry>
|
|
<entry colname = "3"><para>Reserved for future use</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para>NLA ID</para></entry>
|
|
<entry colname = "2"><para>=</para></entry>
|
|
<entry colname = "3"><para>Next-Level Aggregation Identifier</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para>SLA ID</para></entry>
|
|
<entry colname = "2"><para>=</para></entry>
|
|
<entry colname = "3"><para>Site-Level Aggregation Identifier</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1"><para>INTERFACE ID</para></entry>
|
|
<entry colname = "2"><para>=</para></entry>
|
|
<entry colname = "3"><para>Interface Identifier</para></entry>
|
|
</row>
|
|
</tbody>
|
|
</tgroup></informaltable></para>
|
|
<para>The <emphasis>Public Topology</emphasis> is provided by the
|
|
upstream provider or ISP, and (roughly) corresponds to the IPv4 <emphasis>network</emphasis> section
|
|
of the address range. The <emphasis>Site Topology</emphasis> is
|
|
where you can subnet this space, much the same as subnetting an
|
|
IPv4 /16 network into /24 subnets. The <emphasis>Interface Identifier</emphasis> is
|
|
the address of an individual interface on a given network. (With
|
|
IPv6, addresses belong to interfaces rather than machines.)</para>
|
|
<para>The subnetting capability of IPv6 is much more flexible than
|
|
that of IPv4: subnetting can now be carried out on bit boundaries,
|
|
in much the same way as Classless InterDomain Routing (CIDR).</para>
|
|
<para>The internal structure of the Public Topology for an A6 global
|
|
unicast address consists of:</para>
|
|
<informaltable colsep = "0" rowsep = "0"><tgroup cols = "4"
|
|
colsep = "0" rowsep = "0" tgroupstyle = "2Level-table">
|
|
<colspec colname = "1" colnum = "1" colsep = "0" colwidth = "0.506in"/>
|
|
<colspec colname = "2" colnum = "2" colsep = "0" colwidth = "0.662in"/>
|
|
<colspec colname = "3" colnum = "3" colsep = "0" colwidth = "0.556in"/>
|
|
<colspec colname = "4" colnum = "4" colsep = "0" colwidth = "0.825in"/>
|
|
<tbody>
|
|
<row rowsep = "0">
|
|
<entry colname = "1" colsep = "1" rowsep = "1"><para>3</para></entry>
|
|
<entry colname = "2" colsep = "1" rowsep = "1"><para>13</para></entry>
|
|
<entry colname = "3" colsep = "1" rowsep = "1"><para>8</para></entry>
|
|
<entry colname = "4" rowsep = "1"><para>24</para></entry>
|
|
</row>
|
|
<row rowsep = "0">
|
|
<entry colname = "1" colsep = "1"><para>FP</para></entry>
|
|
<entry colname = "2" colsep = "1"><para>TLA ID</para></entry>
|
|
<entry colname = "3" colsep = "1"><para>RES</para></entry>
|
|
<entry colname = "4"><para>NLA ID</para></entry>
|
|
</row>
|
|
</tbody>
|
|
</tgroup></informaltable>
|
|
<para>A 3 bit FP (Format Prefix) of 001 indicates this is a global
|
|
Unicast address. FP lengths for other types of addresses may vary.</para>
|
|
<para>13 TLA (Top Level Aggregator) bits give the prefix of your
|
|
top-level IP backbone carrier.</para>
|
|
<para>8 Reserved bits</para>
|
|
<para>24 bits for Next Level Aggregators. This allows organizations
|
|
with a TLA to hand out portions of their IP space to client organizations,
|
|
so that the client can then split up the network further by filling
|
|
in more NLA bits, and hand out IPv6 prefixes to their clients, and
|
|
so forth.</para>
|
|
<para>There is no particular structure for the Site topology section.
|
|
Organizations can allocate these bits in any way they desire.</para>
|
|
<para>The Interface Identifier must be unique on that network. On
|
|
ethernet networks, one way to ensure this is to set the address
|
|
to the first three bytes of the hardware address, "FFFE", then the
|
|
last three bytes of the hardware address. The lowest significant
|
|
bit of the first byte should then be complemented. Addresses are
|
|
written as 32-bit blocks separated with a colon, and leading zeros
|
|
of a block may be omitted, for example:</para>
|
|
<para><command>3ffe:8050:201:9:a00:20ff:fe81:2b32</command></para>
|
|
<para>IPv6 address specifications are likely to contain long strings
|
|
of zeros, so the architects have included a shorthand for specifying
|
|
them. The double colon (`::') indicates the longest possible string
|
|
of zeros that can fit, and can be used only once in an address.</para>
|
|
</sect2>
|
|
</sect1>
|
|
<sect1 id="bibliography">
|
|
<title>Bibliography (and Suggested Reading)</title>
|
|
<sect2 id="rfcs">
|
|
<title>Request for Comments (RFCs)</title>
|
|
<para>Specification documents for the Internet protocol suite, including
|
|
the <acronym>DNS</acronym>, are published as part of the Request for Comments (RFCs)
|
|
series of technical notes. The standards themselves are defined
|
|
by the Internet Engineering Task Force (IETF) and the Internet Engineering
|
|
Steering Group (IESG). RFCs can be obtained online via FTP at
|
|
<ulink url="ftp://www.isi.edu/in-notes/">ftp://www.isi.edu/in-notes/RFC<replaceable>xxx</replaceable>.txt</ulink> (where <replaceable>xxx</replaceable> is
|
|
the number of the RFC). RFCs are also available via the Web at <ulink
|
|
url="http://www.ietf.org/rfc/">http://www.ietf.org/rfc/</ulink>.</para>
|
|
<bibliography>
|
|
<bibliodiv>
|
|
<!-- one of (BIBLIOENTRY BIBLIOMIXED) -->
|
|
<title>Standards</title>
|
|
<biblioentry>
|
|
<abbrev>RFC974</abbrev>
|
|
<author>
|
|
<surname>Partridge</surname>
|
|
<firstname>C.</firstname>
|
|
</author>
|
|
<title>Mail Routing and the Domain System</title>
|
|
<pubdate>January 1986</pubdate>
|
|
</biblioentry>
|
|
<biblioentry>
|
|
<abbrev>RFC1034</abbrev>
|
|
<author>
|
|
<surname>Mockapetris</surname>
|
|
<firstname>P.V.</firstname>
|
|
</author>
|
|
<title>Domain Names — Concepts and Facilities</title>
|
|
<pubdate>November 1987</pubdate>
|
|
</biblioentry>
|
|
<biblioentry>
|
|
<abbrev>RFC1035</abbrev>
|
|
<author>
|
|
<surname>Mockapetris</surname>
|
|
<firstname>P. V.</firstname>
|
|
</author> <title>Domain Names — Implementation and
|
|
Specification</title>
|
|
<pubdate>November 1987</pubdate>
|
|
</biblioentry>
|
|
</bibliodiv>
|
|
<bibliodiv id="proposed_standards" xreflabel="Proposed Standards">
|
|
|
|
<title>Proposed Standards</title>
|
|
<!-- one of (BIBLIOENTRY BIBLIOMIXED) -->
|
|
<biblioentry>
|
|
<abbrev>RFC2181</abbrev>
|
|
<author>
|
|
<surname>Elz</surname>
|
|
<firstname>R., R. Bush</firstname>
|
|
</author>
|
|
<title>Clarifications to the <acronym>DNS</acronym> Specification</title>
|
|
<pubdate>July 1997</pubdate>
|
|
</biblioentry>
|
|
<biblioentry>
|
|
<abbrev>RFC2308</abbrev>
|
|
<author>
|
|
<surname>Andrews</surname>
|
|
<firstname>M.</firstname>
|
|
</author>
|
|
<title>Negative Caching of <acronym>DNS</acronym> Queries</title>
|
|
<pubdate>March 1998</pubdate>
|
|
</biblioentry>
|
|
<biblioentry>
|
|
<abbrev>RFC1995</abbrev>
|
|
<author>
|
|
<surname>Ohta</surname>
|
|
<firstname>M.</firstname>
|
|
</author>
|
|
<title>Incremental Zone Transfer in <acronym>DNS</acronym></title>
|
|
<pubdate>August 1996</pubdate>
|
|
</biblioentry>
|
|
<biblioentry>
|
|
<abbrev>RFC1996</abbrev>
|
|
<author>
|
|
<surname>Vixie</surname>
|
|
<firstname>P.</firstname>
|
|
</author>
|
|
<title>A Mechanism for Prompt Notification of Zone Changes</title>
|
|
<pubdate>August 1996</pubdate>
|
|
</biblioentry>
|
|
<biblioentry>
|
|
<abbrev>RFC2136</abbrev>
|
|
<authorgroup>
|
|
<author>
|
|
<surname>Vixie</surname>
|
|
<firstname>P.</firstname>
|
|
</author>
|
|
<author>
|
|
<firstname>S.</firstname>
|
|
<surname>Thomson</surname>
|
|
</author>
|
|
<author>
|
|
<firstname>Y.</firstname>
|
|
<surname>Rekhter</surname>
|
|
</author>
|
|
<author>
|
|
<firstname>J.</firstname>
|
|
<surname>Bound</surname>
|
|
</author>
|
|
</authorgroup>
|
|
<title>Dynamic Updates in the Domain Name System</title>
|
|
<pubdate>April 1997</pubdate>
|
|
</biblioentry>
|
|
<biblioentry>
|
|
<abbrev>RFC2845</abbrev>
|
|
<authorgroup>
|
|
<author>
|
|
<surname>Vixie</surname>
|
|
<firstname>P.</firstname>
|
|
</author>
|
|
<author>
|
|
<firstname>O.</firstname>
|
|
<surname>Gudmundsson</surname>
|
|
</author>
|
|
<author>
|
|
<firstname>D.</firstname>
|
|
<surname>Eastlake</surname>
|
|
<lineage>3rd</lineage></author>
|
|
<author>
|
|
<firstname>B.</firstname>
|
|
<surname>Wellington</surname>
|
|
</author></authorgroup>
|
|
<title>Secret Key Transaction Authentication for <acronym>DNS</acronym> (TSIG)</title>
|
|
<pubdate>May 2000</pubdate>
|
|
</biblioentry>
|
|
</bibliodiv>
|
|
<bibliodiv>
|
|
<title>Proposed Standards Still Under Development</title>
|
|
<note>
|
|
<para><emphasis>Note:</emphasis> the following list of
|
|
RFCs are undergoing major revision by the IETF.</para>
|
|
</note>
|
|
<biblioentry>
|
|
<abbrev>RFC1886</abbrev>
|
|
<authorgroup>
|
|
<author>
|
|
<surname>Thomson</surname>
|
|
<firstname>S.</firstname>
|
|
</author>
|
|
<author>
|
|
<firstname>C.</firstname>
|
|
<surname>Huitema</surname>
|
|
</author>
|
|
</authorgroup>
|
|
<title><acronym>DNS</acronym> Extensions to support IP version 6</title>
|
|
<pubdate>December 1995</pubdate>
|
|
</biblioentry>
|
|
<biblioentry>
|
|
<abbrev>RFC2065</abbrev>
|
|
<authorgroup>
|
|
<author>
|
|
<surname>Eastlake</surname>
|
|
<lineage>3rd</lineage>
|
|
<firstname>D.</firstname>
|
|
</author>
|
|
<author>
|
|
<firstname>C.</firstname>
|
|
<surname>Kaufman</surname>
|
|
</author>
|
|
</authorgroup>
|
|
<title>Domain Name System Security Extensions</title>
|
|
<pubdate>January 1997</pubdate>
|
|
</biblioentry>
|
|
<biblioentry>
|
|
<abbrev>RFC2137</abbrev>
|
|
<author>
|
|
<surname>Eastlake</surname>
|
|
<lineage>3rd</lineage>
|
|
<firstname>D.</firstname>
|
|
</author>
|
|
<title>Secure Domain Name System Dynamic Update</title>
|
|
<pubdate>April 1997</pubdate>
|
|
</biblioentry>
|
|
</bibliodiv>
|
|
<bibliodiv>
|
|
<title>Other Important RFCs About <acronym>DNS</acronym> Implementation</title>
|
|
<biblioentry>
|
|
<abbrev>RFC1535</abbrev>
|
|
<author>
|
|
<surname>Gavron</surname>
|
|
<firstname>E.</firstname>
|
|
</author>
|
|
<title>A Security Problem and Proposed Correction With Widely Deployed <acronym>DNS</acronym> Software.</title>
|
|
<pubdate>October 1993</pubdate>
|
|
</biblioentry>
|
|
<biblioentry>
|
|
<abbrev>RFC1536</abbrev>
|
|
<authorgroup>
|
|
<author>
|
|
<surname>Kumar</surname>
|
|
<firstname>A.</firstname>
|
|
</author>
|
|
<author>
|
|
<firstname>J.</firstname>
|
|
<surname>Postel</surname>
|
|
</author>
|
|
<author>
|
|
<firstname>C.</firstname>
|
|
<surname>Neuman</surname></author>
|
|
<author>
|
|
<firstname>P.</firstname>
|
|
<surname>Danzig</surname>
|
|
</author>
|
|
<author>
|
|
<firstname>S.</firstname>
|
|
<surname>Miller</surname>
|
|
</author>
|
|
</authorgroup>
|
|
<title>Common <acronym>DNS</acronym> Implementation Errors and Suggested Fixes</title>
|
|
<pubdate>October 1993</pubdate>
|
|
</biblioentry>
|
|
<biblioentry>
|
|
<abbrev>RFC1982</abbrev>
|
|
<authorgroup>
|
|
<author>
|
|
<surname>Elz</surname>
|
|
<firstname>R.</firstname>
|
|
</author>
|
|
<author>
|
|
<firstname>R.</firstname>
|
|
<surname>Bush</surname>
|
|
</author>
|
|
</authorgroup>
|
|
<title>Serial Number Arithmetic</title>
|
|
<pubdate>August 1996</pubdate>
|
|
</biblioentry>
|
|
</bibliodiv>
|
|
<bibliodiv>
|
|
<title>Resource Record Types</title>
|
|
<biblioentry>
|
|
<abbrev>RFC1183</abbrev>
|
|
<authorgroup>
|
|
<author>
|
|
<surname>Everhart</surname>
|
|
<firstname>C.F.</firstname>
|
|
</author>
|
|
<author>
|
|
<firstname>L. A.</firstname>
|
|
<surname>Mamakos</surname>
|
|
</author>
|
|
<author>
|
|
<firstname>R.</firstname>
|
|
<surname>Ullmann</surname>
|
|
</author>
|
|
<author>
|
|
<firstname>P.</firstname>
|
|
<surname>Mockapetris</surname>
|
|
</author>
|
|
</authorgroup>
|
|
<title>New <acronym>DNS</acronym> RR Definitions</title>
|
|
<pubdate>October 1990</pubdate>
|
|
</biblioentry>
|
|
<biblioentry>
|
|
<abbrev>RFC1706</abbrev>
|
|
<authorgroup>
|
|
<author>
|
|
<surname>Manning</surname>
|
|
<firstname>B.</firstname>
|
|
</author>
|
|
<author>
|
|
<firstname>R.</firstname>
|
|
<surname>Colella</surname>
|
|
</author>
|
|
</authorgroup>
|
|
<title><acronym>DNS</acronym> NSAP Resource Records</title>
|
|
<pubdate>October 1994</pubdate>
|
|
</biblioentry>
|
|
<biblioentry>
|
|
<abbrev>RFC2168</abbrev>
|
|
<authorgroup>
|
|
<author>
|
|
<surname>Daniel</surname>
|
|
<firstname>R.</firstname>
|
|
</author>
|
|
<author>
|
|
<firstname>M.</firstname>
|
|
<surname>Mealling</surname>
|
|
</author>
|
|
</authorgroup>
|
|
<title>Resolution of Uniform Resource Identifiers using
|
|
the Domain Name System</title>
|
|
<pubdate>June 1997</pubdate>
|
|
</biblioentry>
|
|
<biblioentry>
|
|
<abbrev>RFC1876</abbrev>
|
|
<authorgroup>
|
|
<author>
|
|
<surname>Davis</surname>
|
|
<firstname>C.</firstname>
|
|
</author>
|
|
<author>
|
|
<firstname>P.</firstname>
|
|
<surname>Vixie</surname>
|
|
</author>
|
|
<author>
|
|
<firstname>T.</firstname>
|
|
<firstname>Goodwin</firstname>
|
|
</author>
|
|
<author>
|
|
<firstname>I.</firstname>
|
|
<surname>Dickinson</surname>
|
|
</author>
|
|
</authorgroup>
|
|
<title>A Means for Expressing Location Information in the Domain
|
|
Name System</title>
|
|
<pubdate>January 1996</pubdate>
|
|
</biblioentry>
|
|
<biblioentry>
|
|
<abbrev>RFC2052</abbrev>
|
|
<authorgroup>
|
|
<author>
|
|
<surname>Gulbrandsen</surname>
|
|
<firstname>A.</firstname>
|
|
</author>
|
|
<author>
|
|
<firstname>P.</firstname>
|
|
<surname>Vixie</surname>
|
|
</author>
|
|
</authorgroup>
|
|
<title>A <acronym>DNS</acronym> RR for Specifying the Location of
|
|
Services.</title>
|
|
<pubdate>October 1996</pubdate>
|
|
</biblioentry>
|
|
<biblioentry>
|
|
<abbrev>RFC2163</abbrev>
|
|
<author>
|
|
<surname>Allocchio</surname>
|
|
<firstname>A.</firstname>
|
|
</author>
|
|
<title>Using the Internet <acronym>DNS</acronym> to Distribute MIXER
|
|
Conformant Global Address Mapping</title>
|
|
<pubdate>January 1998</pubdate>
|
|
</biblioentry>
|
|
<biblioentry>
|
|
<abbrev>RFC2230</abbrev>
|
|
<author>
|
|
<surname>Atkinson</surname>
|
|
<firstname>R.</firstname>
|
|
</author>
|
|
<title>Key Exchange Delegation Record for the <acronym>DNS</acronym></title>
|
|
<pubdate>October 1997</pubdate>
|
|
</biblioentry>
|
|
</bibliodiv>
|
|
<bibliodiv>
|
|
<title><acronym>DNS</acronym> and the Internet</title>
|
|
<biblioentry>
|
|
<abbrev>RFC1101</abbrev>
|
|
<author>
|
|
<surname>Mockapetris</surname>
|
|
<firstname>P. V.</firstname>
|
|
</author>
|
|
<title><acronym>DNS</acronym> Encoding of Network Names and Other Types</title>
|
|
<pubdate>April 1989</pubdate>
|
|
</biblioentry>
|
|
<biblioentry>
|
|
<abbrev>RFC1123</abbrev>
|
|
<author>
|
|
<surname>Braden</surname>
|
|
<surname>R.</surname>
|
|
</author>
|
|
<title>Requirements for Internet Hosts - Application and Support</title>
|
|
<pubdate>October 1989</pubdate>
|
|
</biblioentry>
|
|
<biblioentry>
|
|
<abbrev>RFC1591</abbrev>
|
|
<author>
|
|
<surname>Postel</surname>
|
|
<firstname>J.</firstname></author>
|
|
<title>Domain Name System Structure and Delegation</title>
|
|
<pubdate>March 1994</pubdate></biblioentry>
|
|
<biblioentry>
|
|
<abbrev>RFC2317</abbrev>
|
|
<authorgroup>
|
|
<author>
|
|
<surname>Eidnes</surname>
|
|
<firstname>H.</firstname>
|
|
</author>
|
|
<author>
|
|
<firstname>G.</firstname>
|
|
<surname>de Groot</surname>
|
|
</author>
|
|
<author>
|
|
<firstname>P.</firstname>
|
|
<surname>Vixie</surname>
|
|
</author>
|
|
</authorgroup>
|
|
<title>Classless IN-ADDR.ARPA Delegation</title>
|
|
<pubdate>March 1998</pubdate>
|
|
</biblioentry>
|
|
</bibliodiv>
|
|
<bibliodiv>
|
|
<title><acronym>DNS</acronym> Operations</title>
|
|
<biblioentry>
|
|
<abbrev>RFC1537</abbrev>
|
|
<author>
|
|
<surname>Beertema</surname>
|
|
<firstname>P.</firstname>
|
|
</author>
|
|
<title>Common <acronym>DNS</acronym> Data File Configuration Errors</title>
|
|
<pubdate>October 1993</pubdate>
|
|
</biblioentry>
|
|
<biblioentry>
|
|
<abbrev>RFC1912</abbrev>
|
|
<author>
|
|
<surname>Barr</surname>
|
|
<firstname>D.</firstname>
|
|
</author>
|
|
<title>Common <acronym>DNS</acronym> Operational and Configuration Errors</title>
|
|
<pubdate>February 1996</pubdate>
|
|
</biblioentry>
|
|
<biblioentry>
|
|
<abbrev>RFC1912</abbrev>
|
|
<author>
|
|
<surname>Barr</surname>
|
|
<firstname>D.</firstname>
|
|
</author>
|
|
<title>Common <acronym>DNS</acronym> Operational and Configuration Errors</title>
|
|
<pubdate>February 1996</pubdate>
|
|
</biblioentry>
|
|
<biblioentry>
|
|
<abbrev>RFC2010</abbrev>
|
|
<authorgroup>
|
|
<author>
|
|
<surname>Manning</surname>
|
|
<firstname>B.</firstname>
|
|
</author>
|
|
<author>
|
|
<firstname>P.</firstname>
|
|
<surname>Vixie</surname>
|
|
</author>
|
|
</authorgroup>
|
|
<title>Operational Criteria for Root Name Servers.</title>
|
|
<pubdate>October 1996</pubdate>
|
|
</biblioentry>
|
|
<biblioentry>
|
|
<abbrev>RFC2219</abbrev>
|
|
<authorgroup>
|
|
<author>
|
|
<surname>Hamilton</surname>
|
|
<firstname>M.</firstname>
|
|
</author>
|
|
<author>
|
|
<firstname>R.</firstname>
|
|
<surname>Wright</surname>
|
|
</author>
|
|
</authorgroup>
|
|
<title>Use of <acronym>DNS</acronym> Aliases for Network Services.</title>
|
|
<pubdate>October 1997</pubdate>
|
|
</biblioentry>
|
|
</bibliodiv>
|
|
<bibliodiv>
|
|
<title>Other <acronym>DNS</acronym>-related RFCs</title>
|
|
<note>
|
|
<para>Note: the following list of RFCs, although
|
|
<acronym>DNS</acronym>-related, are not concerned with implementing software.</para>
|
|
</note>
|
|
<biblioentry>
|
|
<abbrev>RFC1464</abbrev>
|
|
<author>
|
|
<surname>Rosenbaum</surname>
|
|
<firstname>R.</firstname>
|
|
</author>
|
|
<title>Using the Domain Name System To Store Arbitrary String Attributes</title>
|
|
<pubdate>May 1993</pubdate>
|
|
</biblioentry>
|
|
<biblioentry>
|
|
<abbrev>RFC1713</abbrev>
|
|
<author>
|
|
<surname>Romao</surname>
|
|
<firstname>A.</firstname>
|
|
</author>
|
|
<title>Tools for <acronym>DNS</acronym> Debugging</title>
|
|
<pubdate>November 1994</pubdate></biblioentry>
|
|
<biblioentry>
|
|
<abbrev>RFC1794</abbrev>
|
|
<author>
|
|
<surname>Brisco</surname>
|
|
<firstname>T.</firstname>
|
|
</author>
|
|
<title><acronym>DNS</acronym> Support for Load Balancing</title>
|
|
<pubdate>April 1995</pubdate>
|
|
</biblioentry>
|
|
<biblioentry>
|
|
<abbrev>RFC2240</abbrev>
|
|
<author>
|
|
<surname>Vaughan</surname>
|
|
<firstname>O.</firstname></author>
|
|
<title>A Legal Basis for Domain Name Allocation</title>
|
|
<pubdate>November 1997</pubdate>
|
|
</biblioentry>
|
|
<biblioentry>
|
|
<abbrev>RFC2345</abbrev>
|
|
<authorgroup>
|
|
<author>
|
|
<surname>Klensin</surname>
|
|
<firstname>J.</firstname>
|
|
</author>
|
|
<author>
|
|
<firstname>T.</firstname>
|
|
<surname>Wolf</surname>
|
|
</author>
|
|
<author>
|
|
<firstname>G.</firstname>
|
|
<surname>Oglesby</surname>
|
|
</author>
|
|
</authorgroup>
|
|
<title>Domain Names and Company Name Retrieval</title>
|
|
<pubdate>May 1998</pubdate>
|
|
</biblioentry>
|
|
<biblioentry>
|
|
<abbrev>RFC2352</abbrev>
|
|
<author>
|
|
<surname>Vaughan</surname>
|
|
<firstname>O.</firstname>
|
|
</author>
|
|
<title>A Convention For Using Legal Names as Domain Names</title>
|
|
<pubdate>May 1998</pubdate>
|
|
</biblioentry>
|
|
</bibliodiv>
|
|
<bibliodiv>
|
|
<title>Obsolete and Unimplemented Experimental RRs</title>
|
|
<biblioentry>
|
|
<abbrev>RFC1712</abbrev>
|
|
<authorgroup>
|
|
<author>
|
|
<surname>Farrell</surname>
|
|
<firstname>C.</firstname>
|
|
</author>
|
|
<author>
|
|
<firstname>M.</firstname>
|
|
<surname>Schulze</surname>
|
|
</author>
|
|
<author>
|
|
<firstname>S.</firstname>
|
|
<surname>Pleitner</surname>
|
|
</author>
|
|
<author>
|
|
<firstname>D.</firstname>
|
|
<surname>Baldoni</surname>
|
|
</author>
|
|
</authorgroup>
|
|
<title><acronym>DNS</acronym> Encoding of Geographical
|
|
Location</title>
|
|
<pubdate>November 1994</pubdate>
|
|
</biblioentry>
|
|
</bibliodiv>
|
|
</bibliography>
|
|
</sect2>
|
|
<sect2 id="internet_drafts">
|
|
<title>Internet Drafts</title>
|
|
<para>Internet Drafts (IDs) are rough-draft working documents of
|
|
the Internet Engineering Task Force. They are, in essence, RFCs
|
|
in the preliminary stages of development. Implementors are cautioned not
|
|
to regard IDs as archival, and they should not be quoted or cited
|
|
in any formal documents unless accompanied by the disclaimer that
|
|
they are "works in progress." IDs have a lifespan of six months
|
|
after which they are deleted unless updated by their authors.
|
|
</para>
|
|
</sect2>
|
|
<sect2>
|
|
<title>Other Documents About <acronym>BIND</acronym></title>
|
|
<para></para>
|
|
<bibliography>
|
|
<biblioentry>
|
|
<authorgroup>
|
|
<author>
|
|
<surname>Albitz</surname>
|
|
<firstname>Paul</firstname>
|
|
</author>
|
|
<author>
|
|
<firstname>Cricket</firstname>
|
|
<surname>Liu</surname>
|
|
</author>
|
|
</authorgroup>
|
|
<title><acronym>DNS</acronym> and <acronym>BIND</acronym></title>
|
|
<copyright>
|
|
<year>1998</year>
|
|
<holder>Sebastopol, CA: O'Reilly and Associates</holder>
|
|
</copyright>
|
|
</biblioentry>
|
|
</bibliography>
|
|
</sect2>
|
|
</sect1>
|
|
</appendix>
|
|
|
|
</book>
|
|
|
|
|
|
|