DNS

Co se stane, když se zeptáte na domenové jméno (DN)?

Pěkný popis s obrázky najdete na stránkách Dana Kaminského, včetně chyb, které objevil.

  1. Požadavek na DN obdrží Váš resolver(3).
    nameserver 2a02:4::dead:beef
    nameserver 195.113.257.14
    search kgb.edu
    
  2. Váš resolver se zeptá svých zdrojů, řekněme rekurzivní cache.

    Někteří uživatelé mají na svém notebooku spuštěný svůj rekurzivní server (PowerDNS?), čert ví proč.

  3. DNS server se
    • podívá do cache (je-li zapnutá)
    • přepošle dotaz někam jinam (je-li to jen forwarder)
    • nebo začne dotaz rekurzivně vyřizovat sám
  4. Jakmile ví server výsledek, pošle jej zpět klientovi (rekurzivnímu serveru, který si jej může uložit).

dig(1) - DNS lookup utility

Vyzkoušejte si práci s dig(1); nezapomeňte, že existuje i zkompilovaný pro Windows.

# emerge -Kav bind-tools
# yum install bind-utils
$ dig nix.cz
$ dig -t aaaa nix.cz @8.8.8.8
$ dig -t any staff.cesnet.cz 
$ dig -x 8.8.8.8
$ dig +short ausfahrt.de
$ dig +trace +recurse www.ms.mff.cuni.cz 
$ dig -c ch -t txt version.bind.
$ dig -c ch -t txt id.server.

$ export NEXT=storkhole.cz
$ while true; do NEXT=$(dig +short -t nsec $NEXT | cut -d" " -f1); echo $NEXT; done 

$ dig -t axfr mff.cuni.cz @ns.ms.mff.cuni.cz. 
$ dig -t ixfr=NUM mff.cuni.cz @ns.ms.mff.cuni.cz. 
$ dig +nssearch mff.cuni.cz

Jak to vypadá na straně DNS klienta?

Flagy v DNS paketech

RFC 1035: DOMAIN NAMES - IMPLEMENTATION AND SPECIFICATION
                                    1  1  1  1  1  1
      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    |                      ID                       |
    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    |QR|   Opcode  |AA|TC|RD|RA|   Z    |   RCODE   |
    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    |                    QDCOUNT                    |
    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    |                    ANCOUNT                    |
    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    |                    NSCOUNT                    |
    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    |                    ARCOUNT                    |
    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
ID
A 16 bit identifier assigned by the program that generates any kind of query. This identifier is copied the corresponding reply and can be used by the requester to match up replies to outstanding queries.
QR
A one bit field that specifies whether this message is a query (0), or a response (1).
OPCODE
Typicky = 0 (standard query), 4 (NOTIFY, RFC 1996) nebo 5 (Update, RFC 2136)
AA - Authoritative Answer
This bit is valid in responses, and specifies that the responding name server is an authority for the domain name in question section.

Note that the contents of the answer section may have multiple owner names because of aliases. The AA bit corresponds to the name which matches the query name, or the first owner name in the answer section.

TC - TrunCation
Specifies that this message was truncated due to length greater than that permitted on the transmission channel.
;; Truncated, retrying in TCP mode.
RD - Recursion Desired
This bit may be set in a query and is copied into the response. If RD is set, it directs the name server to pursue the query recursively. Recursive query support is optional.
RA - Recursion Available
This be is set or cleared in a response, and denotes whether recursive query support is available in the name server.
Z
Reserved for future use. Must be zero in all queries and responses.
RCODE - Response code (RFC 2929, sekce 2.3)
0, NoErrorNo error condition
1, FormErrFormat error - The name server was unable to interpret the query.
2, ServFailServer failure - The name server was unable to process this query due to a problem with the name server.
3, NXDomainName Error - Meaningful only for responses from an authoritative name server, this code signifies that the domain name referenced in the query does not exist.
4, NotImpNot Implemented - The name server does not support the requested kind of query.
5, RefusedRefused - The name server refuses to perform the specified operation for policy reasons. For example, a name server may not wish to provide the information to the particular requester, or a name server may not wish to perform a particular operation (e.g., zone transfer) for particular data.
RFC 2136Dynamic DNS Updates
6, YXDomainName Exists when it should not
7, YXRRSetRR Set Exists when it should not
8, NXRRSetRR Set that should exist does not
9, NotAuthServer Not Authoritative for zone
10, NotZoneName not contained in zone

Možné problémy

Jaký DNS server?

Spojit rekurzivní a autoritativní část do jednoho programu je lákavé, ale implementace se typicky dost liší. DNS není jen o tom rozparsovat paket a sesmolit odpověď!

NSD

Napsat autoritativní server je výrazně jednodušší než napsar rekurzor. Autoritativní servery musejí být výrazně odolnější (DNS amplification), protože (by definition) musejí být dostupné celému světu.
Není dobré rate-limitovat hloupě.

unbound

Rekurzivní servery musejí mít konektivitu s rychlou odezvou do všech částí sítě. Doporučuje se jich mít více, geograficky oddělených a na různém software.
If DNS doesn't work, pretty much nothing else does.

Alternativní DNS servery

BIND

djbdns

