10.6. Domain Name Servers (DNS)

10.6.1. 原则与机制

The Domain Name Service (DNS) is a fundamental component of the Internet: it maps host names to IP addresses (and vice-versa), which allows the use of www.debian.org instead of 5.153.231.4 or 2001:41c8:1000:21::21:4.

DNS records are organized in zones; each zone matches either a domain (or a subdomain) or an IP address range (since IP addresses are generally allocated in consecutive ranges). A primary server is authoritative on the contents of a zone; secondary servers, usually hosted on separate machines, provide regularly refreshed copies of the primary zone.

Each zone can contain records of various kinds (Resource Records):

  • A: IPv4 address.

  • CNAME: alias (canonical name).

  • MX: mail exchange, an email server. This information is used by other email servers to find where to send email addressed to a given address. Each MX record has a priority. The highest-priority server (with the lowest number) is tried first (see sidebar 基本知识 SMTP); other servers are contacted in order of decreasing priority if the first one does not reply.

  • PTR: mapping of an IP address to a name. Such a record is stored in a “reverse DNS” zone named after the IP address range. For example, 1.168.192.in-addr.arpa is the zone containing the reverse mapping for all addresses in the 192.168.1.0/24 range.

  • AAAA: IPv6 address.

  • NS: maps a name to a name server. Each domain must have at least one NS record. These records point at a DNS server that can answer queries concerning this domain; they usually point at the primary and secondary servers for the domain. These records also allow DNS delegation; for instance, the falcot.com zone can include an NS record for internal.falcot.com, which means that the internal.falcot.com zone is handled by another server. Of course, this server must declare an internal.falcot.com zone.

The reference name server, Bind, was developed and is maintained by ISC (Internet Software Consortium). It is provided in Debian by the bind9 package. Version 9 brings two major changes compared to previous versions. First, the DNS server can now run under an unprivileged user, so that a security vulnerability in the server does not grant root privileges to the attacker (as was seen repeatedly with versions 8.x).

Furthermore, Bind supports the DNSSEC standard for signing (and therefore authenticating) DNS records, which allows blocking any spoofing of this data during man-in-the-middle attacks.

CULTURE DNSSEC

The DNSSEC norm is quite complex; this partly explains why it is not in widespread usage yet (even if it perfectly coexists with DNS servers unaware of DNSSEC). To understand all the ins and outs, you should check the following article.

http://en.wikipedia.org/wiki/Domain_Name_System_Security_Extensions

10.6.2. 配置

Configuration files for bind, irrespective of version, have the same structure.

The Falcot administrators created a primary falcot.com zone to store information related to this domain, and a 168.192.in-addr.arpa zone for reverse mapping of IP addresses in the local networks.

CAUTION Names of reverse zones

Reverse zones have a particular name. The zone covering the 192.168.0.0/16 network needs to be named 168.192.in-addr.arpa: the IP address components are reversed, and followed by the in-addr.arpa suffix.

For IPv6 networks, the suffix is ip6.arpa and the IP address components which are reversed are each character in the full hexadecimal representation of the IP address. As such, the 2001:0bc8:31a0::/48 network would use a zone named 0.a.1.3.8.c.b.0.1.0.0.2.ip6.arpa.

TIP Testing the DNS server

The host command (in the bind9-host package) queries a DNS server, and can be used to test the server configuration. For example, host machine.falcot.com localhost checks the local server’s reply for the machine.falcot.com query. host *ipaddress* localhost tests the reverse resolution.

The following configuration excerpts, taken from the Falcot files, can serve as starting points to configure a DNS server:

例 10.12. Excerpt of /etc/bind/named.conf.local

  1. zone "falcot.com" {
  2. type master;
  3. file "/etc/bind/db.falcot.com";
  4. allow-query { any; };
  5. allow-transfer {
  6. 195.20.105.149/32 ; // ns0.xname.org
  7. 193.23.158.13/32 ; // ns1.xname.org
  8. };
  9. };
  10.  
  11. zone "internal.falcot.com" {
  12. type master;
  13. file "/etc/bind/db.internal.falcot.com";
  14. allow-query { 192.168.0.0/16; };
  15. };
  16.  
  17. zone "168.192.in-addr.arpa" {
  18. type master;
  19. file "/etc/bind/db.192.168";
  20. allow-query { 192.168.0.0/16; };
  21. };

例 10.13. Excerpt of /etc/bind/db.falcot.com

  1. ; falcot.com Zone
  2. ; admin.falcot.com. => zone contact: admin@falcot.com
  3. $TTL 604800
  4. @ IN SOA falcot.com. admin.falcot.com. (
  5. 20040121 ; Serial
  6. 604800 ; Refresh
  7. 86400 ; Retry
  8. 2419200 ; Expire
  9. 604800 ) ; Negative Cache TTL
  10. ;
  11. ; The @ refers to the zone name ("falcot.com" here)
  12. ; or to $ORIGIN if that directive has been used
  13. ;
  14. @ IN NS ns
  15. @ IN NS ns0.xname.org.
  16.  
  17. internal IN NS 192.168.0.2
  18.  
  19. @ IN A 212.94.201.10
  20. @ IN MX 5 mail
  21. @ IN MX 10 mail2
  22.  
  23. ns IN A 212.94.201.10
  24. mail IN A 212.94.201.10
  25. mail2 IN A 212.94.201.11
  26. www IN A 212.94.201.11
  27.  
  28. dns IN CNAME ns

CAUTION Syntax of a name

The syntax of machine names follows strict rules. For instance, machine implies machine.*domain*. If the domain name should not be appended to a name, said name must be written as machine. (with a dot as suffix). Indicating a DNS name outside the current domain therefore requires a syntax such as machine.otherdomain.com. (with the final dot).

例 10.14. Excerpt of /etc/bind/db.192.168

  1. ; Reverse zone for 192.168.0.0/16
  2. ; admin.falcot.com. => zone contact: admin@falcot.com
  3. $TTL 604800
  4. @ IN SOA ns.internal.falcot.com. admin.falcot.com. (
  5. 20040121 ; Serial
  6. 604800 ; Refresh
  7. 86400 ; Retry
  8. 2419200 ; Expire
  9. 604800 ) ; Negative Cache TTL
  10.  
  11. IN NS ns.internal.falcot.com.
  12.  
  13. ; 192.168.0.1 -> arrakis
  14. 1.0 IN PTR arrakis.internal.falcot.com.
  15. ; 192.168.0.2 -> neptune
  16. 2.0 IN PTR neptune.internal.falcot.com.
  17.  
  18. ; 192.168.3.1 -> pau
  19. 1.3 IN PTR pau.internal.falcot.com.