Inhaltsverzeichnis

ISC BIND Nameserver unter CentOS 7.x

Mit BIND1) des Internet Systems Consortium richten wir uns für unsere (Kunden-)Umgebung/-LAN ein Domain-Name-System-Server oder kurz DNS2)ein.

DNS wurde in den beiden RFC 1034 und RFC 1035 definiert und bekam von der Internet Assigned Numbers Authority die beiden Ports 53/UDP und 53/TCP.

In dem sehr ausführlichen Wikipedia-Artikel findet man eine ausführliche Beschreibung rund um den Nameserver ISC-Bind, dem u.a. weltweit am meisten eingesetzten Nameserver sowie bei den weltweiten Root-Nameservern.

Installation

Zu erst installieren wir uns die beiden Pakete bind und bind-chroot. Letzters hilft uns, unseren DNS in einem chroot3)-Umgebung laufen zu lassen. Für die Anfragen an unseren DNS-Server installieren wir uns dann noch das Paket bind-utils, falls es nicht schon bei der Grundinstallation unseres Servers als Basispaket mit installiert wurde.

 # yum install bind bind-chroot bind-utils -y

RPM-Pakete

Bei Bedarf, um z.B. zu erfahren welche Dateien installiert und wohin diese gespeichert wurden, werfen wir einen Blick in die soeben installierten RPM-Pakete. Hierzu nutzen wir wie immer den Befehl rpm mit der Option -qil.

bind

 # rpm -qil bind
Name        : bind
Epoch       : 32
Version     : 9.9.4
Release     : 51.el7_4.1
Architecture: x86_64
Install Date: Thu 28 Dec 2017 05:25:27 PM CET
Group       : System Environment/Daemons
Size        : 4552573
License     : ISC
Signature   : RSA/SHA256, Sat 02 Dec 2017 03:33:24 PM CET, Key ID 24c6a8a7f4a80eb5
Source RPM  : bind-9.9.4-51.el7_4.1.src.rpm
Build Date  : Thu 30 Nov 2017 08:30:11 PM CET
Build Host  : c1bm.rdu2.centos.org
Relocations : (not relocatable)
Packager    : CentOS BuildSystem <http://bugs.centos.org>
Vendor      : CentOS
URL         : http://www.isc.org/products/BIND/
Summary     : The Berkeley Internet Name Domain (BIND) DNS (Domain Name System) server
Description :
BIND (Berkeley Internet Name Domain) is an implementation of the DNS
(Domain Name System) protocols. BIND includes a DNS server (named),
which resolves host names to IP addresses; a resolver library
(routines for applications to use when interfacing with DNS); and
tools for verifying that the DNS server is operating properly.
/etc/logrotate.d/named
/etc/named
/etc/named.conf
/etc/named.iscdlv.key
/etc/named.rfc1912.zones
/etc/named.root.key
/etc/rndc.conf
/etc/rndc.key
/etc/rwtab.d/named
/etc/sysconfig/named
/run/named
/usr/lib/systemd/system/named-setup-rndc.service
/usr/lib/systemd/system/named.service
/usr/lib/tmpfiles.d/named.conf
/usr/lib64/bind
/usr/libexec/generate-rndc-key.sh
/usr/sbin/arpaname
/usr/sbin/ddns-confgen
/usr/sbin/dnssec-checkds
/usr/sbin/dnssec-coverage
/usr/sbin/dnssec-dsfromkey
/usr/sbin/dnssec-importkey
/usr/sbin/dnssec-keyfromlabel
/usr/sbin/dnssec-keygen
/usr/sbin/dnssec-revoke
/usr/sbin/dnssec-settime
/usr/sbin/dnssec-signzone
/usr/sbin/dnssec-verify
/usr/sbin/genrandom
/usr/sbin/isc-hmac-fixup
/usr/sbin/lwresd
/usr/sbin/named
/usr/sbin/named-checkconf
/usr/sbin/named-checkzone
/usr/sbin/named-compilezone
/usr/sbin/named-journalprint
/usr/sbin/nsec3hash
/usr/sbin/rndc
/usr/sbin/rndc-confgen
/usr/share/doc/bind-9.9.4
/usr/share/doc/bind-9.9.4/Bv9ARM.ch01.html
/usr/share/doc/bind-9.9.4/Bv9ARM.ch02.html
/usr/share/doc/bind-9.9.4/Bv9ARM.ch03.html
/usr/share/doc/bind-9.9.4/Bv9ARM.ch04.html
/usr/share/doc/bind-9.9.4/Bv9ARM.ch05.html
/usr/share/doc/bind-9.9.4/Bv9ARM.ch06.html
/usr/share/doc/bind-9.9.4/Bv9ARM.ch07.html
/usr/share/doc/bind-9.9.4/Bv9ARM.ch08.html
/usr/share/doc/bind-9.9.4/Bv9ARM.ch09.html
/usr/share/doc/bind-9.9.4/Bv9ARM.ch10.html
/usr/share/doc/bind-9.9.4/Bv9ARM.html
/usr/share/doc/bind-9.9.4/Bv9ARM.pdf
/usr/share/doc/bind-9.9.4/CHANGES
/usr/share/doc/bind-9.9.4/README
/usr/share/doc/bind-9.9.4/isc-logo.pdf
/usr/share/doc/bind-9.9.4/man.arpaname.html
/usr/share/doc/bind-9.9.4/man.ddns-confgen.html
/usr/share/doc/bind-9.9.4/man.dig.html
/usr/share/doc/bind-9.9.4/man.dnssec-checkds.html
/usr/share/doc/bind-9.9.4/man.dnssec-coverage.html
/usr/share/doc/bind-9.9.4/man.dnssec-dsfromkey.html
/usr/share/doc/bind-9.9.4/man.dnssec-keyfromlabel.html
/usr/share/doc/bind-9.9.4/man.dnssec-keygen.html
/usr/share/doc/bind-9.9.4/man.dnssec-revoke.html
/usr/share/doc/bind-9.9.4/man.dnssec-settime.html
/usr/share/doc/bind-9.9.4/man.dnssec-signzone.html
/usr/share/doc/bind-9.9.4/man.dnssec-verify.html
/usr/share/doc/bind-9.9.4/man.genrandom.html
/usr/share/doc/bind-9.9.4/man.host.html
/usr/share/doc/bind-9.9.4/man.isc-hmac-fixup.html
/usr/share/doc/bind-9.9.4/man.named-checkconf.html
/usr/share/doc/bind-9.9.4/man.named-checkzone.html
/usr/share/doc/bind-9.9.4/man.named-journalprint.html
/usr/share/doc/bind-9.9.4/man.named.html
/usr/share/doc/bind-9.9.4/man.nsec3hash.html
/usr/share/doc/bind-9.9.4/man.nsupdate.html
/usr/share/doc/bind-9.9.4/man.rndc-confgen.html
/usr/share/doc/bind-9.9.4/man.rndc.conf.html
/usr/share/doc/bind-9.9.4/man.rndc.html
/usr/share/doc/bind-9.9.4/named.conf.default
/usr/share/doc/bind-9.9.4/sample
/usr/share/doc/bind-9.9.4/sample/etc
/usr/share/doc/bind-9.9.4/sample/etc/named.conf
/usr/share/doc/bind-9.9.4/sample/etc/named.rfc1912.zones
/usr/share/doc/bind-9.9.4/sample/var
/usr/share/doc/bind-9.9.4/sample/var/named
/usr/share/doc/bind-9.9.4/sample/var/named/data
/usr/share/doc/bind-9.9.4/sample/var/named/my.external.zone.db
/usr/share/doc/bind-9.9.4/sample/var/named/my.internal.zone.db
/usr/share/doc/bind-9.9.4/sample/var/named/named.ca
/usr/share/doc/bind-9.9.4/sample/var/named/named.empty
/usr/share/doc/bind-9.9.4/sample/var/named/named.localhost
/usr/share/doc/bind-9.9.4/sample/var/named/named.loopback
/usr/share/doc/bind-9.9.4/sample/var/named/slaves
/usr/share/doc/bind-9.9.4/sample/var/named/slaves/my.ddns.internal.zone.db
/usr/share/doc/bind-9.9.4/sample/var/named/slaves/my.slave.internal.zone.db
/usr/share/man/man1/arpaname.1.gz
/usr/share/man/man5/named.conf.5.gz
/usr/share/man/man5/rndc.conf.5.gz
/usr/share/man/man8/ddns-confgen.8.gz
/usr/share/man/man8/dnssec-checkds.8.gz
/usr/share/man/man8/dnssec-coverage.8.gz
/usr/share/man/man8/dnssec-dsfromkey.8.gz
/usr/share/man/man8/dnssec-keyfromlabel.8.gz
/usr/share/man/man8/dnssec-keygen.8.gz
/usr/share/man/man8/dnssec-revoke.8.gz
/usr/share/man/man8/dnssec-settime.8.gz
/usr/share/man/man8/dnssec-signzone.8.gz
/usr/share/man/man8/dnssec-verify.8.gz
/usr/share/man/man8/genrandom.8.gz
/usr/share/man/man8/isc-hmac-fixup.8.gz
/usr/share/man/man8/lwresd.8.gz
/usr/share/man/man8/named-checkconf.8.gz
/usr/share/man/man8/named-checkzone.8.gz
/usr/share/man/man8/named-compilezone.8.gz
/usr/share/man/man8/named-journalprint.8.gz
/usr/share/man/man8/named.8.gz
/usr/share/man/man8/nsec3hash.8.gz
/usr/share/man/man8/rndc-confgen.8.gz
/usr/share/man/man8/rndc.8.gz
/var/log/named.log
/var/named
/var/named/data
/var/named/dynamic
/var/named/named.ca
/var/named/named.empty
/var/named/named.localhost
/var/named/named.loopback
/var/named/slaves

bind-chroot

 # rpm -qil bind-chroot
Name        : bind-chroot
Epoch       : 32
Version     : 9.9.4
Release     : 51.el7_4.1
Architecture: x86_64
Install Date: Thu 28 Dec 2017 05:25:27 PM CET
Group       : System Environment/Daemons
Size        : 3562
License     : ISC
Signature   : RSA/SHA256, Sat 02 Dec 2017 03:33:27 PM CET, Key ID 24c6a8a7f4a80eb5
Source RPM  : bind-9.9.4-51.el7_4.1.src.rpm
Build Date  : Thu 30 Nov 2017 08:30:11 PM CET
Build Host  : c1bm.rdu2.centos.org
Relocations : /var/named/chroot 
Packager    : CentOS BuildSystem <http://bugs.centos.org>
Vendor      : CentOS
URL         : http://www.isc.org/products/BIND/
Summary     : A chroot runtime environment for the ISC BIND DNS server, named(8)
Description :
This package contains a tree of files which can be used as a
chroot(2) jail for the named(8) program from the BIND package.
Based on the code from Jan "Yenya" Kasprzak <kas@fi.muni.cz>
/usr/lib/systemd/system/named-chroot-setup.service
/usr/lib/systemd/system/named-chroot.service
/usr/libexec/setup-named-chroot.sh
/var/named/chroot
/var/named/chroot/dev
/var/named/chroot/dev/null
/var/named/chroot/dev/random
/var/named/chroot/dev/zero
/var/named/chroot/etc
/var/named/chroot/etc/named
/var/named/chroot/etc/named.conf
/var/named/chroot/etc/pki
/var/named/chroot/etc/pki/dnssec-keys
/var/named/chroot/run
/var/named/chroot/run/named
/var/named/chroot/usr
/var/named/chroot/usr/lib64
/var/named/chroot/usr/lib64/bind
/var/named/chroot/var
/var/named/chroot/var/log
/var/named/chroot/var/named
/var/named/chroot/var/run
/var/named/chroot/var/tmp

bind-utils

 # rpm -qil bind-utils
Name        : bind-utils
Epoch       : 32
Version     : 9.9.4
Release     : 51.el7_4.1
Architecture: x86_64
Install Date: Tue 05 Dec 2017 07:38:22 AM CET
Group       : Applications/System
Size        : 445201
License     : ISC
Signature   : RSA/SHA256, Sat 02 Dec 2017 03:33:53 PM CET, Key ID 24c6a8a7f4a80eb5
Source RPM  : bind-9.9.4-51.el7_4.1.src.rpm
Build Date  : Thu 30 Nov 2017 08:30:11 PM CET
Build Host  : c1bm.rdu2.centos.org
Relocations : (not relocatable)
Packager    : CentOS BuildSystem <http://bugs.centos.org>
Vendor      : CentOS
URL         : http://www.isc.org/products/BIND/
Summary     : Utilities for querying DNS name servers
Description :
Bind-utils contains a collection of utilities for querying DNS (Domain
Name System) name servers to find out information about Internet
hosts. These tools will provide you with the IP addresses for given
host names, as well as other information about registered domains and
network addresses.

You should install bind-utils if you need to get information from DNS name
servers.
/etc/trusted-key.key
/usr/bin/dig
/usr/bin/host
/usr/bin/nslookup
/usr/bin/nsupdate
/usr/share/man/man1/dig.1.gz
/usr/share/man/man1/host.1.gz
/usr/share/man/man1/nslookup.1.gz
/usr/share/man/man1/nsupdate.1.gz

Grund-/Basis-Konfiguration

Name Server Control Utility

Zur administrativen Interaktion und Steuerung mit unserem DNS-Server nutzen wir das Name Server Control Utility rndc aus dem RPM bind. Die Optionen dieses User Interface finden am einfachsten in der zugehörigen manpage.

RNDC(8)                                     BIND9                                    RNDC(8)

NAME
       rndc - name server control utility

SYNOPSIS
       rndc [-b source-address] [-c config-file] [-k key-file] [-s server] [-p port] [-V]
            [-y key_id] {command}

DESCRIPTION
       rndc controls the operation of a name server. It supersedes the ndc utility that was
       provided in old BIND releases. If rndc is invoked with no command line options or
       arguments, it prints a short summary of the supported commands and the available
       options and their arguments.

       rndc communicates with the name server over a TCP connection, sending commands
       authenticated with digital signatures. In the current versions of rndc and named, the
       only supported authentication algorithm is HMAC-MD5, which uses a shared secret on
       each end of the connection. This provides TSIG-style authentication for the command
       request and the name server's response. All commands sent over the channel must be
       signed by a key_id known to the server.

       rndc reads a configuration file to determine how to contact the name server and
       decide what algorithm and key it should use.