PowerDNS

dnsmasq

Knot DNS

Pro vlastence a experimentátory (a příznivce GPLv3).

Dokumentace

unbound: konfigurace

BIND jako rekurzivní server

# emerge -av bind 
# yum install bind-chroot
# less /etc/sysconfig/named
acl moji-klienti { ... };
options {
	recursion yes;
	allow-recursion { moji-klienti; };
};
zone "." {
	type hint;
	file "etc/root.hint";
};
options {
	forward only;
	forwarders { ip1; ip2; ip3; };
};

zone "doména.swi" {
	type forward;
	forwarders { 192.0.2.1; };
};
zone "2.0.192.in-addr.arpa" {
	type forward;
	forwarders { 192.0.2.1; };
};

NSD

nsd.conf(5)
server:
	ip-address: 192.0.2.259

zone:
	name: "moje.zona.cz"
	zonefile: "soubor.s.moji.zonou"	# /var/nsd/zones/
	# podle toho, co chci za funkcionalitu (master/slave)
	# notify/allow-notify/request-xfr/provide-xfr/
# nsd-control start
# nsd-control stop
# nsd-control reload 
# nsd-control write doména.swi
# nsd-control notify doména.swi
Zkusme si nastavit autoritativní server + AXFR a notify na záložní (slave)

nsd-control(8) - vzdálené ovládání a sledování běhu (nastavení v sekci SET UP)

BIND: konfigurace

BIND: named.conf(5)

caveats

BIND: zóny

zone "zakaznik1.org." IN {
        type master;
        file "master/zakaznik1/zakaznik1.org";
};

zone "zakaznik1.stara.domena." IN {
	type slave;
	file "slave/zakaznik1/zakaznik1.stara.domena";
	masters { 172.16.42.304; 2.20.22.202; };
};

zone "2.0.192.in-addr.arpa." IN {
        type master;
        file "master/rev.192.0.2";
};

zone "f.e.e.b.d.a.e.d.0.0.a.2.IP6.ARPA." IN {
        type master;
        file "master/rev.2a00.dead.beef";
};

BIND: /master/*, /slave/*: soubory se zonami

/var/bind/{pri,sec}
$ORIGIN pelikan.swi.
$TTL 1h

@	IN	SOA	dns-hlavni.pelikan.swi.	martin.pelikan.swi. (
	2011110301	; seriové číslo
	1h		; jak často musí slave provádět refresh (máme NOTIFY)
	10m		; jak dlouho musí slave počkat před update retry
	3w		; expirace autoritativity odpovědí ze slave
	1h		; jak dlouho budou ostatní resolvery cachovat NXdomain (RFC 2308)
);

@	IN	NS	dns-hlavni
@	IN	NS	dns-zalozni
dns-hlavni	IN	A 172.16.259.13
dns-zalozni	IN	A 192.168.259.13

(zbytek zóny)
manuál k zónovým souborům u BIND

Jak se to ovládá?

# named-checkconf -t /var/named/
# nsd-checkconf /etc/nsd.conf
# unbound-checkconf
# named-checkzone <název zóny> <soubor se zónou>

# rndc reload
# nsd-control reload

Delegace PTR mimo hranice bajtů

$ORIGIN 2.0.192.IN-ADDR.ARPA.

; rekneme, ze chceme oddelegovat 192.0.2.128/25:
128/25	IN	NS	nas.name.server.

129	IN	CNAME	129.128/25
130	IN	CNAME	130.128/25
...
255	IN	CNAME	255.128/25
a potom už jen nastavíme novou zónu někde jinde:
$ORIGIN 128/25.2.0.192.IN-ADDR.ARPA.
(soa, ns)

129	IN	PTR	muj-server1.moje.domena.
130	IN	PTR	muj-server2.moje.domena.
...

Zónové transfery

DNSSEC ve zkratce

#!/bin/sh

KEYGEN=/usr/sbin/dnssec-keygen
SIGNER=/usr/sbin/dnssec-signzone

/bin/rm -f "K$1"*
echo -e "g/generated-[ZK]SK\$/d\nw\nq\n" | /bin/ed -s $1

# !!! /dev/random tady z nakyho duvodu nefunguje ani po hodne I/O operacich

ZSK=`${KEYGEN} -a RSASHA1 -b 1280 -n ZONE -r /dev/urandom $1`
KSK=`${KEYGEN} -a RSASHA1 -b 2048 -n ZONE -r /dev/urandom -f KSK $1`

echo "\$include ${ZSK}.key ; generated-ZSK" >> $1
echo "\$include ${KSK}.key ; generated-KSK" >> $1

${SIGNER} -o $1 -k ${KSK}	$1	${ZSK}.key

/usr/bin/scp "keyset-$1"* server1:~/
/usr/bin/scp "keyset-$1"* server2:~/
(v praxi má jeden KSK delší platnost)
Prezentace jako prehled ruznych technologii

co se neveslo

sleuth
https://www.dns-oarc.net/tools/dsc
common errors rfc1912 (jen 14 stranek, to zvladnete! :-))
cache snooping - odpovidat na no-RD pakety zaznama z cache, nebo ne?
IDN -- vizte peterku
dnscurve