Inhaltsverzeichnis

DNS mit Bind

Bind 10 ist da:

Er ist (im Gegensatz zu seinen Vorgängern) modular und benötigt eine Python-Installation.

Kurz-Info

> apt install ldnsutils && apt purge bind9-dnsutils knot-dnsutils
> apt autoremove
 
> drill -Q heise.de
193.99.144.80
 
> drill -Qx 193.99.144.80
redirector.heise.de.

Beispiele

# https://one.one.one.one/help
# IPv4: one.one.one.one -> 1.1.1.1
# IPv6: one.one.one.one -> 2606:4700:4700::1111
 
# ldnsutils
drill google.com any
drill -Q google.com any
drill -Q google.com a
drill -Q google.com aaaa
drill -Q @one.one.one.one google.com aaaa
 
# bind9-dnsutils
dig google.com any
dig +short google.com any
dig +short google.com a
dig +short google.com aaaa
dig +short @one.one.one.one google.com aaaa
 
# bind9-dnsutils
host -a google.com
host google.com
host -t a google.com
host -t aaaa google.com
host -t aaaa google.com one.one.one.one
 
# bind9-dnsutils
nslookup google.com
nslookup -type=a google.com
nslookup -type=aaaa google.com
nslookup -type=aaaa google.com one.one.one.one
 
# pwsh
Resolve-DnsName -Type ANY google.com
(Resolve-DnsName google.com).IPAddress
(Resolve-DnsName -Type A google.com).IPAddress
(Resolve-DnsName -Type AAAA google.com).IPAddress
(Resolve-DnsName -Type A_AAAA -Server one.one.one.one google.com).IPAddress

Sicherheit (DNS Records)

Best practices: https://www.m3aawg.org/sites/default/files/m3aawg_parked_domains_bp-2015-12.pdf

CAA (Certification Authority Authorization)

Nur von z.B. Let's Encrypt Zertifikate akzeptieren

example.com. 300 IN CAA 0 issue "letsencrypt.org"
example.com. 300 IN CAA 0 issuewild "letsencrypt.org"

Null MX (Mail Exchanger)

Wenn man keine E-Mails mit seinem Server versenden möchte. Priorität auf 0 setzen und Wert (Mail Server) auf .

example.com. MX 0 .
*.example.com. MX 0 .

DKIM (DomainKeys Identified Mail)

https://en.wikipedia.org/wiki/DMARC

Wenn man keine E-Mails mit seinem Server versenden möchte und vermeiden will, dass jemand die Domain missbraucht.

*._domainkey.example.com. IN TXT "v=DKIM1; p="

SPF (Domain-based Message Authentication, Reporting and Conformance)

https://en.wikipedia.org/wiki/Sender_Policy_Framework

Wenn es einen MX und A Record für die Domain gibt, zulassen, ansonsten softfail.

example.com. IN TXT "v=spf1 +mx +a ~all"

Wenn man keine E-Mails mit seinem Server versenden möchte und vermeiden will, dass jemand die Domain missbraucht.

example.com. IN TXT "v=spf1 -all"

DMARC (Domain-based Message Authentication, Reporting and Conformance)

https://en.wikipedia.org/wiki/DMARC

Anfordern, dass alle E-Mails, die DKIM oder SPF nicht erfüllen in Spam zugestellt werden. Außderm alle Reports an diese E-Mail senden.

_dmarc.example.com. IN TXT "v=DMARC1; p=quarantine; sp=quarantine; pct=100; adkim=r; aspf=r; fo=1; rua=mailto:security@example.com; ruf=mailto:security@example.com"

Wenn man keine E-Mails mit seinem Server versenden möchte und vermeiden will, dass jemand die Domain missbraucht.

_dmarc.example.com. IN TXT "v=DMARC1; p=reject; sp=reject; pct=100; adkim=s; aspf=s; fo=1"

Caching only DNS

Caching only DNS

DHCP-Server und DNS-Server mit automatischem Update (DDNS)

cd /etc/bind/

cat `dnssec-keygen -a HMAC-MD5 -b 265 -n host dhcpkey`.key | cut -d " " -f 7
pBbXhGpya0ouQBfDHZhx1S7TWJnuaYo1ULFwUDG7HpExHQ==

Forwarding DNS

Forwarding DNS

Abfragen

nslookup

einen Hostnamen in eine IP auflösen:

# nslookup www.heise.de

zur Auflösung eines Hostnamens einen bestimmten DNS-Server (localhost) befragen:

# nslookup www.heise.de localhost

dig

einen Hostnamen in eine IP auflösen:

