středa 12. října 2016

Unbound: resolvující DNS server s podporou DNSSEC

Unbound je snadno konfigurovatelný resolvující DNS server s dalšími funkcemi, jako je kešování záznamů, DNSSEC a záznamy ve vlastní zóně.

Konfigurace je standardně v
/etc/unbound/unbound.conf.

Síť

Ve výchozím stavu server naslouchá jen na localhostu. Aby byl server dostupný i pro další stanice v síti, je nutné přidat IP adresu nakonfigurovaného síťového rozhraní a nebo povolit naslouchání na všech adresách. Přidáme i IPv6 adresy pokud máme v síti.
interface: 0.0.0.0
interface: ::0


Není od věci zapnout IPv6 a také TCP na portu 53. Standardně je DNS samozřejmě na UDP 53 již povoleno.
do-ip4: yes
do-ip6: yes
do-udp: yes
do-tcp: yes


Server umí i klasické access listy. Pravděpodobně chceme, aby náš DNS server obsluhoval jen klienty v naší lokální síti a ne v celém internetu. Pro překlad "uvnitř" serveru povolíme IPv4/IPv6 loopback.
access-control: 10.0.0.0/24 allow
access-control: 2a00:..../64 allow
access-control: fe80::/64 allow
access-control: ::1 allow

DNSSEC

Podpora DNSSECu by měla být již zapnutá ve výchozím nastavení. Pokud tomu tak není, tak odkomentujeme, nebo přidáme tento řádek:
auto-trust-anchor-file: "/var/lib/unbound/root.key"

Soubor /var/lib/unbound/root.key vypadá nějak takto:
; autotrust trust anchor file
;;id: . 1
;;last_queried: 1476288795 ;;Wed Oct 12 18:13:15 2016
;;last_success: 1476288795 ;;Wed Oct 12 18:13:15 2016
;;next_probe_time: 1476292286 ;;Wed Oct 12 19:11:26 2016
;;query_failed: 0
;;query_interval: 3600
;;retry_time: 3600
.       172800  IN      DNSKEY  257 3 8 AwEAAagAIKlVZrpC6Ia7gEzahOR+9W29euxhJhVVLOyQbSEW0O8gcCjFFVQUTf6
v58fLjwBd0YI0EzrAcQqBGCzh/RStIoO8g0NfnfL2MTJRkxoXbfDaUeVPQuYEhg3
7NZWAJQ9VnMVDxP/VHL496M/QZxkjf5/Efucp2gaDX6RS6CXpoY68LsvPVjR0ZSwzz1apAzvN9dlzEheX7ICJBBtuA6G3LQp
zW5hOA2hzCTMjJPJ8LbqF6dsV6DoBQzgul0sGIcGOYl7OyQdXfZ57relSQageu+ip
AdTTJ25AsRTAoub8ONGcLmqrAmRLKBP1dfwhYB4N7knNnulqQxA+Uk1ihz0=

;{id = 19036 (ksk), size = 2048b} ;;state=2 [  VALID  ] ;;count=0 ;;lastchange=1476036425 ;;Sun Oct  9 20:07:05 2016  

Nejdůležitější je samozřejmě veřejný klíč (červeně), kterým je ověřen kořen DNS stromu. Pokud klíč nemáte, nebo nechcete ten to přišel s instalací Unboundu, lze jej získat jako jakýkoli jiný zónový záznam nástrojem dig.

Dotaz:
dig . dnskey +multiline

Odpověď:
;; Truncated, retrying in TCP mode.

; <<>> DiG 9.8.4-rpz2+rl005.12-P1 <<>> . dnskey +multiline
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 60959
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;.                      IN DNSKEY

