FreeBSD 9: Unbound als validating, recursive und caching DNS Resolver

Nach 3 Jahren trenne ich mich nun vom altbewährten BIND als DNS Caching Daemon.

Unbound hat jetzt ebenso Einzug in die Base (World) von FreeBSD 10 erhalten.
Er zeichnet sich durch schlanken, sauberen Code aus und sein Fokus liegt unter anderem auf:
– RFC Compliance
– High performance
– Robustness
– Highly portable

Die Installation unter FreeBSD 9 erfolgt direkt über die Ports.

FreeBSD Beastie Unbound Installation

Punkt 1: (optional) wget installieren

$
cd /usr/ports/ftp/wget/ && make install clean
$

Punkt 2: OpenSSL aus den Ports bauen (für ECDSA/GOST)

$
cd /usr/ports/security/openssl/

make config-recursive
make fetch-recursive
make
make test
make install
make clean
$

Hinweis: bei SPARC64 muss optimized Assembler code abgewählt werden sonst folgt ein __sparc_utrap: fatal illegal instruction

$
┌───────────────────────────── openssl-1.0.1_9 ────────────────────────────────┐
│ ┌──────────────────────────────────────────────────────────────────────────┐ │  
│ │+[x] SHARED   build of shared libs                                        │ │  
│ │+[x] THREADS  Threading support                                           │ │  
│ │+[ ] I386     Optimize for i386 (instead of i486+)                        │ │  
│ │+[x] SSE2     runtime SSE2 detection                                      │ │  
│ │+[ ] ASM      optimized Assembler code                                    │ │  
│ │+[ ] PADLOCK  VIA Padlock support                                         │ │  
│ │+[x] ZLIB     zlib compression support                                    │ │  
│ │+[x] SCTP     SCTP protocol support                                       │ │  
│ │+[x] MD2      MD2 hash (obsolete)                                         │ │  
│ │+[ ] RC5      RC5 cipher (patented)                                       │ │  
│ │+[x] RFC3779  RFC3779 support                                             │ │  
│ │+[ ] GMP      gmp support (LGPLv3)                                        │ │  
│ └──────────────────────────────────────────────────────────────────────────┘ │  
├──────────────────────────────────────────────────────────────────────────────┤  
│                       <  OK  >            <Cancel>                           │  
└──────────────────────────────────────────────────────────────────────────────┘
$

Punkt 3: OpenSSL Config kopieren und Version testen

$
cp /usr/local/openssl/openssl.cnf.sample /usr/local/openssl/openssl.cnf

/usr/local/bin/openssl version
$

Punkt 4: OpenSSL aus den Ports generell zum bauen von neuen Packages verknüpfen

$
echo 'WITH_OPENSSL_PORT=YES' >> /etc/make.conf
echo 'WITHOUT_X11=YES' >> /etc/make.conf
$

Punkt 5: LDNS bauen

$
cd /usr/ports/dns/ldns/ && make install clean
$
$
┌────────────────────────────── ldns-1.6.16_4 ─────────────────────────────────┐
│ ┌──────────────────────────────────────────────────────────────────────────┐ │  
│ │+[ ] DOXYGEN   Build documentation with Doxygen                           │ │  
│ │+[x] DRILL     With drill program                                         │ │  
│ │+[x] EXAMPLES  Build and/or install examples                              │ │  
│ │+[x] GOST      GOST signatures enabled, requires openssl >= 1.0.0         │ │  
│ └──────────────────────────────────────────────────────────────────────────┘ │  
├──────────────────────────────────────────────────────────────────────────────┤  
│                       <  OK  >            <Cancel>                           │  
└──────────────────────────────────────────────────────────────────────────────┘  
$

Hinweis: Die Dependencies müssen jetzt auf openssl>=1.0 zeigen, z.B.

$
===>   ldns-1.6.16_4 depends on package: openssl>=1.0 - found
===>   ldns-1.6.16_4 depends on file: /usr/local/lib/libcrypto.so.8 - found
$

Punkt 6: Unbound bauen (mit libevent2)