# dig www.heise.de

zur Auflösung eines Hostnamens einen bestimmten DNS-Server (localhost) befragen:

# dig @localhost www.heise.de

Zone saugen

nslookup

# nslookup -q=axfr www.heise.de localhost

dig

# dig @localhost www.heise.de axfr

Konfiguration

Linux mit SystemD

> vi /etc/systemd/resolved.conf
[Resolve]
DNS=191.168.1.1
FallbackDNS=191.168.1.2

> systemctl restart systemd-resolved.service

caching-only-DNS

(getestet in FreeBSD 4.7 mit BIND 8)

Ein chashing-only-DNS ist ein Name-Server, der die Domainnamen nur für sich speichert. Das verringert (z.B.: bei Webservern) die Netzlast.

in der Datei "/etc/rc.conf" aktivieren:

named_enable="YES"              # Run named, the DNS server (or NO).
named_program="/usr/sbin/named" # path to named, if you want a different one.
named_flags="-u bind -g bind"   # Flags for named
# vi /etc/namedb/named.conf:

options {
        directory "/etc/namedb";
        pid-file "/var/run/named/pid";
        version "[Secured]";
        query-source address * port 53;
        auth-nxdomain no;
        allow-query {
                127.0.0.1;
                };             
        listen-on {
                127/8;
                };
};

logging {
        category lame-servers {null; };
};



zone "." {
        type hint;
        file "named.root";
};

zone "0.0.127.IN-ADDR.ARPA" {
        type master;
        file "localhost.rev";
};

DNS-Server

Die IP-Adresse des DNS-Server's ist 192.168.1.1 und er löst alle Namen für das Netz 192.168.1.0/24 auf.

named.conf

# vi named.conf
options {
        directory "/etc";
        pid-file "named.pid";

        listen-on       { 127.0.0.1; 192.168.2.1; };

        forwarders {
              192.168.1.100;
        };
};

zone "domain.de" {
        type master;
        file "domain.de.db";
        notify no;
};

zone "1.168.192.in-addr.arpa" {
        type master;
        file "192.168.1.rev";
        notify no;
};

zone "extern" {
        type master;
        file "extern.db";
        notify no;
        check-names ignore;
};

forward look-up

# vi domain.de.db
$TTL            3600
@               IN      SOA     ns.domain.de. root.ns.domain.de. (
                        2010051100 ; serial
                        3600       ; 1h  refresh
                        900        ; 15M retry
                        604800     ; 7d  expire
                        3600 )     ; 1h  minimum ttl

                        IN      NS      ns.domain.de.
install                 IN      A       192.168.1.1
ns                      CNAME           install
server                  CNAME           install
datenbank               IN      A       192.168.1.10
test                    IN      A       192.168.1.11
web                     IN      A       192.168.1.12

reverse look-up

# vi 192.168.1.rev
$TTL            3600
@               IN      SOA     ns.domain.de. root.ns.domain.de. (
                        2010051100 ; serial
                        3600       ; 1h  refresh
                        900        ; 15M retry
                        604800     ; 7d  expire
                        3600 )     ; 1h  minimum ttl

              IN      NS      ns.domain.de.
10            IN      PTR     datenbank.domain.de.
11            IN      PTR     test.domain.de.
12            IN      PTR     web.domain.de.

Abkürzungen per DNS

# vi extern.db
$TTL            3600
@               IN      SOA     ns.extern. root.ns.extern. (
                        2010051100 ; serial
                        3600       ; 1h  refresh
                        900        ; 15M retry
                        604800     ; 7d  expire
                        3600 )     ; 1h  minimum ttl

              IN      NS      ns.extern.
zuhause       IN      PTR     92.93.94.95
arbeit        IN      PTR     96.97.98.99
homepage      IN      PTR     100.101.102.103
kumpel        IN      PTR     104.105.106.107

Client

/etc/resolv.conf

# vi /etc/resolv.conf
search domain.de extern
nameserver 192.168.1.1

Slave

Vorbereitungen auf dem Master

Damit der zukünftige DNS-Slave dazu berechtigt ist, einen kompletten Zonen-Transfer durchzuführen, muss dies zunächst noch auf dem Master der DNS Zone erlaubt werden:

Per "allow-transfer" erlaubt man definierten Systemen den Zonen-Transfer aller auf diesem DNS-Server konfigurierten Zonen. Soll dieses nur auf Basis einer Zone erfolgen, so muss dies explitzit bei den Einstellungen der jeweiligen Zone erfolgen. Normalerweise sind Slaves durch NS Resource Records in den Zonendateien aufgelistet. Mit der Option also-notify können weitere Slaves definiert werden, die bei Änderungen per Notify benachrichtigt werden. Da derartige Slaves nicht in den Zonendateien aufgeführt sind, werden sie auch als Stealth Server - also "verborgene Server" - bezeichnet. Falls eine zonenspezifische also-notify-Option vorhanden ist, so überschreibt diese die globale.