;; ANSWER SECTION:
.                       172786 IN DNSKEY 256 3 8 ( AwEAAcCsATzyk1Hj1xabagAGWi9sZSbB+igdzDM8CMZ5                             fPcOb314yP9/lmvidoBuApPlMVwlz0lXaj6gzyjoOKBv                               eoDD0VyHTqjCDg9UrcDoClNZciR2sHZoaMZp2yVNFyaC                              +7MkA8lsrCShieYPEowSjQdkvY5ONlEib/ATXdmAhfgB

) ; key id = 46551
.                       172786 IN DNSKEY 256 3 8 (AwEAAYbinauHA9oUb4aGNtJIrepyGoYy0OL01rvIhvo                               RWN/Ch8p2C4ZEkpvUYkx74r9JpgrOsjKOv+JQdKtT2u8                              AxGjUoH8x8HdpDiMV7XnpWJo9wAxlFtDtbMnPwRQ3dWs                               T1p5myrGcm7EFJ9j7KmiAEG5hGsevZqcnqMOW9QFkmp/                               zM0TFYXYWq6AsAof2uZqLUyd+nHIW0TGsaHMzcTNfA8W                               w+OYV7R4bcR/8edCEo6OAh9j48R1hRtuO1e2MQdnkITc                              9DJljB4Cq1gQKwv/ku7mAvmFuWkRotMZIFN3vDhpmpmy                                7M0C1EHSRAgP+HkblLRQKOPnwI/VksJEU4fmnhk=

) ; key id = 39291
.                       172786 IN DNSKEY 257 3 8 (
AwEAAagAIKlVZrpC6Ia7gEzahOR+9W29euxhJhVVLOyQ                               bSEW0O8gcCjFFVQUTf6v58fLjwBd0YI0EzrAcQqBGCzh                              /RStIoO8g0NfnfL2MTJRkxoXbfDaUeVPQuYEhg37NZWA                        
 JQ9VnMVDxP/VHL496M/QZxkjf5/Efucp2gaDX6RS6CXp                            oY68LsvPVjR0ZSwzz1apAzvN9dlzEheX7ICJBBtuA6G3                              LQpzW5hOA2hzCTMjJPJ8LbqF6dsV6DoBQzgul0sGIcGO                               Yl7OyQdXfZ57relSQageu+ipAdTTJ25AsRTAoub8ONGc                              LmqrAmRLKBP1dfwhYB4N7knNnulqQxA+Uk1ihz0=

) ; key id = 19036

;; Query time: 21 msec
;; SERVER: ::1#53(::1)
;; WHEN: Wed Oct 12 18:28:41 2016
;; MSG SIZE  rcvd: 714

Funkčnost DNSSECu na našem serveru se ověří například opět digem.
Dotaz:
dig . +dnssec @localhost | grep ad

Odpověď:
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 0, AUTHORITY: 4, ADDITIONAL: 1

Příznak ad značí aktivní DNSSEC validaci.

root.hints

Unbound má standardně předkonfigurované některé kořenové DNS servery, resp. jejich IP adresy, takže funguje tzv. "out of box". Pokud chceme mít kontrolu nad IPv4 a IPv6 adresami root DNS serverů, je potřeba si stáhnout  jejich seznam z důvěryhodného zdroje. Například z InterNICu (spadá pod Verisign), což je provozovatel jednoho z root DNS serverů:
wget -S -N https://www.internic.net/domain/named.cache -O /etc/unbound/root.hints

A pak jen na tento soubor odkázat v konfiguraci Unboundu:
root-hints: "/etc/unbound/root.hints"

Statické záznamy a vlastní doména

Unbound sice není plnohodnotným autoritativním serverem, nicméně umožňuje definovat vlastní zónu, ve které si vytvoříme patřičné záznamy pro naši doménu.

Nejprve definujeme zónu (příklad pro doménu .home použitou pouze v lokální síti):
local-zone: "home." static

Definice A záznamu:
local-data: "pc1.home. IN A 10.0.0.1"

Podobně lze definovat další záznamy jako AAAA, MX, atd...
Reverzní, tzv. PTR záznam má syntaxi:
local-data-ptr: "10.0.0.1 pc1.home"

Zdroje

středa 6. července 2016

Podpora DNSSEC na rekurzivních DNS serverech O2

~ $ dig @194.228.41.65 +dnssec +multiline
; <<>> DiG 9.8.4-rpz2+rl005.12-P1 <<>> @194.228.41.65 +dnssec +multiline
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 55629
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 14, AUTHORITY: 0, ADDITIONAL: 5

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags: do; udp: 4000
;; QUESTION SECTION:
;.                      IN NS

;; ANSWER SECTION:
.                       171551 IN NS c.root-servers.net.
.                       171551 IN NS d.root-servers.net.
.                       171551 IN NS e.root-servers.net.
.                       171551 IN NS f.root-servers.net.
.                       171551 IN NS g.root-servers.net.
.                       171551 IN NS h.root-servers.net.
.                       171551 IN NS i.root-servers.net.
.                       171551 IN NS j.root-servers.net.
.                       171551 IN NS k.root-servers.net.
.                       171551 IN NS l.root-servers.net.
.                       171551 IN NS m.root-servers.net.
.                       171551 IN NS a.root-servers.net.
.                       171551 IN NS b.root-servers.net.
.                       171551 IN RRSIG NS 8 0 518400 20160716050000 (
                                20160706040000 46551 .
                                m/BhqRYcn0mgkx3NqtyFw/OJUiNyn7nvP6HcqxOZCZSc
                                RVFvPoWYDzL7kdJcOwNOqc1cWZR33fb89QWFLzmYDhr+
                                4NDcaLZjrapoT6hyvxv9SAWVFobKZP+cFlvdppa6jqaq
                                2Rwz/oOb4m58zAxdjJnqkCxWSALT2hyEjS/E7Kg= )