OPTIONS
       -b source-address
           Use source-address as the source address for the connection to the server.
           Multiple instances are permitted to allow setting of both the IPv4 and IPv6
           source addresses.

       -c config-file
           Use config-file as the configuration file instead of the default, /etc/rndc.conf.

       -k key-file
           Use key-file as the key file instead of the default, /etc/rndc.key. The key in
           /etc/rndc.key will be used to authenticate commands sent to the server if the
           config-file does not exist.

       -s server
           server is the name or address of the server which matches a server statement in
           the configuration file for rndc. If no server is supplied on the command line,
           the host named by the default-server clause in the options statement of the rndc
           configuration file will be used.

       -p port
           Send commands to TCP port port instead of BIND 9's default control channel port,
           953.

       -V
           Enable verbose logging.

       -y key_id
           Use the key key_id from the configuration file.  key_id must be known by named
           with the same algorithm and secret string in order for control message validation
           to succeed. If no key_id is specified, rndc will first look for a key clause in
           the server statement of the server being used, or if no server statement is
           present for that host, then the default-key clause of the options statement. Note
           that the configuration file contains shared secrets which are used to send
           authenticated control commands to name servers. It should therefore not have
           general read or write access.

COMMANDS
       A list of commands supported by rndc can be seen by running rndc without arguments.

       Currently supported commands are:

       reload
           Reload configuration file and zones.

       reload zone [class [view]]
           Reload the given zone.

       refresh zone [class [view]]
           Schedule zone maintenance for the given zone.

       retransfer zone [class [view]]
           Retransfer the given zone from the master.

       sign zone [class [view]]
           Fetch all DNSSEC keys for the given zone from the key directory (see the
           key-directory option in the BIND 9 Administrator Reference Manual). If they are
           within their publication period, merge them into the zone's DNSKEY RRset. If the
           DNSKEY RRset is changed, then the zone is automatically re-signed with the new
           key set.

           This command requires that the auto-dnssec zone option be set to allow or
           maintain, and also requires the zone to be configured to allow dynamic DNS. (See
           "Dynamic Update Policies" in the Administrator Reference Manual for more
           details.)

       loadkeys zone [class [view]]
           Fetch all DNSSEC keys for the given zone from the key directory. If they are
           within their publication period, merge them into the zone's DNSKEY RRset. Unlike
           rndc sign, however, the zone is not immediately re-signed by the new keys, but is
           allowed to incrementally re-sign over time.

           This command requires that the auto-dnssec zone option be set to maintain, and
           also requires the zone to be configured to allow dynamic DNS. (See "Dynamic
           Update Policies" in the Administrator Reference Manual for more details.)

       freeze [zone [class [view]]]
           Suspend updates to a dynamic zone. If no zone is specified, then all zones are
           suspended. This allows manual edits to be made to a zone normally updated by
           dynamic update. It also causes changes in the journal file to be synced into the
           master file. All dynamic update attempts will be refused while the zone is
           frozen.

       thaw [zone [class [view]]]
           Enable updates to a frozen dynamic zone. If no zone is specified, then all frozen
           zones are enabled. This causes the server to reload the zone from disk, and
           re-enables dynamic updates after the load has completed. After a zone is thawed,
           dynamic updates will no longer be refused. If the zone has changed and the
           ixfr-from-differences option is in use, then the journal file will be updated to
           reflect changes in the zone. Otherwise, if the zone has changed, any existing
           journal file will be removed.

       sync [-clean] [zone [class [view]]]
           Sync changes in the journal file for a dynamic zone to the master file. If the
           "-clean" option is specified, the journal file is also removed. If no zone is
           specified, then all zones are synced.

       notify zone [class [view]]
           Resend NOTIFY messages for the zone.

       reconfig
           Reload the configuration file and load new zones, but do not reload existing zone
           files even if they have changed. This is faster than a full reload when there is
           a large number of zones because it avoids the need to examine the modification
           times of the zones files.

       stats
           Write server statistics to the statistics file.

       querylog [on|off]
           Enable or disable query logging. (For backward compatibility, this command can
           also be used without an argument to toggle query logging on and off.)

           Query logging can also be enabled by explicitly directing the queries category to
           a channel in the logging section of named.conf or by specifying querylog yes; in
           the options section of named.conf.

       dumpdb [-all|-cache|-zone] [view ...]
           Dump the server's caches (default) and/or zones to the dump file for the
           specified views. If no view is specified, all views are dumped.

       secroots [view ...]
           Dump the server's security roots to the secroots file for the specified views. If
           no view is specified, security roots for all views are dumped.

       stop [-p]
           Stop the server, making sure any recent changes made through dynamic update or
           IXFR are first saved to the master files of the updated zones. If -p is specified
           named's process id is returned. This allows an external process to determine when
           named had completed stopping.

       halt [-p]
           Stop the server immediately. Recent changes made through dynamic update or IXFR
           are not saved to the master files, but will be rolled forward from the journal
           files when the server is restarted. If -p is specified named's process id is
           returned. This allows an external process to determine when named had completed
           halting.

       trace
           Increment the servers debugging level by one.

       trace level
           Sets the server's debugging level to an explicit value.

       notrace
           Sets the server's debugging level to 0.

       flush
           Flushes the server's cache.

       flushname name [view]
           Flushes the given name from the server's DNS cache and, if applicable, from the
           server's nameserver address database or bad-server cache.

       flushtree name [view]
           Flushes the given name, and all of its subdomains, from the server's DNS cache.
           Note that this does not affect he server's address database or bad-server cache.

       status
           Display status of the server. Note that the number of zones includes the internal
           bind/CH zone and the default ./IN hint zone if there is not an explicit root zone
           configured.

       recursing
           Dump the list of queries named is currently recursing on.

       validation ( on | off | check ) [view ...]
           Enable, disable, or check the current status of DNSSEC validation. Note
           dnssec-enable also needs to be set to yes or auto to be effective. It defaults to
           enabled.

       tsig-list
           List the names of all TSIG keys currently configured for use by named in each
           view. The list both statically configured keys and dynamic TKEY-negotiated keys.

       tsig-delete keyname [view]
           Delete a given TKEY-negotiated key from the server. (This does not apply to
           statically configured TSIG keys.)

       addzone zone [class [view]] configuration
           Add a zone while the server is running. This command requires the allow-new-zones
           option to be set to yes. The configuration string specified on the command line
           is the zone configuration text that would ordinarily be placed in named.conf.

           The configuration is saved in a file called hash.nzf, where hash is a
           cryptographic hash generated from the name of the view. When named is restarted,
           the file will be loaded into the view configuration, so that zones that were
           added can persist after a restart.

           This sample addzone command would add the zone example.com to the default view:

           $rndc addzone example.com '{ type master; file "example.com.db"; };'

           (Note the brackets and semi-colon around the zone configuration text.)

       delzone zone [class [view]]
           Delete a zone while the server is running. Only zones that were originally added
           via rndc addzone can be deleted in this manner.

       signing [( -list | -clear keyid/algorithm | -clear all | -nsec3param ( parameters |
       none ) ) ] zone [class [view]]
           List, edit, or remove the DNSSEC signing state for the specified zone. The status
           of ongoing DNSSEC operations (such as signing or generating NSEC3 chains) is
           stored in the zone in the form of DNS resource records of type sig-signing-type.
           rndc signing -list converts these records into a human-readable form, indicating
           which keys are currently signing or have finished signing the zone, and which
           NSEC3 chains are being created or removed.

           rndc signing -clear can remove a single key (specified in the same format that
           rndc signing -list uses to display it), or all keys. In either case, only
           completed keys are removed; any record indicating that a key has not yet finished
           signing the zone will be retained.

           rndc signing -nsec3param sets the NSEC3 parameters for a zone. This is the only
           supported mechanism for using NSEC3 with inline-signing zones. Parameters are
           of ongoing DNSSEC operations (such as signing or generating NSEC3 chains) is
           stored in the zone in the form of DNS resource records of type sig-signing-type.
           rndc signing -list converts these records into a human-readable form, indicating
           which keys are currently signing or have finished signing the zone, and which
           NSEC3 chains are being created or removed.

           rndc signing -clear can remove a single key (specified in the same format that
           rndc signing -list uses to display it), or all keys. In either case, only
           completed keys are removed; any record indicating that a key has not yet finished
           signing the zone will be retained.

           rndc signing -nsec3param sets the NSEC3 parameters for a zone. This is the only
           supported mechanism for using NSEC3 with inline-signing zones. Parameters are
           specified in the same format as an NSEC3PARAM resource record: hash algorithm,
           flags, iterations, and salt, in that order.

           Currently, the only defined value for hash algorithm is 1, representing SHA-1.
           The flags may be set to 0 or 1, depending on whether you wish to set the opt-out
           bit in the NSEC3 chain.  iterations defines the number of additional times to
           apply the algorithm when generating an NSEC3 hash. The salt is a string of data
           expressed in hexidecimal, or a hyphen (`-') if no salt is to be used.

           So, for example, to create an NSEC3 chain using the SHA-1 hash algorithm, no
           opt-out flag, 10 iterations, and a salt value of "FFFF", use: rndc signing
           -nsec3param 1 0 10 FFFF zone. To set the opt-out flag, 15 iterations, and no
           salt, use: rndc signing -nsec3param 1 1 15 - zone.

           rndc signing -nsec3param none removes an existing NSEC3 chain and replaces it
           with NSEC.

LIMITATIONS
       There is currently no way to provide the shared secret for a key_id without using the
       configuration file.

       Several error messages could be clearer.

SEE ALSO
       rndc.conf(5), rndc-confgen(8), named(8), named.conf(5), ndc(8), BIND 9 Administrator
       Reference Manual.

AUTHOR
       Internet Systems Consortium

COPYRIGHT
       Copyright © 2004, 2005, 2007, 2013 Internet Systems Consortium, Inc. ("ISC")
       Copyright © 2000, 2001 Internet Software Consortium.

BIND9                                   June 7, 2013                                 RNDC(8)

Die Kommunikation zwischen der UI4) rndc und dem DNS-Daemon erfolgt bei CentOS 7 nur noch über eine digital signierten Zugangskanal, der auf einem entsprechenden symetrischen Schlüssel basiert. Dieser zugehörige Schlüssel muss direkt in einer entsprechenden Konfigurationsdateien hinterlegt werden und so dem Client rndc und dem Server bind bekannt gegeben werden.

rndc-confgen

Mit Hilfe des Befehls rndc-confgen aus dem RPM-Paket bind kann sowohl dieser symetrische Schlüssel wie auch die zugehörige Client-Konfigurationsdatei /etc/rndc.conf erzeugt, wie auch die benötigten Konfigurationsoptionen für die DNS-Server-Konfigurationsdatei /etc/named.conf angezeigt werden.

RNDC-CONFGEN(8)                             BIND9                            RNDC-CONFGEN(8)

NAME
       rndc-confgen - rndc key generation tool

SYNOPSIS
       rndc-confgen [-a] [-b keysize] [-c keyfile] [-h] [-k keyname] [-p port]
                    [-r randomfile] [-s address] [-t chrootdir] [-u user]

DESCRIPTION
       rndc-confgen generates configuration files for rndc. It can be used as a convenient
       alternative to writing the rndc.conf file and the corresponding controls and key
       statements in named.conf by hand. Alternatively, it can be run with the -a option to
       set up a rndc.key file and avoid the need for a rndc.conf file and a controls
       statement altogether.

OPTIONS
       -a
           Do automatic rndc configuration. This creates a file rndc.key in /etc (or
           whatever sysconfdir was specified as when BIND was built) that is read by both
           rndc and named on startup. The rndc.key file defines a default command channel
           and authentication key allowing rndc to communicate with named on the local host
           with no further configuration.

           Running rndc-confgen -a allows BIND 9 and rndc to be used as drop-in replacements
           for BIND 8 and ndc, with no changes to the existing BIND 8 named.conf file.

           If a more elaborate configuration than that generated by rndc-confgen -a is
           required, for example if rndc is to be used remotely, you should run rndc-confgen
           without the -a option and set up a rndc.conf and named.conf as directed.

       -b keysize
           Specifies the size of the authentication key in bits. Must be between 1 and 512
           bits; the default is 128.

       -c keyfile
           Used with the -a option to specify an alternate location for rndc.key.

       -h
           Prints a short summary of the options and arguments to rndc-confgen.

       -k keyname
           Specifies the key name of the rndc authentication key. This must be a valid
           domain name. The default is rndc-key.

       -p port
           Specifies the command channel port where named listens for connections from rndc.
           The default is 953.
           Specifies the key name of the rndc authentication key. This must be a valid
           domain name. The default is rndc-key.

       -p port
           Specifies the command channel port where named listens for connections from rndc.
           The default is 953.

       -r randomfile
           Specifies a source of random data for generating the authorization. If the
           operating system does not provide a /dev/random or equivalent device, the default
           source of randomness is keyboard input.  randomdev specifies the name of a
           character device or file containing random data to be used instead of the
           default. The special value keyboard indicates that keyboard input should be used.

       -s address
           Specifies the IP address where named listens for command channel connections from
           rndc. The default is the loopback address 127.0.0.1.

       -t chrootdir
           Used with the -a option to specify a directory where named will run chrooted. An
           additional copy of the rndc.key will be written relative to this directory so
           that it will be found by the chrooted named.

       -u user
           Used with the -a option to set the owner of the rndc.key file generated. If -t is
           also specified only the file in the chroot area has its owner changed.

EXAMPLES
       To allow rndc to be used with no manual configuration, run

       rndc-confgen -a

       To print a sample rndc.conf file and corresponding controls and key statements to be
       manually inserted into named.conf, run

       rndc-confgen

SEE ALSO
       rndc(8), rndc.conf(5), named(8), BIND 9 Administrator Reference Manual.

AUTHOR
       Internet Systems Consortium

COPYRIGHT
       Copyright © 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
       Copyright © 2001, 2003 Internet Software Consortium.

BIND9                                   Aug 27, 2001                         RNDC-CONFGEN(8)

In folgendem Konfigurationsbeispiel, welches wir lediglich zum Anzeigen der später benötigten Konfigurationsoptionen benutzen, nutzen wir folgende Optionen beim Aufruf des Hilfsprogramms rndc-confgen

 # rndc-confgen -b 512 -k rndc-key -r /dev/random -u named
# Start of rndc.conf
key "rndc-key" {
	algorithm hmac-md5;
	secret "FnqGCTNassQ6o5djkYN7pdgWifhUznPY+A2xqmvSRVvlWYphzSUHcJnqLciTZWAKJ9ogKIeQ763/tU8OZeta9A==";
};

options {
	default-key "rndc-key";
	default-server 127.0.0.1;
	default-port 953;
};
# End of rndc.conf

# Use with the following in named.conf, adjusting the allow list as needed:
# key "rndc-key" {
# 	algorithm hmac-md5;
# 	secret "FnqGCTNassQ6o5djkYN7pdgWifhUznPY+A2xqmvSRVvlWYphzSUHcJnqLciTZWAKJ9ogKIeQ763/tU8OZeta9A==";
# };
# 
# controls {
# 	inet 127.0.0.1 port 953
# 		allow { 127.0.0.1; } keys { "rndc-key"; };
# };
# End of named.conf

Wichtig:
Der symmetrische Schlüssel muss sowohl in der Client-Konfigurationsdatei /etc/rndc.conf wie auch Server-Konfigurationsdatei /etc/named.conf hinterlegt werden. Zweckmäßiger ist es jedoch diesen Schlüssel in eine eigene Konfigurationsdatei zu hinterlegen und diese Datei dann entsprechend zu inkludieren!

Bei der Installation des RPM-Paketes bind wurde auch ein zugehörige Key-Datei /etc/rndc.conf mit installiert.

 # ll /etc/rndc.key 
-rw-r-----. 1 root named 77 Dec 28 18:26 /etc/rndc.key
 # less /etc/rndc.key
/etc/rndc.key
key "rndc-key" {
	algorithm hmac-md5;
	secret "LXQvnV2ZbqG9QMg8eV7fsQ==";
};

 

WICHTIG: Damit es später beim Aufruf von rndc status nicht zu folgender Fehlermeldung
WARNING: key file (rndc.key) exists, but using default configuration file (rndc.conf)
kommen wird, werden wir die mitgelieferte Datei löschen und in unserer chroot-Umgebung dafür später noch sorgen, dass unsere eigene lokale Datei in das chroot-jail mit übernommen wird.

Diese Datei werden wir also nun zunächst sichern und dann automatisch eine neue lokale Datei anlegen lassen.

 # mv /etc/rndc.key /etc/rndc.key.orig

Nun erzeugen wir uns unsere eigenen Schlüssel.

 # rndc-confgen -a -b 512 -c /etc/rndc_local.key -k rndc-key -r /dev/random -u named
wrote key file "/etc/rndc_local.key"

Den Inhalt dieser Schlüsseldatei können wir uns nun auch anzeigen lassen.

 # less /etc/rndc_local.key
/etc/rndc_local.key
key "rndc-key" {
	algorithm hmac-md5;
	secret "prjseECUq/pzTKCwQKQoraA9KlYeuTMpwRd1qmQSYsKOOIw9b3QRN0ctcDlTvTs/6Urassjq0y+Vgi8eQPXQDA==";
};

Anschließend passen wir dann noch die User- und Gruppen-Eigenschaften an:

 # chown root:named /etc/rndc_local.key
 # chmod 640 /etc/rndc_local.key

Somit weist die Schlüsseldatei nunmehr die gleichen Rechte auf, die die original Datei aus dem RPM auf:

 # ll /etc/rndc*key*
-rw-r-----. 1 root named  74 Dec 29 08:14 /etc/rndc.key.orig
-rw-r-----. 1 root named 141 Dec 29 11:10 /etc/rndc_local.key

Zu guter Letzt legen wir nun noch die benötigte Konfigurationsdatei /etc/rndc.conf an.

 # vim /etc/rndc.conf
/etc/rndc.conf
include "/etc/rndc_local.key";
 
options {
	default-key "rndc-key";
	default-server 127.0.0.1;
	default-port 953;
};

change root - Umgebung

Be der Installation des zugehörigen RPM-Paketes bind-chroot wurde der Verzeichnisbaum /var/named/chroot als Mustervorlage auf unseren Server installiert, welcher als chroot jail für den IDC BIND Nameserver fungiert.

/var/named/chroot
/var/named/chroot/dev
/var/named/chroot/dev/null
/var/named/chroot/dev/random
/var/named/chroot/dev/zero
/var/named/chroot/etc
/var/named/chroot/etc/named
/var/named/chroot/etc/named.conf
/var/named/chroot/etc/pki
/var/named/chroot/etc/pki/dnssec-keys
/var/named/chroot/run
/var/named/chroot/run/named
/var/named/chroot/usr
/var/named/chroot/usr/lib64
/var/named/chroot/usr/lib64/bind
/var/named/chroot/var
/var/named/chroot/var/log
/var/named/chroot/var/named
/var/named/chroot/var/run
/var/named/chroot/var/tmp

Beim Starten des named Daemon wird dann das chroot jail mit den zugehörigen Konfigurationsdateien gemountet und so dem Daemon verfügbar gemacht. In dem Bash-Sctript /usr/libexec/setup-named-chroot.sh ist so unter anderem vermerkt welche Verzeichnispfade ge(un)mounted werden sollen.  

Damit auch unser zuvor generierte RNDC-Schlüssel kopiert wird, werden wir das Bash-Script aber ein klein wenig an unsere Umgebung anpassen. Zunächst machen wir von dem originalen Script eine Sicherheitskopie.

 # cp -a /usr/libexec/setup-named-chroot.sh /usr/libexec/setup-named-chroot.sh.orig

Anschließend korrigieren wir den Dateinamen der RNDC-Schlüsseldatei auf unseren lokalen Dateinamen /etc/rndc_local.kex.

 # vim /usr/libexec/setup-named-chroot.sh

 

/usr/libexec/setup-named-chroot.sh
#!/bin/bash
 
# Warning: the order is important
# If a directory containing $ROOTDIR is listed here,
# it MUST be listed last. (/var/named contains /var/named/chroot)
# Django : 2017-12-29
# default: ROOTDIR_MOUNT='/etc/localtime /etc/named /etc/pki/dnssec-keys /etc/named.root.key /etc/named.conf
#          /etc/named.dnssec.keys /etc/named.rfc1912.zones /etc/rndc.conf /etc/rndc.key /etc/named.iscdlv.key /etc/protocols /etc/services
#          /usr/lib64/bind /usr/lib/bind /run/named
#          /var/named'
 
ROOTDIR_MOUNT='/etc/localtime /etc/named /etc/pki/dnssec-keys /etc/named.root.key /etc/named.conf
/etc/named.dnssec.keys /etc/named.rfc1912.zones /etc/rndc.conf /etc/rndc_local.key /etc/named.iscdlv.key /etc/protocols /etc/services
/usr/lib64/bind /usr/lib/bind /run/named
/var/named'
 
usage()
{
  echo
  echo 'This script setups chroot environment for BIND'
  echo 'Usage: setup-named-chroot.sh ROOTDIR [on|off]'
}
 
if ! [ "$#" -eq 2 ]; then
  echo 'Wrong number of arguments'
  usage
  exit 1
fi
 
ROOTDIR="$1"
 
# Exit if ROOTDIR doesn't exist
if ! [ -d "$ROOTDIR" ]; then
  echo "Root directory $ROOTDIR doesn't exist"
  usage
  exit 1
fi
 
mount_chroot_conf()
{
  if [ -n "$ROOTDIR" ]; then
    for all in $ROOTDIR_MOUNT; do
      # Skip nonexistant files
      [ -e "$all" ] || continue
 
      # If mount source is a file
      if ! [ -d "$all" ]; then
        # mount it only if it is not present in chroot or it is empty
        if ! [ -e "$ROOTDIR$all" ] || [ `stat -c'%s' "$ROOTDIR$all"` -eq 0 ]; then
          touch "$ROOTDIR$all"
          mount --bind "$all" "$ROOTDIR$all"
        fi
      else
        # Mount source is a directory. Mount it only if directory in chroot is
        # empty.
        if [ -e "$all" ] && [ `ls -1A $ROOTDIR$all | wc -l` -eq 0 ]; then
          mount --bind --make-private "$all" "$ROOTDIR$all"
        fi
      fi
    done
  fi
}
 
umount_chroot_conf()
{
  if [ -n "$ROOTDIR" ]; then
    for all in $ROOTDIR_MOUNT; do
      # Check if file is mount target. Do not use /proc/mounts because detecting
      # of modified mounted files can fail.
      if mount | grep -q '.* on '"$ROOTDIR$all"' .*'; then
        umount "$ROOTDIR$all"
        # Remove temporary created files
        [ -f "$all" ] && rm -f "$ROOTDIR$all"
      fi
    done
  fi
}
 
case "$2" in
  on)
    mount_chroot_conf
    ;;
  off)
    umount_chroot_conf
    ;;
  *)
    echo 'Second argument has to be "on" or "off"'
    usage
    exit 1
esac
 
exit 0

Später können wir dann über den Befehl df -ah | grep named das gemountete chroot-jail abfragen, sofern der Dameon gestartet worden ist.

rsyslogd

Da der Dameon, welcher in seinem chroot-jail gefangen ist, nicht mehr das Logverzeichnis /var/log/ erreichen kann, müssen wir bei m Betrieb des chroot'eten Daemon dafür soregn dass er in sein eigenes Logverzeichnis /var/named/chroot/var/log seine Logdaten bei Bedarf schreiben kann. Hierzu passen wir als erste Konfigurationsmaßnahme die Konfiguration iunseres rsyslog-Daemon passend an.

Hierzu öffnen wir mit dem Editor unserer Wahl die Konfigurationsdatei /etc/rsyslog.conf und tragen folgende Option in der Sektion GLOBAL DIRECTIVES nach:
$AddUnixListenSocket /var/named/chroot/dev/log.

 # vim /etc/rsyslog.conf
/etc/rsyslog.conf
# rsyslog configuration file
 
# For more information see /usr/share/doc/rsyslog-*/rsyslog_conf.html
# If you experience problems, see http://www.rsyslog.com/doc/troubleshoot.html
 
#### MODULES ####
 
# Django : 2017-2-14
# default: unset
$DefaultNetstreamDriver gtls #make gtls driver the default
 
# The imjournal module bellow is now used as a message source instead of imuxsock.
$ModLoad imuxsock # provides support for local system logging (e.g. via logger command)
# Django : 2017-09-26
# default: $ModLoad imjournal # provides access to the systemd journal
#$ModLoad imklog # reads kernel messages (the same are read from journald)
#$ModLoad immark  # provides --MARK-- message capability
 
# Provides UDP syslog reception
#$ModLoad imudp
#$UDPServerRun 514
 
# Provides TCP syslog reception
#$ModLoad imtcp
#$InputTCPServerRun 514
 
 
#### GLOBAL DIRECTIVES ####
 
# Where to place auxiliary files
$WorkDirectory /var/lib/rsyslog
 
# Use default timestamp format
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
 
# File syncing capability is disabled by default. This feature is usually not required,
# not useful and an extreme performance hit
#$ActionFileEnableSync on
 
# Include all config files in /etc/rsyslog.d/
$IncludeConfig /etc/rsyslog.d/*.conf
 
# Turn off message reception via local log socket;
# local messages are retrieved through imjournal now.
# Django : 2017-09-26
# default: $OmitLocalLogging on
 
# File to store the position in the journal
# Django : 2017-09-26
# default: $IMJournalStateFile imjournal.state
 
# Django : 2017-02-14 - certificate files for TLS
# default: unset
$DefaultNetstreamDriverCAFile   /etc/pki/ca-trust/source/anchors/root-ca.certifikate.pem
$DefaultNetstreamDriverCertFile /etc/pki/tls/certs/rsyslog.vml000027.dmz.nausch.org.certificate.pem
$DefaultNetstreamDriverKeyFile  /etc/pki/tls/private/rsyslog.vml000027.dmz.nausch.org.key.pem
 
$ActionSendStreamDriverAuthMode x509/name
$ActionSendStreamDriverPermittedPeer graylog-server.dmz.nausch.org
#          run driver in TLS-only mode
$ActionSendStreamDriverMode 1
 
# Django: 2017-12-28
# Erweiterung für die chroot-Umgebung des bind Nameservers eingetragen
$AddUnixListenSocket /var/named/chroot/dev/log
 
 
#### RULES ####
 
# Log all kernel messages to the console.
# Logging much else clutters up the screen.
#kern.*                                                 /dev/console
 
# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none                /var/log/messages
 
# The authpriv file has restricted access.
authpriv.*                                              /var/log/secure
 
# Log all the mail messages in one place.
mail.*                                                  -/var/log/maillog
 
 
# Log cron stuff
cron.*                                                  /var/log/cron
 
# Everybody gets emergency messages
*.emerg                                                 :omusrmsg:*
 
# Save news errors of level crit and higher in a special file.
uucp,news.crit                                          /var/log/spooler
 
# Save boot messages also to boot.log
local7.*                                                /var/log/boot.log
 
 
# ### begin forwarding rule ###
# The statement between the begin ... end define a SINGLE forwarding
# rule. They belong together, do NOT split them. If you create multiple
# forwarding rules, duplicate the whole block!
# Remote Logging (we use TCP for reliable delivery)
#
# An on-disk queue is created for this action. If the remote host is
# down, messages are spooled to disk and sent when it is up again.
#$ActionQueueFileName fwdRule1 # unique name prefix for spool files
#$ActionQueueMaxDiskSpace 1g   # 1gb space limit (use as much as possible)
#$ActionQueueSaveOnShutdown on # save messages to disk on shutdown
#$ActionQueueType LinkedList   # run asynchronously
#$ActionResumeRetryCount -1    # infinite retries if host is down
# remote host is: name/ip:port, e.g. 192.168.0.1:514, port optional
#*.* @@remote-host:514
#
# Django : 2017-02-14
$template GRAYLOGRFC5424,"<%PRI%>%PROTOCOL-VERSION% %TIMESTAMP:::date-rfc3339% %HOSTNAME% %APP-NAME% %PROCID% %MSGID% %STRUCTURED-DATA% %msg%\n"
*.* @@10.0.0.117:6514;RSYSLOG_SyslogProtocol23Format
#
# ### end of the forwarding rule ###

Zur Aktivierung unserer Änderung bedarf es nur noch eines Restarts des rsyslogd Daemon.

 # systemctl restart rsyslog

rsyslog.service - System Logging Service
   Loaded: loaded (/usr/lib/systemd/system/rsyslog.service; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2017-12-28 17:52:05 CET; 8s ago
     Docs: man:rsyslogd(8)
           http://www.rsyslog.com/doc/
 Main PID: 3494 (rsyslogd)
   CGroup: /system.slice/rsyslog.service
           └─3494 /usr/sbin/rsyslogd -n

Dec 28 17:52:05 vml000027.dmz.nausch.org systemd[1]: Starting System Logging Service...
Dec 28 17:52:05 vml000027.dmz.nausch.org rsyslogd[3494]:  [origin software="rsyslogd" swVersion="8.24.0" x-pid="3494" x-info="http://www.rsyslog.com"] start
Dec 28 17:52:05 vml000027.dmz.nausch.org systemd[1]: Started System Logging Service.
Hint: Some lines were ellipsized, use -l to show in full.

Paketfilter/Firewall

Damit unsere berechtigten Clients auch Verbindungen zu den geöffneten Ports UDP/53 UND TCP/53 unseres BIND-Name-Server aufbauen können müssen wir für diese noch Änderungen am Paketfilter firewalld vornehmen.

Unter CentOS 7 wird als Standard-Firewall die dynamische firewalld verwendet. Ein großer Vorteil der dynamischen Paketfilterregeln ist unter anderem, dass zur Aktivierung der neuen Firewall-Regel(n) nicht der Daemon durchgestartet werden muss und somit alle aktiven Verbiundungen kurz getrennt werden. Sondern unsere Änderungen können on-the-fly aktiviert oder auch wieder deaktiviert werden.

Mit Hilfe des Programms firewall-cmd legen wir nun eine permanente Regel in den zugehörigen Zonen, in diesem Konfigurationsbeispiel internal und external, an. Genug der Vorrede, mit nachfolgendem Befehl werden den Port 35 für die beiden Protokolle UDP und TCP geöffnet.

 # firewall-cmd --permanent --zone=internal --add-service=dns
 success
 #  firewall-cmd --permanent --zone=external --add-service=dns
 success

Anschließend können wir den Firewall-Daemon einmal durchstarten und anschließend überprüfen, ob die Regeln auch entsprechend unserer Definition, gezogen haben.

 # firewall-cmd --reload
 success

Anschließend können wir abfragen, welche Dienste in der Zone public geöffnet sind.

 # firewall-cmd --zone=public --list-services
 dns

Genauso können wir natürlich mit mit dem Befehl iptables abfragen, ob die Erweiterung unseres Paketfilter aktiv ist.

 # iptables -nvL IN_internal_allow
Chain IN_internal_allow (1 references)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:53 ctstate NEW
    0     0 ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0            udp dpt:53 ctstate NEW

Das Gleiche gilt natürlich auch für die Zone external

 # iptables -nvL IN_external_allow
Chain IN_internal_allow (1 references)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:53 ctstate NEW
    0     0 ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0            udp dpt:53 ctstate NEW

Start des Daemon

Nun können wir unseren DNS-Daemon das erste mal starten und prüfen, ob unsere Basis-Konfiguration den gewünschten Erfolg mitbringt.

 # systemctl start named-chroot.service

Den Status des laufenden Daemon fragen wir wie gewohnt wie folgt ab.

 # systemctl status named-chroot.service

named-chroot.service - Berkeley Internet Name Domain (DNS)
   Loaded: loaded (/usr/lib/systemd/system/named-chroot.service; disabled; vendor preset: disabled)
   Active: active (running) since Thu 2017-12-28 18:26:38 CET; 8s ago
  Process: 4391 ExecStart=/usr/sbin/named -u named -c ${NAMEDCONF} -t /var/named/chroot $OPTIONS (code=exited, status=0/SUCCESS)
  Process: 4389 ExecStartPre=/bin/bash -c if [ ! "$DISABLE_ZONE_CHECKING" == "yes" ]; then /usr/sbin/named-checkconf -t /var/named/chroot -z "$NAMEDCONF"; else echo "Checking of zone files is disabled"; fi (code=exited, status=0/SUCCESS)
 Main PID: 4394 (named)
   CGroup: /system.slice/named-chroot.service
           └─4394 /usr/sbin/named -u named -c /etc/named.conf -t /var/named/chroot

Dec 28 18:26:38 vml000027.dmz.nausch.org named[4394]: command channel listening on ::1#953
Dec 28 18:26:38 vml000027.dmz.nausch.org named[4394]: managed-keys-zone: loaded serial 0
Dec 28 18:26:38 vml000027.dmz.nausch.org systemd[1]: Started Berkeley Internet Name Domain (DNS).
Dec 28 18:26:38 vml000027.dmz.nausch.org named[4394]: zone 0.in-addr.arpa/IN: loaded serial 0
Dec 28 18:26:38 vml000027.dmz.nausch.org named[4394]: zone 1.0.0.127.in-addr.arpa/IN: loaded serial 0
Dec 28 18:26:38 vml000027.dmz.nausch.org named[4394]: zone 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa/IN: loaded serial 0
Dec 28 18:26:38 vml000027.dmz.nausch.org named[4394]: zone localhost/IN: loaded serial 0
Dec 28 18:26:38 vml000027.dmz.nausch.org named[4394]: zone localhost.localdomain/IN: loaded serial 0
Dec 28 18:26:38 vml000027.dmz.nausch.org named[4394]: all zones loaded
Dec 28 18:26:38 vml000027.dmz.nausch.org named[4394]: running

Damit der ISC-BIND-DNS-Daemon beim Starten des Server automatisch in seiner chroot-Umgebung auch gestartet wird, aktivieren wir den Autostart des Daemon.

 # systemctl enable named-chroot.service
Created symlink from /etc/systemd/system/multi-user.target.wants/named-chroot.service to /usr/lib/systemd/system/named-chroot.service.

Wollen wir prüfen ob die Autostartfunktion des DNS-Daemon gesetzt ist, nutzen wir folgenden Aufruf:

 # systemctl is-enabled named-chroot.service
enabled

Da wir noch gezielte Konfiguration unseres DNS-Server vorgenommen haben, lauscht dieser erst einmal auf den UDP/TCP Port 53, was wir mit dem Befehl netstat auch überprüfen können.

 # netstat -tulpen | grep named
tcp        0      0 127.0.0.1:53            0.0.0.0:*               LISTEN      25         10197099   4394/named          
tcp        0      0 127.0.0.1:953           0.0.0.0:*               LISTEN      25         10197104   4394/named          
tcp6       0      0 ::1:53                  :::*                    LISTEN      25         10197101   4394/named          
tcp6       0      0 ::1:953                 :::*                    LISTEN      25         10197105   4394/named          
udp        0      0 127.0.0.1:53            0.0.0.0:*                           25         10197098   4394/named          
udp6       0      0 ::1:53                  :::*                                25         10197100   4394/named

Dass der DNS-Daemon auch mit der wirklich in einer chroot-Umgebung läuft sehen wird bei nachfolgenden Befehls-Check. Da die Option -t /var/named/chroot gesetzt wurde, sehen wir, dass dies auch entsprechend erfolgt ist.

 # ps auxwf | grep named

 

root      4517  0.0  0.0 112660   948 pts/0    S+   18:30   0:00                      \_ grep --color=auto named
named     4394  0.0  0.7 163712 14928 ?        Ssl  18:26   0:00 /usr/sbin/named -u named -c /etc/named.conf -t /var/named/chroot

Wie zuvor schon erwähnt werden beim Starten des DNS-Daemon in seinem chroot-jail die benötigten Verzeichnisse und Dateien gemountet. Dies können wir nun über den Befehl df -ah | grep named auch entsprechend überprüfen.

 # df -ah | grep named
/dev/mapper/centos-root      10G  3.9G  6.2G  39% /var/named/chroot/etc/localtime
/dev/mapper/centos-root      10G  3.9G  6.2G  39% /var/named/chroot/etc/named
/dev/mapper/centos-root      10G  3.9G  6.2G  39% /var/named/chroot/etc/named.root.key
/dev/mapper/centos-root      10G  3.9G  6.2G  39% /var/named/chroot/etc/named.conf
/dev/mapper/centos-root      10G  3.9G  6.2G  39% /var/named/chroot/etc/named.rfc1912.zones
/dev/mapper/centos-root      10G  3.9G  6.2G  39% /var/named/chroot/etc/rndc.key
/dev/mapper/centos-root      10G  3.9G  6.2G  39% /var/named/chroot/etc/named.iscdlv.key
/dev/mapper/centos-root      10G  3.9G  6.2G  39% /var/named/chroot/etc/protocols
/dev/mapper/centos-root      10G  3.9G  6.2G  39% /var/named/chroot/etc/services
/dev/mapper/centos-root      10G  3.9G  6.2G  39% /var/named/chroot/usr/lib64/bind
tmpfs                       920M   90M  831M  10% /var/named/chroot/run/named
/dev/mapper/centos-root      10G  3.9G  6.2G  39% /var/named/chroot/var/named

Der Dokumenten-Baum des chroot-jail ist entsprechend erweitert:

/var/named/chroot/
├── dev
│   ├── log
│   ├── null
│   ├── random
│   └── zero
├── etc
│   ├── localtime
│   ├── named
│   ├── named.conf
│   ├── named.iscdlv.key
│   ├── named.rfc1912.zones
│   ├── named.root.key
│   ├── pki
│   │   └── dnssec-keys
│   ├── protocols
│   ├── rndc.key
│   └── services
├── run
│   └── named
│       ├── named.pid
│       └── session.key
├── usr
│   └── lib64
│       └── bind
└── var
    ├── log
    ├── named
    │   ├── chroot
    │   │   ├── dev
    │   │   │   ├── log
    │   │   │   ├── null
    │   │   │   ├── random
    │   │   │   └── zero
    │   │   ├── etc
    │   │   │   ├── localtime
    │   │   │   ├── named
    │   │   │   ├── named.conf
    │   │   │   ├── named.iscdlv.key
    │   │   │   ├── named.rfc1912.zones
    │   │   │   ├── named.root.key
    │   │   │   ├── pki
    │   │   │   │   └── dnssec-keys
    │   │   │   ├── protocols
    │   │   │   ├── rndc.key
    │   │   │   └── services
    │   │   ├── run
    │   │   │   └── named
    │   │   ├── usr
    │   │   │   └── lib64
    │   │   │       └── bind
    │   │   └── var
    │   │       ├── log
    │   │       ├── named
    │   │       ├── run -> ../run
    │   │       └── tmp
    │   ├── data
    │   │   └── named.run
    │   ├── dynamic
    │   │   ├── managed-keys.bind
    │   │   └── managed-keys.bind.jnl
    │   ├── named.ca
    │   ├── named.empty
    │   ├── named.localhost
    │   ├── named.loopback
    │   └── slaves
    ├── run -> ../run
    └── tmp

Zum Testen, ob beim Stoppen auch diese Mountpoints wieder verschwinden, testen wir nun auch noch. Hierzu stoppen wir erst einmal den laufenden DNS-Deamon.

 # systemctl stop named-chroot.service

Dass der Daemon auch wirklich nicht mehr läft sehen wir beim Abfragen des Server-Statuses.

 # systemctl status named-chroot.service

named-chroot.service - Berkeley Internet Name Domain (DNS)
   Loaded: loaded (/usr/lib/systemd/system/named-chroot.service; enabled; vendor preset: disabled)
   Active: inactive (dead) since Thu 2017-12-28 18:35:53 CET; 6s ago
  Process: 4677 ExecStop=/bin/sh -c /usr/sbin/rndc stop > /dev/null 2>&1 || /bin/kill -TERM $MAINPID (code=exited, status=0/SUCCESS)
 Main PID: 4394 (code=exited, status=0/SUCCESS)

Dec 28 18:35:53 vml000027.dmz.nausch.org systemd[1]: Stopping Berkeley Internet Name Domain (DNS)...
Dec 28 18:35:53 vml000027.dmz.nausch.org named[4394]: received control channel command 'stop'
Dec 28 18:35:53 vml000027.dmz.nausch.org systemd[1]: Stopped Berkeley Internet Name Domain (DNS).

Die Abfrage nach den Mount-Points bleibt daher auch entsprechend „unbeantwortet“.

 # df -ah | grep named

Der Dokumenten-Baum des bind-daemon ist nunmehr nur noch der ursprüngliche Basiszustand bei der Installation des Daemon selbst.

/var/named/chroot/
├── dev
│   ├── log
│   ├── null
│   ├── random
│   └── zero
├── etc
│   ├── named
│   └── pki
│       └── dnssec-keys
├── run
│   └── named
├── usr
│   └── lib64
│       └── bind
└── var
    ├── log
    ├── named
    ├── run -> ../run
    └── tmp

Zu guter Letzt starten wir den Daemon wieder um weiter testen zu können.

 # systemctl start named-chroot.service

Ohne jegliche individuelle Konfiguration fungiert der DNS-Server als caching-only-resolver; daher könne wir auch unsere erste Anfrage gegen unseren „neuen“ DNS-Server machen.

 # dig @127.0.0.1 ccc.de
; <<>> DiG 9.9.4-RedHat-9.9.4-51.el7_4.1 <<>> @127.0.0.1 ccc.de
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 43047
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 4, ADDITIONAL: 9

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;ccc.de.				IN	A

;; ANSWER SECTION:
ccc.de.			7200	IN	A	213.73.89.123

;; AUTHORITY SECTION:
ccc.de.			86400	IN	NS	ns.ham.ccc.de.
ccc.de.			86400	IN	NS	ns.ber.ccc.de.
ccc.de.			86400	IN	NS	s-dns.irz42.net.
ccc.de.			86400	IN	NS	ns.vie.ccc.de.

;; ADDITIONAL SECTION:
ns.vie.ccc.de.		86400	IN	A	146.255.57.228
ns.vie.ccc.de.		86400	IN	AAAA	2a02:1b8:10:31::228
s-dns.irz42.net.	172800	IN	A	212.12.50.130
s-dns.irz42.net.	3600	IN	AAAA	2a00:14b0:4200:3280::130
ns.ber.ccc.de.		86400	IN	A	195.54.164.36
ns.ber.ccc.de.		86400	IN	AAAA	2001:67c:20a0:2:0:164:0:36
ns.ham.ccc.de.		86400	IN	A	212.12.55.77
ns.ham.ccc.de.		86400	IN	AAAA	2a00:14b0:4200:3000:23:55:0:77

;; Query time: 210 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Thu Dec 28 20:01:32 CET 2017
;; MSG SIZE  rcvd: 319

Erweiterte Konfigurationsbeispiele

caching-only Nameserver

Im ersten Schritt wollen wir erst einmal einen caching-only Nameserver aufsetzen. Die mitgelieferte Konfigurationsdate /etc/named.conf des RPM-Pakets bind passen wir unseren Gegebenheiten an.

 # vim /etc/named.conf
/etc/named.conf
//
// named.conf
//
// Provided by Red Hat bind package to configure the ISC BIND named(8) DNS
// server as a caching only nameserver (as a localhost DNS resolver only).
//
// See /usr/share/doc/bind*/sample/ for example named configuration files.
//
// See the BIND Administrator's Reference Manual (ARM) for details about the
// configuration located in /usr/share/doc/bind-{version}/Bv9ARM.html
 
// Django : 2017-12-28 - Variablendefinition
// default: unset  
acl dmz   { 10.0.0.0/24; };
acl intra { 10.0.10.0/25; };
 
options {
	// Django : 2017-12-28
	// default: listen-on port 53 { 127.0.0.1; };
	listen-on port 53 { 127.0.0.1; 10.0.0.27; 10.0.10.27;};
	listen-on-v6 port 53 { ::1; };
	directory 	"/var/named";
	dump-file 	"/var/named/data/cache_dump.db";
	statistics-file "/var/named/data/named_stats.txt";
	memstatistics-file "/var/named/data/named_mem_stats.txt";
        // Django : 2017-12-28
        // default: allow-query     { localhost; };
	allow-query     { localhost; dmz; intra; };
 
	/* 
	 - If you are building an AUTHORITATIVE DNS server, do NOT enable recursion.
	 - If you are building a RECURSIVE (caching) DNS server, you need to enable 
	   recursion. 
	 - If your recursive DNS server has a public IP address, you MUST enable access 
	   control to limit queries to your legitimate users. Failing to do so will
	   cause your server to become part of large scale DNS amplification 
	   attacks. Implementing BCP38 within your network would greatly
	   reduce such attack surface 
	*/
	recursion yes;
 
	dnssec-enable yes;
	dnssec-validation yes;
 
	/* Path to ISC DLV key */
	bindkeys-file "/etc/named.iscdlv.key";
 
	managed-keys-directory "/var/named/dynamic";
 
	pid-file "/run/named/named.pid";
	session-keyfile "/run/named/session.key";
 
	// Django : 2017-12-28 - Rückmeldung Programm und Version verstecken
	// default: unset
	version "DNS - nausch.org";
 
};
 
logging {
        channel default_debug {
                file "data/named.run";
                severity dynamic;
        };
};
 
zone "." IN {
	type hint;
	file "named.ca";
};
 
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";

Bevor wir die Konfigurationsänderung aktivieren, prüfen wir noch kurz, ob in der Konfigurationsdatei kein syntaktischer Fehler eingeschlichen hat.

 # named-checkconf

Erfolgt keine Fehlermeldung bedeutet dies, dass alles O.K. ist. Nun starten wir den DNS-Daemon einmal durch.

 # systemctl restart named-chroot.service

Nun können wir prüfen, ob unser neuer DNS-Server von einem berechtigten Client-Rechner aus nach einer Anfrage zu einem externen Host.

 # dig @10.0.0.27 heise.de
; <<>> DiG 9.9.4-RedHat-9.9.4-51.el7_4.1 <<>> @10.0.0.27 heise.de
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 30660
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 5, ADDITIONAL: 7

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;heise.de.			IN	A

;; ANSWER SECTION:
heise.de.		85044	IN	A	193.99.144.80

;; AUTHORITY SECTION:
heise.de.		85043	IN	NS	ns.s.plusline.de.
heise.de.		85043	IN	NS	ns.plusline.de.
heise.de.		85043	IN	NS	ns.heise.de.
heise.de.		85043	IN	NS	ns.pop-hannover.de.
heise.de.		85043	IN	NS	ns2.pop-hannover.net.

;; ADDITIONAL SECTION:
ns.pop-hannover.de.	85043	IN	A	193.98.1.200
ns.s.plusline.de.	85043	IN	A	212.19.40.14
ns.heise.de.		85043	IN	A	193.99.145.37
ns.heise.de.		85043	IN	AAAA	2a00:e68:14:800::d1ce
ns2.pop-hannover.net.	171443	IN	A	62.48.67.66
ns.plusline.de.		85043	IN	A	212.19.48.14

;; Query time: 1 msec
;; SERVER: 10.0.0.27#53(10.0.0.27)
;; WHEN: Do Dez 28 20:58:43 CET 2017
;; MSG SIZE  rcvd: 287

Natürlich kann unser caching-resolver auch DNSsec-Anfragen bearbeiten, dies bedarf keiner gesonderten aufwändigen Konfiguration!

 $ dig @10.0.0.27 sys4.de +dnssec
; <<>> DiG 9.9.4-RedHat-9.9.4-51.el7_4.1 <<>> @10.0.0.27 sys4.de +dnssec
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 57125
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 2, AUTHORITY: 3, ADDITIONAL: 5

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags: do; udp: 4096
;; QUESTION SECTION:
;sys4.de.			IN	A

;; ANSWER SECTION:
sys4.de.		3600	IN	A	194.126.158.154
sys4.de.		3600	IN	RRSIG	A 8 2 3600 20180101183221 20171225211210 44430 sys4.de. YN5f4A3fjghKXy49Nou2ew8pxBC/8P2++NDEpD94WOe7vaqu2TivfW1r dxxomo/6KoonenENnMMzLEUGXIKCZ9bgref+6ihxN1j8CwBes38z+xdS xgaBaIan/P7MTTqADKssjmwoGvLOhHrgi2MWt/QB5idhN6ZpBNdaxY5Y R6A=

;; AUTHORITY SECTION:
sys4.de.		3599	IN	NS	ns.sys4.de.
sys4.de.		3599	IN	NS	ns.schiffbauer.net.
sys4.de.		3599	IN	RRSIG	NS 8 2 3600 20180104123423 20171228151217 44430 sys4.de. wmcNWlp1AbLQbqvMSjN1jTYl7NT+MVSDFEwGUWuAdfc93/PwVmEulRLj LPZ5o8N+Eiv52PVow9D07FjETDUpdirMOjUk55Omq+e+bt5j8TXYxkjH xkvBziyAciQf/77HazZKG2NpI6ASnPa2l3Hrm5KeVcmVVWAwYOlpPmHR WeY=

;; ADDITIONAL SECTION:
ns.sys4.de.		86399	IN	A	194.126.158.143
ns.schiffbauer.net.	172799	IN	A	188.40.110.137
ns.schiffbauer.net.	3599	IN	AAAA	2a01:4f8:221:2c82::2
ns.sys4.de.		3599	IN	RRSIG	A 8 3 3600 20171231181435 20171224191208 44430 sys4.de. h0hEMpr8zmYlrc5NI/yEkP7w6eZrAqRWqCmCnHYMRRT6bCE7TLYbo73A r1/BKK7fV4hdwRwXIeP28Mle9igBqm42m/JessFGzanLo+ckWSRfAx2/ sCrUNzIM+cy0BGTLXg7Pld8r7aouKT83kSwBAuxQr0ZK4S4j1zNWOvrW MbE=

;; Query time: 297 msec
;; SERVER: 10.0.0.27#53(10.0.0.27)
;; WHEN: Do Dez 28 20:38:01 CET 2017
;; MSG SIZE  rcvd: 662

Root Hints Data File

Bei der Installation unseres Nameservers mit Hilfe des RPMs wurde eine Datei mit den 13 ROOT-Nameservern mitgeliefert. Diese Liste ist jedoch nicht statisch und sollte erfahrungsgemäß alle sechs Monate einmal aktualisiert werden.

Wir können uns diese Datei direkt vom FTP-Server der InterNIC laden. Hierzu benutzen wir z.B. folgenden Befehl:

 # wget --user=ftp --password=ftp ftp://ftp.rs.internic.net/domain/db.cache -O /var/named/named.ca
;       This file holds the information on root name servers needed to 
;       initialize cache of Internet domain name servers
;       (e.g. reference this file in the "cache  .  <file>"
;       configuration file of BIND domain name servers). 
; 
;       This file is made available by InterNIC 
;       under anonymous FTP as
;           file                /domain/named.cache 
;           on server           FTP.INTERNIC.NET
;       -OR-                    RS.INTERNIC.NET
; 
;       last update:     November 16, 2017 
;       related version of root zone:     2017111601
; 
; FORMERLY NS.INTERNIC.NET 
;
.                        3600000      NS    A.ROOT-SERVERS.NET.
A.ROOT-SERVERS.NET.      3600000      A     198.41.0.4
A.ROOT-SERVERS.NET.      3600000      AAAA  2001:503:ba3e::2:30
; 
; FORMERLY NS1.ISI.EDU 
;
.                        3600000      NS    B.ROOT-SERVERS.NET.
B.ROOT-SERVERS.NET.      3600000      A     199.9.14.201
B.ROOT-SERVERS.NET.      3600000      AAAA  2001:500:200::b
; 
; FORMERLY C.PSI.NET 
;
.                        3600000      NS    C.ROOT-SERVERS.NET.
C.ROOT-SERVERS.NET.      3600000      A     192.33.4.12
C.ROOT-SERVERS.NET.      3600000      AAAA  2001:500:2::c
; 
; FORMERLY TERP.UMD.EDU 
;
.                        3600000      NS    D.ROOT-SERVERS.NET.
D.ROOT-SERVERS.NET.      3600000      A     199.7.91.13
D.ROOT-SERVERS.NET.      3600000      AAAA  2001:500:2d::d
; 
; FORMERLY NS.NASA.GOV
;
.                        3600000      NS    E.ROOT-SERVERS.NET.
E.ROOT-SERVERS.NET.      3600000      A     192.203.230.10
E.ROOT-SERVERS.NET.      3600000      AAAA  2001:500:a8::e
; 
; FORMERLY NS.ISC.ORG
;
.                        3600000      NS    F.ROOT-SERVERS.NET.
F.ROOT-SERVERS.NET.      3600000      A     192.5.5.241
F.ROOT-SERVERS.NET.      3600000      AAAA  2001:500:2f::f
; 
; FORMERLY NS.NIC.DDN.MIL
;
.                        3600000      NS    G.ROOT-SERVERS.NET.
G.ROOT-SERVERS.NET.      3600000      A     192.112.36.4
G.ROOT-SERVERS.NET.      3600000      AAAA  2001:500:12::d0d
; 
; FORMERLY AOS.ARL.ARMY.MIL
;
.                        3600000      NS    H.ROOT-SERVERS.NET.
H.ROOT-SERVERS.NET.      3600000      A     198.97.190.53
H.ROOT-SERVERS.NET.      3600000      AAAA  2001:500:1::53
; 
; FORMERLY NIC.NORDU.NET
;
.                        3600000      NS    I.ROOT-SERVERS.NET.
I.ROOT-SERVERS.NET.      3600000      A     192.36.148.17
I.ROOT-SERVERS.NET.      3600000      AAAA  2001:7fe::53
; 
; OPERATED BY VERISIGN, INC.
;
.                        3600000      NS    J.ROOT-SERVERS.NET.
J.ROOT-SERVERS.NET.      3600000      A     192.58.128.30
J.ROOT-SERVERS.NET.      3600000      AAAA  2001:503:c27::2:30
; 
; OPERATED BY RIPE NCC
;
.                        3600000      NS    K.ROOT-SERVERS.NET.
K.ROOT-SERVERS.NET.      3600000      A     193.0.14.129
K.ROOT-SERVERS.NET.      3600000      AAAA  2001:7fd::1
; 
; OPERATED BY ICANN
;
.                        3600000      NS    L.ROOT-SERVERS.NET.
L.ROOT-SERVERS.NET.      3600000      A     199.7.83.42
L.ROOT-SERVERS.NET.      3600000      AAAA  2001:500:9f::42
; 
; OPERATED BY WIDE
;
.                        3600000      NS    M.ROOT-SERVERS.NET.
M.ROOT-SERVERS.NET.      3600000      A     202.12.27.33
M.ROOT-SERVERS.NET.      3600000      AAAA  2001:dc3::35

Zum Neueinlesen der Root Hints Daten Datei starten wir den BIND-Daemon einmal durch.

 # systemctl restart named-chroot.service

Alternativ dazu können wir auch die Datei mit Hilfe eines DNS-Lookups aktualisieren.

 # dig +bufsize=1200 +norec NS . @a.root-servers.net > /var/named/named.ca
; <<>> DiG 9.9.4-RedHat-9.9.4-51.el7_4.1 <<>> +bufsize=1200 +norec NS . @a.root-servers.net
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 42016
;; flags: qr aa; QUERY: 1, ANSWER: 13, AUTHORITY: 0, ADDITIONAL: 27
 
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;.                              IN      NS
 
;; ANSWER SECTION:
.                       518400  IN      NS      e.root-servers.net.
.                       518400  IN      NS      h.root-servers.net.
.                       518400  IN      NS      l.root-servers.net.
.                       518400  IN      NS      i.root-servers.net.
.                       518400  IN      NS      a.root-servers.net.
.                       518400  IN      NS      d.root-servers.net.
.                       518400  IN      NS      c.root-servers.net.
.                       518400  IN      NS      b.root-servers.net.
.                       518400  IN      NS      j.root-servers.net.
.                       518400  IN      NS      k.root-servers.net.
.                       518400  IN      NS      g.root-servers.net.
.                       518400  IN      NS      m.root-servers.net.
.                       518400  IN      NS      f.root-servers.net.
 
;; ADDITIONAL SECTION:
e.root-servers.net.     518400  IN      A       192.203.230.10
e.root-servers.net.     518400  IN      AAAA    2001:500:a8::e
h.root-servers.net.     518400  IN      A       198.97.190.53
h.root-servers.net.     518400  IN      AAAA    2001:500:1::53
l.root-servers.net.     518400  IN      A       199.7.83.42
l.root-servers.net.     518400  IN      AAAA    2001:500:9f::42
i.root-servers.net.     518400  IN      A       192.36.148.17
i.root-servers.net.     518400  IN      AAAA    2001:7fe::53
a.root-servers.net.     518400  IN      A       198.41.0.4
a.root-servers.net.     518400  IN      AAAA    2001:503:ba3e::2:30
d.root-servers.net.     518400  IN      A       199.7.91.13
d.root-servers.net.     518400  IN      AAAA    2001:500:2d::d
c.root-servers.net.     518400  IN      A       192.33.4.12
c.root-servers.net.     518400  IN      AAAA    2001:500:2::c
b.root-servers.net.     518400  IN      A       199.9.14.201
b.root-servers.net.     518400  IN      AAAA    2001:500:200::b
j.root-servers.net.     518400  IN      A       192.58.128.30
j.root-servers.net.     518400  IN      AAAA    2001:503:c27::2:30
k.root-servers.net.     518400  IN      A       193.0.14.129
k.root-servers.net.     518400  IN      AAAA    2001:7fd::1
g.root-servers.net.     518400  IN      A       192.112.36.4
g.root-servers.net.     518400  IN      AAAA    2001:500:12::d0d
m.root-servers.net.     518400  IN      A       202.12.27.33
m.root-servers.net.     518400  IN      AAAA    2001:dc3::35
f.root-servers.net.     518400  IN      A       192.5.5.241
f.root-servers.net.     518400  IN      AAAA    2001:500:2f::f
 
;; Query time: 39 msec
;; SERVER: 198.41.0.4#53(198.41.0.4)
;; WHEN: Fri Dec 29 10:07:19 CET 2017
;; MSG SIZE  rcvd: 811

Auch hier müssen wir natürlich zum Neueinlesen der Datei den Daemon einmal durchstarten.

 # systemctl restart named-chroot.service

Damit wir die Datei nun nicht manuell aktualisieren müssen, werden wir uns einen cronjob anlegen. Wir werden dabei die erste Variante verwenden, da in der heruntergeladenen Datei auch das Aktualisierungsdatum steht, welches wir ggf. später auswerten bzw. überwachen können.

 # vim /root/bin/update-dns-roots
/root/bin/update-dns-roots
#!/bin/bash
# Django : 2017-12-29 - Script zum Aktualisieren des Root Hints Data File
 
/usr/bin/wget --user=ftp --password=ftp ftp://ftp.rs.internic.net/domain/db.cache -O /var/named/named.ca
/usr/bin/systemctl restart named-chroot.service

Anschließen statten wir die Datei noch mit den eXecutable-Rechten aus, damit wir es direkt aufrufen können.

 # chmod +x /root/bin/update-dns-roots

Abschließend tragen wir noch in die crontab ein, dass alle 5 Monate die Datei aktualisiert werden soll.

 # vim /etc/crontab
/etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
 
# For details see man 4 crontabs
 
# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed
 
# Django : 2017-12-29 - alle fünft Monate Aktualisieren der BIND Root Hints Data File
20 3 * */5 * /root/bin/update-dns-roots >/dev/null 2>&1

Zonen-Dateien für lokale Adressen

In nun folgenden Konfigurationsbeispiel wollen wir einen primären DNS-Server aufsetzen, der folgende zwei Zonen verwalten soll:

  • DMZ : Domäne dmz.nausch.org - IP-Netz: 10.0.0.0/24
  • INTRA : Domäne intra.nausch.org - IP-Netz: 10.0.10.0/25

Die Clientanfragen aus den beiden Netzen sollen dabei mit Hilfe unterschiedlicher views voneinander getrennt werden, so dass ein Client aus dem Intranet für die gleiche Anfrage wie von einen anderen Client aus der DMZ unterschiedliche Antworten bekommen soll.

  • view - INTRA
  • view - DMZ

Bevor wir nun die notwendigen Zonen-Dateien für unseren DNS-Server anlegen werden, legen wir uns zunächst eine eigenen Verzeichnis an, in dem wir später dann die Zonen-Dateien ablegen werden.

 # mkdir /var/named/master
 # mkdir /var/named/intra

Anschließend statten wir unser neues Konfigurationsverzeichnis noch mit den nötigen Datei, Benutzer- und Gruppenrechten aus.

 # chown named:named /var/named/master
 # chown named:named /var/named/intra
 # chmod 770 /var/named/master
 # chmod 770 /var/named/intra

Nun können wir für jede Zone in unserem neuen Verzeichnis /var/named/master jeweils die benötigten Dateien anlegen.

intra.nausch.org.zone.db

Zunächst legen wir uns also die Zonen-Datei für die Forward-Auflösung der Zone INTRANET an.

 # vim /var/named/master/intra.nausch.org.zone.db
/var/named/master/intra.nausch.org.zone.db
$ORIGIN .
$TTL    86400 ; 1 day
intra.nausch.org        IN SOA  ns1.intra.nausch.org. hostmaster.nausch.org. (
                                2017122901 ; serial
                                28800      ; refresh (8 hours)
                                7200       ; retry (2 hours)
                                604800     ; expire (1 week)
                                86400      ; minimum (1 day)
                                )
                        NS      ns1.intra.nausch.org.
                        MX      10 mx1.nausch.org.
$ORIGIN intra.nausch.org.
ns1                     A       10.0.10.27
 
vml010027               A       10.0.10.27
pml010051               A       10.0.10.17
 
$ORIGIN intra.nausch.org.
test                    CNAME   ns1
 
fwi                     CNAME   vml010027
gateway			CNAME	vml010027
proton                  CNAME   pml010051

Zur Prüfung unserer gerade angelegten Zonendatei nutzen wir folgenden Befehl:

 # named-checkzone intra.nausch.org /var/named/master/intra.nausch.org.zone.db
zone intra.nausch.org/IN: loaded serial 2017122901
OK

10.0.10.zone.db

Nun legen wir für die Reverseauflösung der Zone INTRANET für das IP-Netz 10.0.10.0/25 das zugehörige Zonenfile an.

 # vim /var/named/master/10.0.10.in-addr.arpa.zone.db
/var/named/master/10.0.10.in-addr.arpa.zone.db
$TTL    86400 ; 1 day
@                       IN SOA  ns1.intra.nausch.org. hostmaster.nausch.org. (
                                2017122901 ; serial
                                28800      ; refresh (8 hours)
                                7200       ; retry (2 hours)
                                604800     ; expire (1 week)
                                86400      ; minimum (1 day)
                                )
                        NS      ns1.intra.nausch.org.
                        MX      10 mx1.nausch.org.
 
27      		PTR    	ns1.intra.nausch.org.
51      		PTR    	pml010051.intra.nausch.org.

Wie schon zuvor bei der Zonen-Datei für die Forward-Auflösung checken wir nun auch hier die gerade angelegte Datei auf Tippfehler mit folgenden Befehl:

 # named-checkzone 10.0.10 /var/named/master/10.0.10.in-addr.arpa.zone.db
zone 10.0.10/IN: loaded serial 2017122901
OK

dmz.nausch.org.zone.db

Nachdem wir die Konfiguration der Zone Intranet abgeschlossen haben, werden wir nun als nächstes die Zone DMZ konfigurieren. Als erstes werden wir auch hier das Zonefile für die Forwardauflösung anlegen.

 # vim /var/named/master/dmz.nausch.org.zone.db
/var/named/master/dmz.nausch.org.zone.db
$ORIGIN .
$TTL    86400 ; 1 day
dmz.nausch.org          IN SOA  ns1.dmz.nausch.org. hostmaster.nausch.org. (
				2017122901 ; serial
                                28800      ; refresh (8 hours)
                                7200       ; retry (2 hours)
                                604800     ; expire (1 week)
                                86400      ; minimum (1 day)
                                )
                        NS      ns1.dmz.nausch.org.
                        MX	10 mx1.nausch.org.
$ORIGIN dmz.nausch.org.
ns1			A	10.0.0.27
 
vml000017               A       10.0.0.17
vml000027		A       10.0.0.27
 
$ORIGIN dmz.nausch.org.
test			CNAME	ns1
fwe			CNAME   vml000017
fwi			CNAME   vml000027

Auch hier führen wir den Syntax- und Plausibilitäts-Check durch.

 # named-checkzone dmz.nausch.org /var/named/master/dmz.nausch.org.zone.db
zone dmz.nausch.org/IN: loaded serial 2017122901
OK

0.0.10.zone.db

Was nun noch fehlt ist das Zonenfile für die Zonendatei für die Reverseauflösung der Zone DMZ.  

 # vim /var/named/master/0.0.10.in-addr.arpa.zone.db
/var/named/master/0.0.10.in-addr.arpa.zone.db
$TTL    86400 ; 1 day
@                       IN SOA  ns1.dmz.nausch.org. hostmaster.nausch.org. (
                                2017122901 ; serial
                                28800      ; refresh (8 hours)
                                7200       ; retry (2 hours)
                                604800     ; expire (1 week)
                                86400      ; minimum (1 day)
                                )
                        NS      ns1.dmz.nausch.org.
                        MX      10 mx1.nausch.org.
 
17                      PTR     vml000017.dmz.nausch.org.
27                      PTR     vml000027.dmz.nausch.org.

Wie schon zuvor bei der Zonen-Datei für die Forward-Auflösung checken wir nun auch hier die gerade angelegte Datei auf Tippfehler mit folgenden Befehl:

 # named-checkzone 0.0.10 /var/named/master/0.0.10.in-addr.arpa.zone.db
zone 0.0.10/IN: loaded serial 2017122901
OK

dmz.nausch.org.zone.db (intra)

Nachdem wir die Konfiguration der Zone Intranet abgeschlossen haben, werden wir nun als nächstes die Zone DMZ konfigurieren. Als erstes werden wir auch hier das Zonefile für die Forwardauflösung anlegen.

 # vim /var/named/intra/dmz.nausch.org.zone.db
/var/named/intra/dmz.nausch.org.zone.db
$ORIGIN .
$TTL    86400 ; 1 day
dmz.nausch.org          IN SOA  ns1.dmz.nausch.org. hostmaster.nausch.org. (
				2017122901 ; serial
                                28800      ; refresh (8 hours)
                                7200       ; retry (2 hours)
                                604800     ; expire (1 week)
                                86400      ; minimum (1 day)
                                )
                        NS      ns1.dmz.nausch.org.
                        MX	10 mx1.nausch.org.
$ORIGIN dmz.nausch.org.
ns1			A	10.0.0.27

Auch hier führen wir den Syntax- und Plausibilitäts-Check durch.

 # named-checkzone dmz.nausch.org /var/named/intra/dmz.nausch.org.zone.db
zone dmz.nausch.org/IN: loaded serial 2017122901
OK

0.0.10.zone.db (intra)

Was nun noch fehlt ist das Zonenfile für die Zonendatei für die Reverseauflösung der Zone DMZ.

 # vim /var/named/intra/0.0.10.in-addr.arpa.zone.db
/var/named/intra/0.0.10.in-addr.arpa.zone.db
$TTL    86400 ; 1 day
@                       IN SOA  ns1.dmz.nausch.org. hostmaster.nausch.org. (
                                2017122901 ; serial
                                28800      ; refresh (8 hours)
                                7200       ; retry (2 hours)
                                604800     ; expire (1 week)
                                86400      ; minimum (1 day)
                                )
                        NS      ns1.dmz.nausch.org.
                        MX      10 mx1.nausch.org.
 
27                      PTR     ns1.dmz.nausch.org.

Wie schon zuvor bei der Zonen-Datei für die Forward-Auflösung checken wir nun auch hier die gerade angelegte Datei auf Tippfehler mit folgenden Befehl:

 # named-checkzone 0.0.10 /var/named/intra/0.0.10.in-addr.arpa.zone.db
zone 0.0.10/IN: loaded serial 2017122901
OK

named.conf

Für unser Konfigurationsbeispiel legen wir uns nun eine eigene individuelle Konfigurationsdatei an, die all unsere Anwendungsfälle abdeckt. Die enizelnen Optionen sind in der Konfigurationsdatei /etc/named.conf ausführlich beschrieben.

 # vim /etc/named.conf
/etc/named.conf
/* ****************************** named.conf ****************************** */
 
// ISC Bind Konfigurationsdatei auf Basis der Beispiels-Konfigurationsdatei
//       /usr/share/doc/bind*/sample/ aus dem zugehörigen RPM-Paket
// Konfig-Beschreibung: https://dokuwiki.nausch.org/doku.php/centos:bind_c7
 
/* ********** Variablendefinition für die unterschiedlichen ACLs ********** */
acl dmz        { 
		10.0.0.0/24;
};
 
acl intra      {
		10.0.10.0/25;
};
 
acl primary    { 
		10.0.0.27/32;
};
 
acl interfaces { 
		10.0.0.27/32;
		10.0.10.27/32;
};
 
 
/* *********************** rndc Schlüsseldefinition *********************** */
include "/etc/rndc_local.key";
 
 
/* *********************** rndc Control-Definition ************************ */
controls {
        inet 127.0.0.1 port 953
        allow { 127.0.0.1; } keys { "rndc-key"; };
};
 
 
/* ***************** Definition der allgemeinen Optionen ****************** */
options {
	// Arbeitsverzeichnis des Servers 
	directory "/var/named";
 
	// Das Verzeichnis, in dem sich die öffentlichen und privaten 
	// DNSSEC-Schlüsseldateien befinden sollen. 
	key-directory "/var/named";
 
	// Das Verzeichnis, in dem die Dateien gespeichert werden, welche 
	// die verwalteten DNSSEC-Schlüssel verfolgen.
	managed-keys-directory "/var/named/dynamic";
 
	// Pfadname der Datei, um die eingebauten vertrauenswürdigen Schlüssel 
	// von named zu überschreiben. Pfad zum ISC DLV Schlüssel.
	bindkeys-file "/etc/named.iscdlv.key";
 
        // Der Pfadname der Datei, in die ein TSIG-Sitzungsschlüssel geschrieben 
        // werden soll, der mit named für die Verwendung durch nsupdate -l 
        // erzeugt wurde.
        session-keyfile "/run/named/session.key";
 
	// Der Pfadname der Datei, auf die der Server die security roots 
	// schreibt, wenn er hierzu angewiesen wird.
	secroots-file "/var/named/data/named_secroots.db";
 
	// Der Pfadname der Datei, auf die der Server die Datenbank übergibt, 
	// wenn er angewiesen wird.
	dump-file "/var/named/data/cache_dump.db";
 
	// Der Pfadname der Datei, an die der Server Statistiken anhängt, 
	// wenn er Server hierzu angewiesen wird.
	statistics-file "/var/named/data/named_stats.txt";
 
	// Der Pfadname der Datei, in die der Server beim Beenden die 
	// Speicherverbrauchsstatistik schreibt.
	memstatistics-file "/var/named/data/named_mem_stats.txt";
 
	// Pfadname der Datei, in die der Server Abfragen, die gerade 
	// wiederkehren, ausgibt, wenn er dazu angewiesen wird.
	recursing-file "/var/named/data/named_recursing.db";
 
	// Pfadname der Datei, in die der Server seine Prozess-ID schreibt.
	pid-file "/run/named/named.pid";
 
	// Wird folgender Parameter auf "yes" gesetzt, dann fügt der Server 
	// bei der Generierung von Antworten nur dann Datensätze zur authority
	// und additional data sections hinzu, wenn sie benötigt werden.
	minimal-responses no;
 
	/* Wird folgender Parameter auf "yes" gesetzt, dann wird der Server
	   versuchen bei einer rekursiven DNS-Abfrage, alles versuchen um die
	   Anfrage bestmöglich abzuarbeiten. Ist die Rekursion ausgeschaltet 
	   ist und der Server die Antwort noch nicht kennt, gibt er eine 
	   referral response (Empfehlungsantwort) zurück. 
	   Die Default-Einstellung ist "yes". 
	   Wichtig: Das Setzen der Rekursions-Option auf "no" verhindert nicht,
	   dass Clients Daten aus dem Server-Cache beziehen; es verhindert nur, 
	   dass neue Daten als Folge von Client-Abfragen zwischengespeichert werden.
 
	   Sofern der rekursiver DNS-Server über eine öffentliche IP-Adresse 
	   verfügt, MUSS zwingend eine Zugriffskontrolle aktiviert werden, um 
	   Abfragen auf die legitimen Benutzer zu beschränken!
	   Nichtbeachtung kann zu Folgen haben, dass sonst der Server ein Teil 
	   von groß angelegten DNS-Amplifikations-Angriffen werden könnte.
	   Die Implementierung von BCP38 in Ihrem Netzwerk würde diese 
	   Angriffsfläche erheblich reduzieren!
	 */
	recursion yes;
 
	// DNSsec-Support aktivieren
	dnssec-enable yes;
 
	/* DNSsec-Validierung aktivieren und mit den Root-Zertificaten abgleichen.
	   "yes" = DNSSEC-Validierung ist aktiviert, aber ein Vertrauensanker muss 
		   manuell konfiguriert werden. Eine Validierung findet erst dann 
		   statt, wenn mindestens einen vertrauenswürdigen Schlüssel 
		   manuell konfiguriert haben. Dies ist die Voreinstellung.
	   "no"  = Die DNSSEC-Validierung ist deaktiviert, und rekursive Server 
		   verhalten sich in der "altmodischen" Art und Weise, unsichere 
		   DNS-Lookups durchzuführen.
	   "auto"= Die DNSSEC-Validierung ist aktiviert, und es wird ein 
		   Standard-Trust-Anker (als Teil von BIND enthalten) für die 
		   DNS-Rootzone verwendet.
	 */
	dnssec-validation auto;
 
	/* Wird diese option gesetzt, stellt dnssec-lookaside dem validator eine 
	   alternative Methode zur Verfügung, um DNSKEY-Einträge bei Start einer
	   Zone (top of a zone) zu validieren. Wenn dnssec-lookaside auf auto 
	   gesetzt ist, dann werden die eingebauten Standardwerte für die 
	   DLV-Domäne und den Vertrauensanker verwendet, zusammen mit einem 
	   eingebauten Schlüssel für die Validierung.
	 */
	dnssec-lookaside auto;
 
	// Diese Option wird verwendet, um den Zeichensatz und die Syntax 
	// bestimmter Domänennamen in Masterdateien und/oder DNS-Antworten, 
	// die vom Netzwerk empfangen werden, einzuschränken.
	check-names master warn;
 
	// Gibt an, welche Hosts diesen Server, einen Slave, zusätzlich zu den 
	// Zonen-Mastern über Zonenänderungen benachrichtigen dürfen. 
        allow-notify { 127.0.0.1; };
 
        // Definiert, welche Hosts gewöhnliche DNS-Fragen stellen dürfen.
        allow-query { ::1; 127.0.0.1; dmz; intra; };
 
        // Legt fest, welche Hosts rekursive Abfragen über diesen Server 
	// durchführen dürfen.
        allow-recursion { ::1; 127.0.0.1; dmz; intra; };
 
        // Gibt an, welche Hosts Zonentransfers vom Server empfangen dürfen.
        allow-transfer { 127.0.0.1; primary; };
 
	// Gibt eine Liste von Adressen an, von denen der Server keine Anfragen 
	// annimmt oder die zur Lösung einer Anfrage verwendet werden. Anfragen 
	// von diesen Adressen werden nicht beantwortet.
        blackhole { none; };
 
	// Die Schnittstellen und Ports, von denen der Server Anfragen 
	// beantwortet, können mit der Listen-On-Option angegeben werden.
	listen-on port 53 { 127.0.0.1; interfaces; };
	listen-on-v6 port 53 { ::1; };
 
	// Sofern der Server die Antwort auf eine Frage nicht kennt, fragt er 
	// andere Nameserver ab. query-source gibt die Adresse und den Port an, 
	// die für solche Abfragen verwendet werden.
        query-source address * port *;
 
	// Maximale Größe eines Core Dump
	coresize default;
 
	// Maximale Größe an RAM, die der Server verbrauchen darf.
	datasize default;
 
	// Maximale Anzahl von geöffneten Dateien.
        files unlimited;
 
        // Maximale Menge an Stack-Speicher, die der Server verwenden darf.
        stacksize default;
 
	// Maximale Größe jeder Journaldatei fest. 
	// (default ist unbegrenzt, was auch 2 Gigabyte bedeutet)
        max-journal-size unlimited;
 
	// Maximale Anzahl gleichzeitiger rekursiver Suchvorgänge, die der Server
	// für Clients durchführt. Der Standardwert ist 1000.
        recursive-clients 1000;
 
	// Maximale Anzahl gleichzeitiger TCP Verbindungen die der Server von 
	// Clients akzeptiert. Der Standardwert ist 100.
        tcp-clients 100;
 
	/* Maximale Menge an Arbeitsspeicher (in Bytes), die für den Server-Cache 
	   verwendet werden kann. Ein Wert von 0 ist speziell, d.h. Datensätze 
	   werden nur aus dem Cache gelöscht, wenn ihre TTLs ablaufen ist. Ein 
	   weiteres spezielles Schlüsselwort unlimited bedeutet den maximalen Wert
	   von 32-Bit-Ganzzahlen ohne Vorzeichen (0xffffffffffff), die haben nicht
	   den gleichen Effekt wie 0 auf Maschinen, die mehr als 32 Bit unterstützen.
           Alle positiven Werte kleiner als 2MB werden ignoriert und auf 2MB gesetzt.
           Bei einem Server mit mehreren Views gilt die Begrenzung separat für
         den Cache der einzelnen Views. Der Standardwert ist 0.
	 */
        max-cache-size 0;
 
	/* List Queue Depth: Die Standardeinstellung und das Minimum ist 10. Sofern
	   der Kernel Accept-Filter-Verbindungen unterstützt, werden die Daten im
	   Kernel-Space gehalten und gewartet bevor die Anfrage weiterverarbeitet
	   wird. Werte ungleich 0 unter 10 werden stillschweigend erhöht. 
	   ein Wert von 0 kann gesetzt werden und definiert auf den meisten 
	   Plattformen, dass die Länge der Listen-Warteschlange auf einen 
           systembedingter Standardwert gesetzt wird.
	 */
	tcp-listen-queue 10;
 
	/* Der Server scannt die Liste der Netzwerkschnittstellen in regelmäßigen
	   Abständen (Minuten). Die Standardeinstellung ist 60 Minuten. Der 
	   Maximalwert beträgt 28 Tage (40320 Minuten). Wird der wert auf 0 gesetzt,
	   erfolgt die Überprüfung der Schnittstelle nur dann, wenn die 
	   Konfigurationsdatei geladen wird. Nach dem Scan beginnt der Server mit 
	   dem Abhören von Abfragen auf neu entdeckte Interfaces (vorausgesetzt, sie 
	   sind durch die Listen-On-Konfiguration erlaubt) und hört auf, auf nicht 
	   mehr vorhandene Interfaces zu hören.
	 */
	interface-interval 0;
 
	/* Definiert die Zeit in Sekunden, in denen eine lahme Serveranzeige 
	   zwischengespeichert wird. 0 deaktiviert das Caching. (Dies wird NICHT 
	   empfohlen!) Der Standardwert ist 600 (10 Minuten) und der Maximalwert 
	   ist 1800 (30 Minuten).
	 */
        lame-ttl 600;
 
	/* Um den Netzwerkverkehr zu reduzieren und die Leistung zu erhöhen, 
	   speichert der Server negative Antworten. max-ncache-ttl wird verwendet, 
	   um eine maximale Aufbewahrungszeit für diese Antworten im Server in 
	   Sekunden festzulegen. Die Standardeinstellung von max-ncache-ttl ist 
	   10800 Sekunden (3 Stunden). max-ncache-ttl kann nicht länger als 7 Tage 
	   dauern und wird stillschweigend auf 7 Tage gekürzt, sollte er auf einen 
	   größeren Wert gesetzt werden!
	 */
        max-ncache-ttl 10800;
 
	/* Legt die maximale Zeit fest, für die der Server gewöhnliche (positive) 
	   Antworten zwischenspeichert. Der Standardwert ist eine Woche (7 Tage). 
	   Ein Wert von Null kann dazu führen, dass alle Abfragen SERVFAIL 
	   zurückgeben, da im Auflösungsprozess verloren gegangene Caches von 
	   Zwischen-RRsets (z.B. NS und glue AAAA/A-Records) verloren gehen!
	 */
        max-cache-ttl 604800;
 
	 /* Definiert die Größe des angebotenen EDNS UDP-Puffers (in Bytes), um 
	    die Größe der empfangenen Pakete zu kontrollieren. Gültige Werte sind 
	    512 bis 4096 (Werte außerhalb dieses Bereichs werden stillschweigend 
	    angepasst). Der Standardwert ist 4096. Der übliche Grund für das 
	    Setzen von edns-udp-size auf einen nicht standardmäßigen Wert ist es, 
	    UDP-Antworten zu erhalten, um durch gebrochene Firewalls zu gehen, die 
	    fragmentierte Pakete blockieren und/oder UDP-Pakete blockieren, die 
	    größer als 512 Bytes sind. named wird auf die Verwendung von 512 Bytes 
	    zurückgreifen, wenn es eine Reihe von Zeitüberschreitungen beim 
	    Anfangswert erhält. 512 Bytes werden nicht angeboten, um Websites zu 
	    ermutigen, ihre Firewalls zu reparieren. Kleine EDNS UDP-Größen führen 
	    zu einer übermäßigen Nutzung von TCP. 
	  */
	edns-udp-size 4096;
 
	/* Legt die maximale EDNS UDP-Nachrichtengröße fest, die in Bytes gesendet 
	   wird. Gültige Werte sind 512 bis 4096 (Werte außerhalb dieses Bereichs 
	   werden stillschweigend angepasst). Der Standardwert ist 4096. Der 
	   übliche Grund für das Setzen von max-udp-size auf einen nicht 
	   standardmäßigen Wert ist es, UDP-Antworten zu erhalten, um durch defekte 
	   Firewalls zu gehen, die fragmentierte Pakete blockieren und/oder 
	   UDP-Pakete blockieren, die größer als 512 Bytes sind. Dies ist unabhängig
	   vom beworbenen Empfangspuffer (edns-udp-size). Wird dieser Wert auf einen 
	   niedrigen Wert gesetzt, wird zusätzlicher TCP-Verkehr zum Nameserver 
	   erzeugt!
	 */
        max-udp-size 4096;
 
	/* Definiert den Anfangswert (Minimum) der Anzahl rekursiver gleichzeitiger 
	   Clients für eine beliebige Abfrage (<qname,qtype,qclass>) fest, die der 
	   Server akzeptiert, bevor er weitere Clients ignorieren wird. Named wird 
	   versuchen, diesen Wert selbst zu tunen und Änderungen werden 
	   protokolliert. Der Standardwerte ist 10.
	 */
        clients-per-query 10;
 
	/* Definiert den Anfangswert (Maximum) der Anzahl rekursiver gleichzeitiger 
	   Clients für eine beliebige Abfrage (<qname,qtype,qclass>) fest, die der 
	   Server akzeptiert, bevor er neue Client-Verbindungen anlehnen wird.
	   Named wird versuchen, diesen Wert selbst zu tunen und Änderungen werden 
	   protokolliert. Die Standardeinstellung ist 100.
	 */ 
        max-clients-per-query 100;
 
	/* Festlegung der Angaben (Version), die der Server über eine Abfrage des 
	   Namens version.bind mit dem Typ TXT, Klasse CHAOS, melden soll. Der
	   Default-Wert ist die reale Versionsnummer des Servers. Durch die Angabe 
	   der Version none wird die Verarbeitung der Abfragen deaktiviert.
	 */
	version "DNS - nausch.org";
 
	/* Der Hostname, den der Server über eine Abfrage des Namens hostname.bind 
	   mit dem Typ TXT, Klasse CHAOS, melden soll. Dies ist standardmäßig der 
	   Hostname des Rechners, auf dem sich der Name-Server befindet, wie er von
	   der Funktion gethostname() gefunden wird. Die ID, die der Server beim 
	   Empfang einer NSID-Abfrage (Name Server Identifier) oder einer Abfrage 
	   des Namens ID.SERVER vom Typ TXT, Klasse CHAOS, melden soll. Der primäre 
	   Zweck solcher Abfragen ist es, herauszufinden, welcher einer Gruppe von 
	   Anycast-Servern Ihre Anfragen tatsächlich beantwortet. 
	   Angabe von server-id none; deaktiviert die Verarbeitung der Abfragen. 
	   Die Angabe von server-id hostname; bewirkt, dass named den Hostnamen 
	   verwendet, wie er durch die Funktion gethostname() gefunden wurde. 
	   Der Standardwert ist none.
	 */
        server-id none;
};
 
/* ******************* Definition der Logging-Parameter ******************* */
logging {
 
        // Definition der unterschiedlichen Kanäle
 
        // Standard-Startmeldungen
        channel default_debug {
                file "data/named.run";
                severity dynamic;
                print-category yes;
                print-severity yes;
                print-time yes;
        };
        // Genehmigung und Ablehnung von DNS-Anfragen
        channel custom_security {
                file "data/named.security";
                severity info;
                print-category yes;
                print-severity yes;
                print-time yes;
        };
        // Lame servers. Dabei handelt es sich um Fehlkonfigurationen bei
        // Remote-Servern, die von BIND 9 entdeckt wurden, als dieser
        // versuchte, diese Server während der Auflösung abzufragen.
        channel custom_lame-servers {
                file "data/named.lame-servers";
                severity info;
                print-category yes;
                print-severity yes;
                print-time yes;
        };
 
        // Definition der beiden Kathegorien security und lame-servers
 
        category security {
                custom_security;
                default_syslog;
                default_debug;
        };
        category lame-servers {
                custom_lame-servers ;
                default_syslog;
                default_debug;
        };
};
 
/* ******************** Definition der Views and Zones ******************** */
/*
                                WICHTIG:
                                ========
 
           Die Reihenfolge der View-Anweisungen ist signifikant. 
           Eine Client-Anfrage wird im Kontext der ersten Ansicht 
                      beantwortet, zu der sie passt!
 */
view "intra" IN {
        // Ist der Anfragende Client aus dem Netz 10.0.10.0/25 (Intranet)?
        match-clients { intra; };
 
        /* ACHTUNG: Eine Zone kann entweder durch Bearbeiten von Zonendateien 
                    und Neuladen des Servers oder durch dynamisches Update 
		    aktualisiert werden, aber NIEMALS durch beides! 
		    Ist die dynamische Aktualisierung für eine Zone mit der 
		    Option "allow-update" aktiviert, darf KEINENFALLS die 
		    Zonendatei manuell bearbeitet werden! Der Server würde 
		    dann nicht mehr versuchen, die Informationen zur Zone
		    aus der Datei zu laden!
	 */
 
        // Zone: root server
        zone "." IN {
                type hint;
                file "named.ca";
        };
 
        // Zone: localhost
        include "/etc/named.rfc1912.zones";
 
        // Zone: intra.nausch.org (forward)
        zone "intra.nausch.org" IN {
                type master;
                file "master/intra.nausch.org.zone.db";
        };
 
        // Zone: intra.nausch.org (reverse)
        zone "10.0.10.in-addr.arpa" IN {
                type master;
                file "master/10.0.10.in-addr.arpa.zone.db";
        };
 
        // Zone: dmz.nausch.org   (forward)
        zone "dmz.nausch.org" IN {
                type master;
                file "intra/dmz.nausch.org.zone.db";
        };
 
        // Zone: dmz.nausch.org   (reverse)
        zone "0.0.10.in-addr.arpa" IN {
                type master;
                file "intra/0.0.10.in-addr.arpa.zone.db";
        };
 
};
 
view "dmz" IN {
        // Ist der Anfragende Client aus dem Netz 10.0.0.0/24 (DMZ)?
        match-clients { localhost; dmz; };
 
        /* ACHTUNG: Eine Zone kann entweder durch Bearbeiten von Zonendateien 
                    und Neuladen des Servers oder durch dynamisches Update 
                    aktualisiert werden, aber NIEMALS durch beides! 
                    Ist die dynamische Aktualisierung für eine Zone mit der 
                    Option "allow-update" aktiviert, darf KEINENFALLS die 
                    Zonendatei manuell bearbeitet werden! Der Server würde 
                    dann nicht mehr versuchen, die Informationen zur Zone
                    aus der Datei zu laden!
         */
 
        // Zone: root server
        zone "." IN {
                type hint;
                file "named.ca";
        };
 
        // Zone: localhost
        include "/etc/named.rfc1912.zones";
 
        // Zone: intra.nausch.org (forward)
        zone "intra.nausch.org" IN {
                type master;
                file "master/intra.nausch.org.zone.db";
        };
 
        // Zone: intra.nausch.org (reverse)
        zone "10.0.10.in-addr.arpa" IN {
                type master;
                file "master/10.0.10.in-addr.arpa.zone.db";
        };
 
        // Zone: dmz.nausch.org   (forward)
        zone "dmz.nausch.org" IN {
                type master;
                file "master/dmz.nausch.org.zone.db";
        };
 
        // Zone: dmz.nausch.org   (reverse)
        zone "0.0.10.in-addr.arpa" IN {
                type master;
                file "master/0.0.10.in-addr.arpa.zone.db";
        };
};
 
 
/* *************************** sonstige includes ************************** */
include "/etc/named.root.key";

Bevor wir zur Aktivierung unserer Konfiguration nun den Nameserver einmal durchstarten überprüfen wir noch, ob sich kein Schreibfehler oder sonstiger Konfigurationsfehler eingeschlichen hat.

 # named-checkconf

Geben wir beim Aufruf des Befehls named-checkconf die Option -p an, wird uns die (aufgelöste) Konfiguration ohne die ganzen Kommentare ausgegeben.

 # named-checkconf -p
options {
	bindkeys-file "/etc/named.iscdlv.key";
	blackhole {
		"none";
	};
	coresize default;
	datasize default;
	session-keyfile "/run/named/session.key";
	directory "/var/named";
	dump-file "/var/named/data/cache_dump.db";
	files unlimited;
	interface-interval 0;
	listen-on port 53 {
		127.0.0.1/32;
		"interfaces";
	};
	listen-on-v6 port 53 {
		::1/128;
	};
	managed-keys-directory "/var/named/dynamic";
	memstatistics-file "/var/named/data/named_mem_stats.txt";
	pid-file "/run/named/named.pid";
	recursing-file "/var/named/data/named_recursing.db";
	recursive-clients 1000;
	secroots-file "/var/named/data/named_secroots.db";
	server-id none;
	stacksize default;
	statistics-file "/var/named/data/named_stats.txt";
	tcp-clients 100;
	tcp-listen-queue 10;
	version "DNS - nausch.org";
	allow-recursion {
		::1/128;
		127.0.0.1/32;
		"dmz";
		"intra";
	};
	check-names master warn;
	clients-per-query 10;
	dnssec-enable yes;
	dnssec-lookaside auto;
	dnssec-validation auto;
	edns-udp-size 4096;
	lame-ttl 600;
	max-cache-size 0;
	max-cache-ttl 604800;
	max-clients-per-query 100;
	max-ncache-ttl 10800;
	max-udp-size 4096;
	minimal-responses no;
	query-source address 0.0.0.0 port 0;
	recursion yes;
	allow-notify {
		127.0.0.1/32;
	};
	allow-query {
		::1/128;
		127.0.0.1/32;
		"dmz";
		"intra";
	};
	allow-transfer {
		127.0.0.1/32;
		"primary";
	};
	key-directory "/var/named";
	max-journal-size unlimited;
};
controls {
	inet 127.0.0.1 port 953 allow {
		127.0.0.1/32;
	} keys {
		"rndc-key";
	};
};
acl "dmz" {
	10.0.0.0/24;
};
acl "intra" {
	10.0.10.0/25;
};
acl "primary" {
	10.0.0.27/32;
};
acl "interfaces" {
	10.0.0.27/32;
	10.0.10.27/32;
};
logging {
	channel "default_debug" {
		file "data/named.run";
		severity dynamic;
		print-time yes;
		print-severity yes;
		print-category yes;
	};
	channel "custom_security" {
		file "data/named.security";
		severity info;
		print-time yes;
		print-severity yes;
		print-category yes;
	};
	channel "custom_lame-servers" {
		file "data/named.lame-servers";
		severity info;
		print-time yes;
		print-severity yes;
		print-category yes;
	};
	category "security" {
		"custom_security";
		"default_syslog";
		"default_debug";
	};
	category "lame-servers" {
		"custom_lame-servers";
		"default_syslog";
		"default_debug";
	};
};
view "intra" IN {
	match-clients {
		"intra";
	};
	zone "." IN {
		type hint;
		file "named.ca";
	};
	zone "localhost.localdomain" IN {
		type master;
		file "named.localhost";
		allow-update {
			"none";
		};
	};
	zone "localhost" IN {
		type master;
		file "named.localhost";
		allow-update {
			"none";
		};
	};
	zone "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" IN {
		type master;
		file "named.loopback";
		allow-update {
			"none";
		};
	};
	zone "1.0.0.127.in-addr.arpa" IN {
		type master;
		file "named.loopback";
		allow-update {
			"none";
		};
	};
	zone "0.in-addr.arpa" IN {
		type master;
		file "named.empty";
		allow-update {
			"none";
		};
	};
	zone "intra.nausch.org" IN {
		type master;
		file "master/intra.nausch.org.zone.db";
	};
	zone "10.0.10.in-addr.arpa" IN {
		type master;
		file "master/10.0.10.in-addr.arpa.zone.db";
	};
	zone "dmz.nausch.org" IN {
		type master;
		file "intra/dmz.nausch.org.zone.db";
	};
	zone "0.0.10.in-addr.arpa" IN {
		type master;
		file "intra/0.0.10.in-addr.arpa.zone.db";
	};
};
view "dmz" IN {
	match-clients {
		"localhost";
		"dmz";
	};
	zone "." IN {
		type hint;
		file "named.ca";
	};
	zone "localhost.localdomain" IN {
		type master;
		file "named.localhost";
		allow-update {
			"none";
		};
	};
	zone "localhost" IN {
		type master;
		file "named.localhost";
		allow-update {
			"none";
		};
	};
	zone "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" IN {
		type master;
		file "named.loopback";
		allow-update {
			"none";
		};
	};
	zone "1.0.0.127.in-addr.arpa" IN {
		type master;
		file "named.loopback";
		allow-update {
			"none";
		};
	};
	zone "0.in-addr.arpa" IN {
		type master;
		file "named.empty";
		allow-update {
			"none";
		};
	};
	zone "intra.nausch.org" IN {
		type master;
		file "master/intra.nausch.org.zone.db";
	};
	zone "10.0.10.in-addr.arpa" IN {
		type master;
		file "master/10.0.10.in-addr.arpa.zone.db";
	};
	zone "dmz.nausch.org" IN {
		type master;
		file "master/dmz.nausch.org.zone.db";
	};
	zone "0.0.10.in-addr.arpa" IN {
		type master;
		file "master/0.0.10.in-addr.arpa.zone.db";
	};
};
key "rndc-key" {
	algorithm "hmac-md5";
	secret "TLtbjaRq8ci9RivwIseG42qAL88Vt05UESRrOtT4Kh2oUvU81tosVmHQWeX488lbuVxYfdpKZMD7d76Q6jyCJw==";
};
managed-keys {
	"." initial-key 257 3 8 "AwEAAagAIKlVZrpC6Ia7gEzahOR+9W29euxhJhVVLOyQbSEW0O8gcCjF FVQUTf6v58fLjwBd0YI0EzrAcQqBGCzh/RStIoO8g0NfnfL2MTJRkxoX bfDaUeVPQuYEhg37NZWAJQ9VnMVDxP/VHL496M/QZxkjf5/Efucp2gaD X6RS6CXpoY68LsvPVjR0ZSwzz1apAzvN9dlzEheX7ICJBBtuA6G3LQpz W5hOA2hzCTMjJPJ8LbqF6dsV6DoBQzgul0sGIcGOYl7OyQdXfZ57relS Qageu+ipAdTTJ25AsRTAoub8ONGcLmqrAmRLKBP1dfwhYB4N7knNnulq QxA+Uk1ihz0=";
	"." initial-key 257 3 8 "AwEAAaz/tAm8yTn4Mfeh5eyI96WSVexTBAvkMgJzkKTOiW1vkIbzxeF3 +/4RgWOq7HrxRixHlFlExOLAJr5emLvN7SWXgnLh4+B5xQlNVz8Og8kv ArMtNROxVQuCaSnIDdD5LKyWbRd2n9WGe2R8PzgCmr3EgVLrjyBxWezF 0jLHwVN8efS3rCj/EWgvIWgb9tarpVUDK/b58Da+sqqls3eNbuv7pr+e oZG+SrDK6nWeL3c6H5Apxz7LjVc1uTIdsIXxuOLYA4/ilBmSVIzuDWfd RUfhHdY6+cn8HFRm+2hM8AnXGXws9555KrUB5qihylGa8subX2Nn6UwN R1AkUTV74bU=";
};

Neustart des Daemon

Da mit der zuvor erstellten Konfiguration unseres Servers alles in Ordnung war, spricht nun nichts mehr dagegen, zur Aktivierung unserer Konfiguration den Daemon einmal durchzustarten.

 # systemctl restart named-chroot.service

Den Status des laufenden Daemon fragen wir wie gewohnt wie folgt ab.

 # systemctl status named-chroot.service

named-chroot.service - Berkeley Internet Name Domain (DNS)
   Loaded: loaded (/usr/lib/systemd/system/named-chroot.service; enabled; vendor preset: disabled)
   Active: active (running) since Sat 2017-12-30 18:38:53 CET; 13s ago
  Process: 13221 ExecStop=/bin/sh -c /usr/sbin/rndc stop > /dev/null 2>&1 || /bin/kill -TERM $MAINPID (code=exited, status=0/SUCCESS)
  Process: 13324 ExecStart=/usr/sbin/named -u named -c ${NAMEDCONF} -t /var/named/chroot $OPTIONS (code=exited, status=0/SUCCESS)
  Process: 13322 ExecStartPre=/bin/bash -c if [ ! "$DISABLE_ZONE_CHECKING" == "yes" ]; then /usr/sbin/named-checkconf -t /var/named/chroot -z "$NAMEDCONF"; else echo "Checking of zone files is disabled"; fi (code=exited, status=0/SUCCESS)
 Main PID: 13327 (named)
   CGroup: /system.slice/named-chroot.service
           └─13327 /usr/sbin/named -u named -c /etc/named.conf -t /var/named/chroot

Dec 30 18:38:53 vml000027.dmz.nausch.org named[13327]: automatic empty zone: view dmz: B.E.F.IP6.ARPA
Dec 30 18:38:53 vml000027.dmz.nausch.org named[13327]: automatic empty zone: view dmz: 8.B.D.0.1.0.0.2.IP6.ARPA
Dec 30 18:38:53 vml000027.dmz.nausch.org named[13327]: command channel listening on 127.0.0.1#953
Dec 30 18:38:53 vml000027.dmz.nausch.org named[13327]: managed-keys-zone/intra: loaded serial 0
Dec 30 18:38:53 vml000027.dmz.nausch.org named[13327]: managed-keys-zone/dmz: loaded serial 0
Dec 30 18:38:53 vml000027.dmz.nausch.org named[13327]: zone 0.in-addr.arpa/IN/intra: loaded serial 0
Dec 30 18:38:53 vml000027.dmz.nausch.org named[13327]: zone 10.0.10.in-addr.arpa/IN/intra: loaded serial 2017122901
Dec 30 18:38:53 vml000027.dmz.nausch.org named[13327]: zone 1.0.0.127.in-addr.arpa/IN/intra: loaded serial 0
Dec 30 18:38:53 vml000027.dmz.nausch.org named[13327]: zone intra.nausch.org/IN/intra: loaded serial 2017122901
Dec 30 18:38:53 vml000027.dmz.nausch.org systemd[1]: Started Berkeley Internet Name Domain (DNS).

Natürlich können wir den Status des DNS-servers auch mit Hilfe des Name Server Control Utility rndc abfragen.

 # rndc status
version: 9.9.4-RedHat-9.9.4-51.el7_4.1 (DNS - nausch.org) <id:8f9657aa>
CPUs found: 1
worker threads: 1
UDP listeners per interface: 1
number of zones: 208
debug level: 0
xfers running: 0
xfers deferred: 0
soa queries in progress: 0
query logging is OFF
recursive clients: 0/0/1000
tcp clients: 0/100
server is up and running

Zur weiteren Überprüfung und/oder ggf. nötigen Fehlersuche ist ein Blick in folgende Logdateien vorzunehmen:

  • /var/log/messages mit
     # less /var/log/messages

    oder

     # tailf /var/log/messages
  • /var/named/data/named.run mit
     # less /var/named/data/named.run

    oder

     # tailf /var/named/data/named.run
  • /var/named/data/named.lame-servers mit
     # less /var/named/data/named.lame-servers

    oder

     # tailf /var/named/data/named.lame-servers
  • /var/named/data/named.security mit
     # less /var/named/data/named.security

    oder

     # tailf /var/named/data/named.security

DNSsec


FIXME … do gehda weida! FIXME

1)
Berkeley Internet Name Domain
2)
Domain Name System
3)
change root
4)
UserInterface