# vi /etc/bind/named.conf.options
options {
      directory "/var/cache/bind";

      // If there is a firewall between you and nameservers you want
      // to talk to, you may need to fix the firewall to allow multiple
      // ports to talk.  See http://www.kb.cert.org/vuls/id/800113

      // If your ISP provided one or more IP addresses for stable
      // nameservers, you probably want to use them as forwarders.
      // Uncomment the following block, and insert the addresses replacing
      // the all-0's placeholder.

      forwarders {
              10.10.2.10;
       };

      allow-query { any; };
      allow-transfer { 10.30.1.101; 10.30.1.102; 10.30.1.243; 10.30.1.244; };
      notify yes;
      also-notify { 10.30.1.101; 10.30.1.102; 10.30.1.243; 10.30.1.244; };


      auth-nxdomain no;    # conform to RFC1035
      listen-on-v6 { any; };
};

Bind

# aptitude install bind9
# scp root@dnsmaster:/etc/bind/named.conf /etc/bind/
# sed -i 's#master#slave#g' /etc/bind/named.conf.local
# vi /etc/bind/named.conf.local

alle Zeilen um einen Master-Eintrag ergänzen…

vorher:

zone "30.10.in-addr.arpa" { type slave; file "/etc/bind/domain.rev.db"; };

nachher:

zone "30.10.in-addr.arpa" { type slave; file "/etc/bind/domain.rev.db"; masters { 10.30.1.1;}; };

In dem Pfad "/etc/bind/" erlaubt AppAmor keinen Schreibzugriffe, statt dessen soll der Pfad "/var/lib/bind/" verwendet werden. Deshalb verlegen wir die Dateien in das erlaubte Verzeichnis und ändern natürlich auch die Pfade in der Datei "/etc/bind/named.conf.local" entsprechend…

vorher:

zone "30.10.in-addr.arpa" { type slave; file "/etc/bind/domain.rev.db"; masters { 10.30.1.1;}; };

nachher:

zone "30.10.in-addr.arpa" { type slave; file "/var/lib/bind/domain.rev.db"; masters { 10.30.1.1;}; };

hier müssen die DNS-Master als allow-notify konfiguriert werden:

# vi /etc/bind/named.conf.options
options {
      directory "/var/cache/bind";
      forwarders {
              10.30.1.1;
       };
      allow-notify { 10.30.1.81; 10.30.1.82; };
      auth-nxdomain no;    # conform to RFC1035
      listen-on-v6 { any; };
};

Jetzt muss der NameD nur noch neu gestartet werden. Und dann sollten die Dateien auch dort erscheinen:

# ls -l /var/lib/bind/

DHCP

Damit der "neue" zweite DNS auch per DHCP mit verteilt wird, ist noch eine kleine Änderung nötig:

# vi /etc/dhcpd.conf
...
option domain-name-servers 10.30.1.1,  10.30.1.2;
...

Und jetzt noch den DHCPD neu starten und alles wird gut… ;-)

SystemD (ab Ubuntu 18.04)

wenn in dieser Datei der lokale Rechner als DNS-Server drin steht:

> vi /etc/resolv.conf
nameserver 127.0.0.53
> vi /etc/systemd/resolved.conf
DNS=10.20.30.11 10.20.30.12 10.20.30.13
Domains=domain.net domain.de domain.com

…dann übernimmt SystemD die Aufgabe, so kann man den "echten" NameServer sehen (DNS Servers:):

> systemd-resolve --status

Ubuntu 22.04:

> /bin/networkctl status
●          State: routable                         
    Online state: online                           
         Address: 10.10.10.2 on ens3
                  fe81::f817:3efa:fedc:6728 on ens3
         Gateway: 10.10.10.1 on ens3
             DNS: 10.10.10.100
  Search Domains: domain.net

Cloudflare

IPv4:

DNS: 1.1.1.1

IPv6:

> dig @1.1.1.1 one.one.one.one aaaa
...
;; ANSWER SECTION:
one.one.one.one.        82      IN      AAAA    2606:4700:4700::1001
one.one.one.one.        82      IN      AAAA    2606:4700:4700::1111
...

also:

DNS: 2606:4700:4700::1001
DNS: 2606:4700:4700::1111