;; ADDITIONAL SECTION:
a.root-servers.net.     328157 IN A 198.41.0.4
a.root-servers.net.     389646 IN AAAA 2001:503:ba3e::2:30
b.root-servers.net.     601363 IN A 192.228.79.201
c.root-servers.net.     601327 IN A 192.33.4.12

;; Query time: 31 msec
;; SERVER: 194.228.41.65#53(194.228.41.65)
;; WHEN: Wed Jul  6 11:46:06 2016
;; MSG SIZE  rcvd: 473


~ $ dig @194.228.41.113 +dnssec +multiline
; <<>> DiG 9.8.4-rpz2+rl005.12-P1 <<>> @194.228.41.113 +dnssec +multiline
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 53280
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 14, AUTHORITY: 0, ADDITIONAL: 3

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags: do; udp: 4000
;; QUESTION SECTION:
;.                      IN NS

;; ANSWER SECTION:
.                       103405 IN NS g.root-servers.net.
.                       103405 IN NS h.root-servers.net.
.                       103405 IN NS i.root-servers.net.
.                       103405 IN NS j.root-servers.net.
.                       103405 IN NS k.root-servers.net.
.                       103405 IN NS l.root-servers.net.
.                       103405 IN NS m.root-servers.net.
.                       103405 IN NS a.root-servers.net.
.                       103405 IN NS b.root-servers.net.
.                       103405 IN NS c.root-servers.net.
.                       103405 IN NS d.root-servers.net.
.                       103405 IN NS e.root-servers.net.
.                       103405 IN NS f.root-servers.net.
.                       103405 IN RRSIG NS 8 0 518400 20160715050000 (
                                20160705040000 46551 .
                                ET+4fwEpkJP58IQCerr9SJAmwmvzyBpyR/MIBUHOrehe
                                5urx7fz/3KSwDqXYxxDnvr+UsEysOOq83h9J1f289R76
                                YQdMaM0hfIUfe4TSUxTqWwraWqAZVUsibTGhSbW+LKOx
                                pS2qOwRxrm1H3NlEaw2AlEm6vXuduAcl1QQHOds= )

;; ADDITIONAL SECTION:
a.root-servers.net.     499437 IN A 198.41.0.4
a.root-servers.net.     331875 IN AAAA 2001:503:ba3e::2:30

;; Query time: 28 msec
;; SERVER: 194.228.41.113#53(194.228.41.113)
;; WHEN: Wed Jul  6 11:46:23 2016
;; MSG SIZE  rcvd: 441


~ $ dig @160.218.161.54 +dnssec +multiline
; <<>> DiG 9.8.4-rpz2+rl005.12-P1 <<>> @160.218.161.54 +dnssec +multiline
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 28522
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 14, AUTHORITY: 0, ADDITIONAL: 3

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags: do; udp: 4000
;; QUESTION SECTION:
;.                      IN NS

;; ANSWER SECTION:
.                       169953 IN NS m.root-servers.net.
.                       169953 IN NS a.root-servers.net.
.                       169953 IN NS b.root-servers.net.
.                       169953 IN NS c.root-servers.net.
.                       169953 IN NS d.root-servers.net.
.                       169953 IN NS e.root-servers.net.
.                       169953 IN NS f.root-servers.net.
.                       169953 IN NS g.root-servers.net.
.                       169953 IN NS h.root-servers.net.
.                       169953 IN NS i.root-servers.net.
.                       169953 IN NS j.root-servers.net.
.                       169953 IN NS k.root-servers.net.
.                       169953 IN NS l.root-servers.net.
.                       169953 IN RRSIG NS 8 0 518400 20160716050000 (
                                20160706040000 46551 .
                                m/BhqRYcn0mgkx3NqtyFw/OJUiNyn7nvP6HcqxOZCZSc
                                RVFvPoWYDzL7kdJcOwNOqc1cWZR33fb89QWFLzmYDhr+
                                4NDcaLZjrapoT6hyvxv9SAWVFobKZP+cFlvdppa6jqaq
                                2Rwz/oOb4m58zAxdjJnqkCxWSALT2hyEjS/E7Kg= )

;; ADDITIONAL SECTION:
a.root-servers.net.     326557 IN A 198.41.0.4
a.root-servers.net.     556788 IN AAAA 2001:503:ba3e::2:30

;; Query time: 24 msec
;; SERVER: 160.218.161.54#53(160.218.161.54)
;; WHEN: Wed Jul  6 11:46:44 2016
;; MSG SIZE  rcvd: 441