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)
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
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
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
