====== DNS mit Bind ====== Bind 10 ist da: * [[http://www.pro-linux.de/news/1/print/19512/bind-10-in-version-100-freigegeben.html]] * [[http://bind10.isc.org/wiki]] 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) ===== * [[https://wiki.ubuntuusers.de/Archiv/DDNS]] * [[https://www.foteviken.de/?p=1787]] * [[http://www.online-tutorials.net/internet-netzwerk/dynamische-dns-updates-mit-dhcp/tutorials-t-29-307.html]] 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