All you have to do is run this as root:
apt-get install unbound
Things to make it work
Step 1 · root hints:
This is the file which contains the listing of primary root DNS servers. Unbound has a listing of root DNS servers in its code, but we want to make sure we have the latest copy. Unbound normally updates their copy once every six months.
Download a copy of the root hints from Internic and place it in the
/etc/unbound/root.hintsfile. This file will be called by the
root-hints:directive in the
unbound.conffile, so make sure the path is correct in your configuration-file as well. To download the latest copy of root hints from Internic run this as root:
wget ftp://FTP.INTERNIC.NET/domain/named.cache -O /etc/unbound/root.hints
- Step 2 · auto-trust-anchor-file:
This file contains the key for the root server so DNSSEC can be validated. We need to tell Unbound that we trust the root server so it can create a chain of trust down to the hostname we want resolved and validated using DNSSEC.
To do this, we will create a file called
/etc/unbound/root.key and put a bit of code in it. This is the trust anchor for the root zone. You can manually verify the root zone anchor here if you want to.
Put the following trust anchor code into
. IN DS 19036 8 2 49AAC11D7B6F6446702E54A1607371607A1A41855200FD2CE1CDDE32F24E8FB5
Also make sure that
/etc/unbound/root.key is owned by the user the Unbound daemon is running as. This is usually
chown unbound:unbound /etc/unbound/root.key
- Step 3 · locally served zones
These are the hostnames and IPs of the local LAN you want Unbound to be authoritative for. Scroll through the
unbound.confand look for the
local-data-ptrdirectives. You just need to change these to match the names of the machines and IP addresses of your network.
In the example we have the hostname
firewall.home.lan resolving to the ip address
10.0.0.1. We also have a reverse lookup allowing
10.0.0.1 to resolve back to the hostname
firewall.home.lan. There are others as well, so that you can get a good idea of the format.
The pre-setup is done. We now have a root DNS hints file of the primary root servers. We also have a trust anchor file of the root server so Unbound can create a chain of trust for DNSSEC. In the future as the root DNS key changes Unbound will automatically update the
root.key file for us. Lastly, we have a few hostnames and IPs of LAN machines we want to authoritatively resolve.
Use the following configuration file, and modify it to fit your needs. The important parts to change are local domain(s), local IP-address(es), local IP-range(s) and local hostname(s).
## Authoritative, validating, recursive caching DNS ## unbound.conf # server: # log verbosity verbosity: 1 # specify the interfaces to answer queries from by IP-address. The default # is to listen to localhost (127.0.0.1 and ::1). specify 0.0.0.0 and ::0 to # bind to all available interfaces. specify every interface[@port] on a new # 'interface:' labeled line. The listen interfaces are not changed on # reload, only on restart. Change this to your local IP-address, # or else it simply won't work. interface: 127.0.0.1 # port to answer queries from port: 53 # Enable IPv4, "yes" or "no". do-ip4: yes # Enable IPv6, "yes" or "no". do-ip6: no # Enable UDP, "yes" or "no". do-udp: yes # Enable TCP, "yes" or "no". If TCP is not needed, Unbound is actually # quicker to resolve as the functions related to TCP checks are not done.i # NOTE: you may need tcp enabled to get the DNSSEC results from *.edu domains # due to their size. do-tcp: yes # control which client ips are allowed to make (recursive) queries to this # server. Specify classless netblocks with /size and action. By default # everything is refused, except for localhost, so in this case # we're making it open for the network. This is totally fine in a # home network as long as you don't open the port in your firewall # for WAN-connections. Choose deny (drop message), # refuse (polite error reply), allow (recursive ok), allow_snoop (recursive # and nonrecursive ok) access-control: 0.0.0.0/0 allow # Read the root hints from this file. Default is nothing, using built in # hints for the IN class. The file has the format of zone files, with root # nameserver names and addresses only. The default may become outdated, # when servers change, therefore it is good practice to use a root-hints # file. get one from ftp://FTP.INTERNIC.NET/domain/named.cache root-hints: "/etc/unbound/root.hints" # enable to not answer id.server and hostname.bind queries. hide-identity: yes # enable to not answer version.server and version.bind queries. hide-version: yes # Will trust glue only if it is within the servers authority. # Harden against out of zone rrsets, to avoid spoofing attempts. # Hardening queries multiple name servers for the same data to make # spoofing significantly harder and does not mandate dnssec. harden-glue: yes # Require DNSSEC data for trust-anchored zones, if such data is absent, the # zone becomes bogus. Harden against receiving dnssec-stripped data. If you # turn it off, failing to validate dnskey data for a trustanchor will trigger # insecure mode for that zone (like without a trustanchor). Default on, # which insists on dnssec data for trust-anchored zones. harden-dnssec-stripped: yes # Use 0x20-encoded random bits in the query to foil spoof attempts. # http://tools.ietf.org/html/draft-vixie-dnsext-dns0x20-00 # While upper and lower case letters are allowed in domain names, no significance # is attached to the case. That is, two names with the same spelling but # different case are to be treated as if identical. This means example.com is the # same as ExAmPlE.cOm which is the same as EXAMPLE.COM. use-caps-for-id: yes # the time to live (TTL) value lower bound, in seconds. Default 0. # If more than an hour could easily give trouble due to stale data. cache-min-ttl: 3600 # the time to live (TTL) value cap for RRsets and messages in the # cache. Items are not cached for longer. In seconds. cache-max-ttl: 86400 # perform prefetching of close to expired message cache entries. If a client # requests the dns lookup and the TTL of the cached hostname is going to # expire in less than 10% of its TTL, unbound will (1st) return the ip of the # host to the client and (2nd) pre-fetch the dns request from the remote dns # server. This method has been shown to increase the amount of cached hits by # local clients by 10% on average. prefetch: yes # number of threads to create. 1 disables threading. This should equal the number # of CPU cores in the machine. Our example machine has 4 CPU cores. num-threads: 4 ## Unbound Optimization and Speed Tweaks ### # the number of slabs to use for cache and must be a power of 2 times the # number of num-threads set above. more slabs reduce lock contention, but # fragment memory usage. msg-cache-slabs: 8 rrset-cache-slabs: 8 infra-cache-slabs: 8 key-cache-slabs: 8 # Increase the memory size of the cache. Use roughly twice as much rrset cache # memory as you use msg cache memory. Due to malloc overhead, the total memory # usage is likely to rise to double (or 2.5x) the total cache memory. The test # box has 4gig of ram so 256meg for rrset allows a lot of room for cached objects. rrset-cache-size: 256m msg-cache-size: 128m # buffer size for UDP port 53 incoming (SO_RCVBUF socket option). This sets # the kernel buffer larger so that no messages are lost in spikes in the traffic. so-rcvbuf: 1m ## Unbound Optimization and Speed Tweaks ### # Enforce privacy of these addresses. Strips them away from answers. It may # cause DNSSEC validation to additionally mark it as bogus. Protects against # 'DNS Rebinding' (uses browser as network proxy). Only 'private-domain' and # 'local-data' names are allowed to have these private addresses. No default. private-address: 192.168.0.0/16 private-address: 172.16.0.0/12 private-address: 10.0.0.0/8 # Allow the domain (and its subdomains) to contain private addresses. # local-data statements are allowed to contain private addresses too. private-domain: "home.lan" # If nonzero, unwanted replies are not only reported in statistics, but also # a running total is kept per thread. If it reaches the threshold, a warning # is printed and a defensive action is taken, the cache is cleared to flush # potential poison out of it. A suggested value is 10000000, the default is # 0 (turned off). We think 10K is a good value. unwanted-reply-threshold: 10000 # IMPORTANT FOR TESTING: If you are testing and setup NSD or BIND on # localhost you will want to allow the resolver to send queries to localhost. # Make sure to set do-not-query-localhost: yes . If yes, the above default # do-not-query-address entries are present. if no, localhost can be queried # (for testing and debugging). do-not-query-localhost: no # File with trusted keys, kept up to date using RFC5011 probes, initial file # like trust-anchor-file, then it stores metadata. Use several entries, one # per domain name, to track multiple zones. If you use forward-zone below to # query the Google DNS servers you MUST comment out this option or all DNS # queries will fail. # auto-trust-anchor-file: "/var/unbound/etc/root.key" # Should additional section of secure message also be kept clean of unsecure # data. Useful to shield the users of this validator from potential bogus # data in the additional section. All unsigned data in the additional section # is removed from secure messages. val-clean-additional: yes # Blocking Ad Server domains using NXDOMAIN for faster blocking. # Google's AdSense, DoubleClick and Yahoo # account for a 70 percent share of all advertising traffic. Block them. local-zone: "doubleclick.net" static local-zone: "googlesyndication.com" static local-zone: "googleadservices.com" static local-zone: "google-analytics.com" static local-zone: "ads.youtube.com" static local-zone: "adserver.yahoo.com" static local-zone: "ask.com" static # Unbound will not load if you specify the same local-zone and local-data # servers in the main configuration as well as in this "include:" file. We # suggest commenting out any of the local-zone and local-data lines above if # you suspect they could be included in the unbound_ad_servers servers file. #include: "/usr/local/etc/unbound/unbound_ad_servers" # locally served zones can be configured for the machines on the LAN. local-zone: "home.lan." static local-data: "firewall.home.lan. IN A 10.0.0.1" local-data: "laptop.home.lan. IN A 10.0.0.2" local-data: "xboxone.home.lan. IN A 10.0.0.3" local-data: "ps4.home.lan. IN A 10.0.0.4" local-data: "dhcp5.home.lan. IN A 10.0.0.5" local-data: "dhcp6.home.lan. IN A 10.0.0.6" local-data: "dhcp7.home.lan. IN A 10.0.0.7" local-data-ptr: "10.0.0.1 firewall.home.lan" local-data-ptr: "10.0.0.2 laptop.home.lan" local-data-ptr: "10.0.0.3 xboxone.home.lan" local-data-ptr: "10.0.0.4 ps4.home.lan" local-data-ptr: "10.0.0.5 dhcp5.home.lan" local-data-ptr: "10.0.0.6 dhcp6.home.lan" local-data-ptr: "10.0.0.7 dhcp7.home.lan" # Unbound can query your NSD or BIND server for private domain queries too. # On our NSD page we have NSD configured to serve the private domain, # "home.lan". Here we can tell Unbound to connect to the NSD server when it # needs to resolve a *.home.lan hostname or IP. # # private-domain: "home.lan" # local-zone: "0.0.10.in-addr.arpa." nodefault # stub-zone: # name: "home.lan" # stub-addr: [email protected] # If you have an internal or private DNS names the external DNS servers can # not resolve, then you can assign domain name strings to be redirected to a # seperate dns server. For example, our comapny has the domain # organization.com and the domain name internal.organization.com can not be # resolved by Google's public DNS, but can be resolved by our private DNS # server located at 22.214.171.124. The following tells Unbound that any # organization.com domain, i.e. *.organization.com be dns resolved by 126.96.36.199 # instead of the public dns servers. # # forward-zone: # name: "organization.com" # forward-addr: 188.8.131.52 # Internal or private DNS # Use the following forward-zone to forward all queries to Google DNS, # OpenDNS.com or your local ISP's dns servers for example. To test resolution # speeds use "drill example.com @184.108.40.206" and look for the "Query time:" in # milliseconds. # forward-zone: name: "." forward-addr: 220.127.116.11 # Google Public DNS forward-addr: 18.104.22.168 # Hurricane Electric forward-addr: 22.214.171.124 #OpenNicProject.org # # ## Authoritative, validating, recursive caching DNS ## unbound.conf