$
cd /usr/ports/dns/unbound/ && make install clean
$
$
┌───────────────────────────── unbound-1.4.21_1 ───────────────────────────────┐
│ ┌──────────────────────────────────────────────────────────────────────────┐ │  
│ │+[x] ECDSA       Enable ECDSA (elliptic curve) support (OpenSSL >= 1.0)   │ │  
│ │+[x] GOST        Enable GOST support (requires OpenSSL >= 1.0)            │ │  
│ │+[ ] MUNIN       Install Munin plugin                                     │ │  
│ │+[ ] PYTHON      Python bindings or support                               │ │  
│ │+[x] THREADS     Threading support                                        │ │  
│ │──────────── Enable whenever using many (10000) outgoing ports ───────────│ │  
│ │+( ) LIBEVENT14  Build against libevent-1.4 (devel/libevent)              │ │  
│ │+(*) LIBEVENT20  Build against libevent-2.0 (devel/libevent2)             │ │  
│ └──────────────────────────────────────────────────────────────────────────┘ │  
├──────────────────────────────────────────────────────────────────────────────┤  
│                       <  OK  >            <Cancel>                           │  
└──────────────────────────────────────────────────────────────────────────────┘ 
$

Punkt 7: Configs vorbereiten

$
vi /etc/rc.conf

unbound_enable="YES"
$
$
cp /usr/local/etc/unbound/unbound.conf.sample /usr/local/etc/unbound/unbound.conf
$

Punkt 8: aktuelle root.hints erstellen

$
/usr/local/etc/unbound

wget ftp://FTP.INTERNIC.NET/domain/named.cache
$

Punkt 9: aktuelle auto-trust-anchor-file (DNSSEC) erstellen

$
echo '. IN DS 19036 8 2 49AAC11D7B6F6446702E54A1607371607A1A41855200FD2CE1CDDE32F24E8FB5' > /usr/local/etc/unbound/root.key
$

Quelle: IANA.org root-anchors

Punkt 10: Permissions setzen

$
sudo chown -R unbound:unbound /usr/local/etc/unbound
$

Punkt 11: Unbound Config mit Optimierungen

$
vi /usr/local/etc/unbound/unbound.conf
$
$
### ### ### PLITC ### ### ###
#
server:
### < --- server // --- > ###
verbosity: 2

# interface: 192.0.2.153
# interface: 192.0.2.154
# interface: 192.0.2.154@5003
# interface: 2001:DB8::5

# outgoing-interface: 192.0.2.153
# outgoing-interface: 192.0.2.154
# outgoing-interface: 192.0.2.154@5003
# outgoing-interface: 2001:DB8::5

access-control: 0.0.0.0/0 allow
access-control: ::/0 allow

outgoing-port-permit: 1025-65535
outgoing-port-avoid: 0-1024

harden-large-queries: "yes"
harden-short-bufsize: "yes"

statistics-interval: 60

logfile: "/usr/local/etc/unbound/unbound.log"

root-hints: "/usr/local/etc/unbound/named.cache"
auto-trust-anchor-file: "/usr/local/etc/unbound/root.key"

port: 53

do-ip4: yes
do-ip6: yes
do-udp: yes
do-tcp: yes

hide-identity: yes
hide-version: yes
harden-glue: yes
harden-dnssec-stripped: yes

use-caps-for-id: yes

cache-min-ttl: 3600
cache-max-ttl: 86400

prefetch: yes
num-threads: 2

max-udp-size: 512
edns-buffer-size: 512

# with libevent2
outgoing-range: 8192
num-queries-per-thread: 4096

msg-cache-slabs: 8
rrset-cache-slabs: 8
infra-cache-slabs: 8
key-cache-slabs: 8

rrset-cache-size: 256m
msg-cache-size: 128m

so-rcvbuf: 1m

unwanted-reply-threshold: 10000
val-clean-additional: yes
### < --- // server --- > ###
python:

remote-control:

# forward-zone:
# name: "."
# forward-addr: 213.73.91.35  # dnscache.berlin.ccc.de
# forward-addr: 74.82.42.42   # Hurricane Electric
# forward-addr: 4.2.2.4       # Level3 Verizon
#
### ### ### PLITC ### ### ###
# EOF
$

Punkt 12: Config testen und Daemon starten

$
unbound-checkconf

service unbound start
$

Hinweis: GRC | DNS Nameserver Spoofability Test – die Source Port Bit Predictability muss noch verbessert werden!

Quelle: Web-based DNS Randomness Test

Quelle: Google – Public DNS – Security Benefits

Hinweis: bei einer aggressiven Verwendung der outgoing-range muss die kern.maxfiles erhöht werden

$
outgoing-range: 32768
num-queries-per-thread: 16384
$
$
vi /boot/loader.conf

kern.maxfiles="512000"
$

That’s FreeBSD

Ein Gedanke zu „FreeBSD 9: Unbound als validating, recursive und caching DNS Resolver

Schreibe einen Kommentar