Fresh new and improved getdns stubby and unbound aka dns privacy

LAN Interface For GETDNS and STUBBY Plus UNBOUND
IN LIFE ONE SHOULD HAVE OPTIONS

READ FULL GUIDE BEFORE GETTING STARTED !!!

For those who want to obtain full new updated upstream DOT Server List and Keys August 21 2020
see here below :
https://forums.torguard.net/index.php?/topic/1861-openwrt-new-and-improved-getdns-stubby-and-unbound-aka-dns-privacy/

Stop OpenWRT from allowing UNBOUND Root Hints to resolve dns queries. Ensures that localhost ( 127.0.0.1 ) will not be used as a resolver on OpenWRT.

Definition of Root Hints :
See here : http://www.itgeared.com/articles/1134-whats-is-root-hints/

" The Intro "remember to practice the concept that - NOW ! is the time for all of US ( A ) to GET UP & GET INVLOVED and act with SOUL POWER ! - lyrics to sing along : https://genius.com/James-brown-get-up-get-into-it-get-involved-lyrics plus https://genius.com/James-brown-soul-power-lyrics and video : https://www.youtube.com/watch?v=1pvIarW3xHg Bonus JB : https://www.youtube.com/watch?v=v8TvBPshngE - I run GetDns and Stubby forwarded to and integrated with Unbound. See here :

https://getdnsapi.net/
https://dnsprivacy.org/wiki/display/DP/DNS+Privacy+Daemon+-+Stubby
https://dnsprivacy.org/wiki/display/DP/DNS+Privacy+Clients#DNSPrivacyClients-Unbound - please read this carefully - you will note that it indicates : Unbound As A DNS TLS Client Features:Unbound can be run as a local caching forwarder, configured to use SSL upstream, however it cannot yet authenticate upstreams, re-use TCP/TLS connections, be configured for Opportunistic mode or send several of the privacy related options (padding, ECS privacy) etc. Some users combine Unbound (as a caching proxy with other features such as DNS Blacklisting) and Stubby (as a fully featured TLS forwarder). These are the reasons I choose to use GetDns and Stubby with Unbound. Those reasons being so that I can take full advantage of all of the most secure privacy features available when running DNS OVER TLS. For any and all who may be wondering why DNS OVER TLS is all the rage - read this: https://tenta.com/blog/post/2017/12/dns-over-tls-vs-dnscrypt
Read this and make for DOH vs DOT .
https://www.netmeister.org/blog/doh-dot-dnssec.html

Bottom Line Conclusion From Jan Schaumann - The Author of This Blog Entry :
For that, my current preference is quite clearly DNS-over-TLS:
I fear a bifurcation of DNS resolution by apps combined with the
push for using public resolvers with DoH will lead to a more complex
environment and threat model for many users.

Short Synopsis of DOH:
In other words , ( with DOH ) we gain the same
protections as with DoT for our web applications,
but leaves all other DNS traffic vulnerable.

Subsequently, as a matter of fact and in practice
with DNS OVER TLS ALL DNS traffic is invulnerable
and protected.This is why I run DOT and
eschew DOH on my OpenWRT Router.

Further, Personally, I run GETDNS STUBBY and UNBOUND as
described here along with ( wait for it )
FireFox DOH along with Encrypted SNI - plus TLS v 1.3 in Stubby
and naturally a properly configured and encrypted VPN -

Let Me Save You A Future Headache
Complete These Steps 1 - 7 Detailed Below
Before Proceeding With LAN Interface For GETDNS
and STUBBY Plus UNBOUND Tutorial

I compared my OpenWRT /etc/resolv.conf file to
my OPNsense and pfSense Firewalls' /etc/resolv.conf files before and
after configuring LAN Interface For GETDNS and STUBBY Plus UNBOUND
on these three Routers - See Results Below :

# Note**
# domain secureone.duckdns.org # Domain Used Throughout This Guide
# Is Strictly For Illustrative Purposes and Comes From My
# OpenWRT DuckDNS LET’S ENCRYPT CERTIFICATES MADE SIMPLE Tutorial 

OpenWRT

Before Results Below :
cat /etc/resolv.conf
nameserver 127.0.0.1
search secureone.duckdns.org.

After Results Below - 127.0.0.1 Still 
Present and Now Controlled By UNBOUND :
 [root@bigmoma2 ~]# cat /etc/resolv.conf
# /tmp/resolv.conf generated by Unbound UCI 2020-02-18T10:38:51-0500
nameserver 127.0.0.1
nameserver ::1
search secureone.duckdns.org. 

As you see 127.0.0.1 was still being used as resolver in /etc/resolv.conf -
OPNsense and pfSense have a box to check so 127.0.0.1 is disabled 
and not used as resolver on the router.
I wanted my OpenWRT /etc/resolv.conf file to mirror the same /etc/resolv.conf 
contents as on my OPNsense and pfSense Firewalls. Here is how I achieved that
end on OpenWRT Router ( follow directions below : 
Source Documents : 
https://unix.stackexchange.com/questions/421977/how-to-set-chattr-i-for-my-etc-resolv-conf 
and https://www.ostechnix.com/prevent-files-folders-accidental-deletion-modification-linux/

1 - opkg update ; opkg install chattr lsattr
2 - rm /etc/resolv.conf ( remove the symlink )
3 - touch /etc/resolv.conf ( create the new file )
4 - nano /etc/resolv.conf (  populate it with lan and search data )
5 - enter as below for this example :

nameserver 192.168.7.11
search secureone.duckdns.org

Save and Exit

6 - chattr +i /etc/resolv.conf ( make new /etc/resolv.conf immutable / undeletable )
7 - reboot & exit

Source Document : https://www.tecmint.com/make-file-directory-undeletable-immutable-in-linux/

After Taking Above Steps 1-7  
Results Are Detailed Below :
[root@together ~]# cat /etc/resolv.conf
nameserver 192.168.7.11
search secureone.duckdns.org

This is what I wanted - the elimination of localhost ( 127.0.0.1 )
being used as a resolver for my OpenWRT Router's /etc/resolv.conf file.

Most importantly, your OpenWRT /etc/resolv.conf
file ( with LAN setting ) will persist and remain unchanged 
after setting up your LAN Interface For GETDNS and 
STUBBY Plus UNBOUND as detailed in this guide.

I undertook Steps 1 - 7 above to ensure that Root Hints will not be used
at all by OpenWRT Router. After all, that is the ultimate goal of this project.

Take Special Attention ( Unlock /etc/resolv.conf to reset Router ) :
In order to reset your OpenWRT Router to default settings for any reason -
you MUST ! first issue this command # chattr -i /etc/resolv.conf
After doing so - you may now reset your router using your regular method

Back To Setting Up DNS Over TLS On OpenWRT :
Here is a basic guide as to how to do it -
https://blog.grobox.de/2018/what-is-dns-privacy-and-how-to-set-it-up-for-openwrt/
However a few modifications are needed - see below and follow along :

As always - opkg update
first and foremost
Prerequisite
You have a ca cert bundle installed on your router.
You can do this by running the following

opkg install ca-certificates

1 - opkg update ; opkg install unbound-daemon-heavy unbound-control unbound-control-setup luci-app-unbound unbound-anchor unbound-host unbound-checkconf odhcpd
2 - opkg update ; opkg install stubby getdns

3- My WORKING CONFIGS /etc/unbound/unbound_srv.conf
( Adjust For Your Router - I Run WRT1900ACS and 
WRT3200ACM So I Have Plenty Of Ram, Storage and 2 CPU's )
You should " Optimize Unbound " 
see here: https://nlnetlabs.nl/documentation/unbound/howto-optimise/ 

## Note : do-not-query-localhost: no 
## this entry is necessarily removed 
## from this UNBOUND configuration below
## Disabling DNS Queries From Localhost ( 127.0.0.1 )

cat >> /etc/unbound/unbound_srv.conf <<UNBOUND_SERVER_CONF
server:
tls-cert-bundle: "/var/lib/unbound/ca-certificates.crt"
# use all CPUs
num-threads: 2

# power of 2 close to num-threads
msg-cache-slabs: 4
rrset-cache-slabs: 4
infra-cache-slabs: 4
key-cache-slabs: 4

# more cache memory, rrset=msg*2
rrset-cache-size: 200m
msg-cache-size: 100m

# more outgoing connections
# depends on number of cores: 1024/cores - 50
outgoing-range: 8192

# Larger socket buffer.  OS may need config.
so-rcvbuf: 4m
so-sndbuf: 4m

interface: 192.168.7.11 # Put Your One Main LAN Address Here
outgoing-interface: 192.168.7.11 # Likewise Put Your One Main LAN Address Here
cache-min-ttl: 3600
cache-max-ttl: 86400
hide-identity: yes
hide-version: yes
hide-trustanchor: yes
harden-glue: yes
harden-dnssec-stripped: yes
infra-cache-numhosts: 100000
num-queries-per-thread: 4096
max-udp-size: 3072
minimal-responses: yes
rrset-roundrobin: yes
use-caps-for-id: no
do-ip6: no
do-ip4: yes
do-tcp: yes
do-udp: yes
prefetch: yes
prefetch-key: yes
qname-minimisation: yes
qname-minimisation-strict: yes
harden-below-nxdomain: yes
aggressive-nsec: yes
so-reuseport: yes
unwanted-reply-threshold: 10000000
interface-automatic: yes
verbosity: 1
private-domain: "secureone.duckdns.org" # Used For Illustrative Purposes ( See **Note Above )
harden-referral-path: yes
target-fetch-policy: "0 0 0 0 0"
val-clean-additional: yes
ip-ratelimit: 300
ip-ratelimit-factor: 10
incoming-num-tcp: 100
edns-buffer-size: 4096
UNBOUND_SERVER_CONF

As per guide :# Don’t let each server know the next recursion
Enter via SSH command line:
uci set 'unbound.@unbound[0].query_minimize=1'
uci commit

I choose to use the /etc/stubby/stubby.yml file to configure STUBBY. My reasons for preferring to configure Stubby with the /etc/stubby/stubby.yml file instead of the now default UCI system /etc/config/stubby file are for several reasons. I found that I have more control over the security options which DNS OVER TLS is intended to provide. Like padding - 853 or 443 port and so on. So in order to use /etc/stubby/stubby.yml file, you must change a default setting in the /etc/config/stubby file to allow manual configuration. To keep this simple - go into default UCI STUBBY file which is /etc/config/stubby by entering nano /etc/config/stubby and then set option manual '1' - if you leave it at default setting of option manual 'o' you will not be able to use the /etc/stubby/stubby.yml file in order to configure STUBBY as before. So, after changing option manual '1' in the /etc/config/stubby file - configure /etc/stubby/stubby.yml as follows :
enter nano /etc/stubby/stubby.yml

4 - VERY IMPORTANT UPDATE:
After checking on this website: https://www.immuniweb.com/ssl/?id=Su8SeUQ4  
I strongly suggest you only choose to deploy servers which 
support the TLSv1.3 protocol . See here for information and importance of 
TLSv1.3 : https://kinsta.com/blog/tls-1-3/  I will save you some 
considerable leg work and post 
below the best configuration for your stubby.yml file. Here it is:

# All DNS Privacy Servers Below Tested and Updated On June 30 2020 With A+ Rating - 
# 100%  Perfecto Configuration on website: https://www.immuniweb.com/ssl/?id=Su8SeUQ4n 
# These servers support the most recent and secure TLS protocol version of TLS 1.3 **
# see country code lists here :
# https://www.nationsonline.org/oneworld/country_code_list.htm and / or
# https://www.iban.com/country-codes
# Use as many or as few depending on your specific needs 

resolution_type: GETDNS_RESOLUTION_STUB
round_robin_upstreams: 1
appdata_dir: "/var/lib/stubby"
tls_authentication: GETDNS_AUTHENTICATION_REQUIRED
tls_query_padding_blocksize: 128
edns_client_subnet_private: 1
idle_timeout: 9000
listen_addresses:
  - 192.168.7.11@5453 # Put Your One Main LAN Address Here
dns_transport_list:
  - GETDNS_TRANSPORT_TLS
tls_connection_retries: 5
tls_backoff_time: 900
timeout: 2000
tls_ca_path: "/etc/ssl/certs/"
upstream_recursive_servers:
### IPV4 Servers ###
### DNS Privacy DOT Test Servers ###
## 1 - The getdnsapi.net DNS TLS Server A+ ( NLD )
  - address_data: 185.49.141.37
    tls_auth_name: "getdnsapi.net"
    tls_port: 853
    tls_pubkey_pinset:
      - digest: "sha256"
        value: foxZRnIh9gZpWnl+zEiKa0EJ2rdCGroMWm02gaxSc9Q=
## 2 - The Surfnet/Sinodun DNS TLS Server #3  A+ ( NLD )
  - address_data: 145.100.185.18
    tls_port: 853
    tls_auth_name: "dnsovertls3.sinodun.com"
    tls_pubkey_pinset:
      - digest: "sha256"
        value: 5SpFz7JEPzF71hditH1v2dBhSErPUMcLPJx1uk2svT8=
## 3 - The dns.cmrg.net DNS TLS Server  A+ ( CAN )
  - address_data: 199.58.81.218
    tls_auth_name: "dns.cmrg.net"
    tls_port: 853
    tls_pubkey_pinset:
      - digest: "sha256"
        value: 3IOHSS48KOc/zlkKGtI46a9TY9PPKDVGhE3W2ZS4JZo=
## 4 - The BlahDNS Japan DNS TLS Server  A+ ( JPN )
  - address_data: 45.32.55.94
    tls_auth_name: "dot-jp.blahdns.com"
    tls_port: 443
    tls_pubkey_pinset:
      - digest: "sha256"
        value: gIoiNFxX1Nw+7/pVsmUKBU941bMBYjEYuB2T9drULOM=
## 5 - The BlahDNS German DNS TLS Server  A+ ( USA Hosted In DEU )
  - address_data: 159.69.198.101
    tls_auth_name: "dot-de.blahdns.com"
    tls_port: 443
    tls_pubkey_pinset:
      - digest: "sha256"
        value: YZeyeJf/suAR2fMHLc9RDPkcQi/e8EEnzk5Y1N90QQE=
## 6 - The BlahDNS Finland DNS TLS Server  A+ ( FIN )
  - address_data: 95.216.212.177
    tls_auth_name: "dot-fi.blahdns.com"
    tls_port: 443
    tls_pubkey_pinset:
      - digest: "sha256"
        value: PID8ufrN/lfloA6y/C+mpR8MT53GG6GkAd8k+RmgTwc=
## 7 - The dns.neutopia.org  DNS TLS Server  A+ ( FRA )
  - address_data: 89.234.186.112
    tls_auth_name: "dns.neutopia.org"
    tls_port: 443
    tls_pubkey_pinset:
      - digest: "sha256"
        value: wTeXHM8aczvhRSi0cv2qOXkXInoDU+2C+M8MpRyT3OI=
## 8 - The Foundation for Applied Privacy DNS TLS Server #1  A+ ( AUT )
  - address_data: 94.130.106.88
    tls_auth_name: "dot1.applied-privacy.net"
    tls_port: 443
    tls_pubkey_pinset:
      - digest: "sha256"
        value: 78kfbZFJaxGrAl+0hkiyWER0ajTgFL/KxMAZQHSNhWU=
## 9 - The Foundation for Applied Privacy DNS TLS Server #2  A+ ( AUT )
  - address_data: 93.177.65.183
    tls_auth_name: "dot1.applied-privacy.net"
    tls_port: 443
    tls_pubkey_pinset:
      - digest: "sha256"
        value: 78kfbZFJaxGrAl+0hkiyWER0ajTgFL/KxMAZQHSNhWU=
## 10 - The Secure DNS Project by PumpleX DNS TLS Server #1  A+ ( GBR )
  - address_data: 51.38.83.141
    tls_auth_name: "dns.oszx.co"
    tls_port: 853
    tls_pubkey_pinset:
      - digest: "sha256"
        value: Bd5frvFVxtk4ru8L7JozLol7dn80YDTaP8b3yU06JB8=
## 11 - The Rubyfish Internet Tech DNS TLS Server A+ ( CHN )
  - address_data: 115.159.131.230
    tls_auth_name: "dns.rubyfish.cn"
    tls_port: 853
    tls_pubkey_pinset:
      - digest: "sha256"
        value: DBDigty3zDS7TN/zbQOmnjZ0qW+qbRVzlsDKSsTwSxo=
## 12 - The Lorraine Data Network DNS TLS Server A+ ( FRA )
  - address_data: 80.67.188.188
    tls_port: 443
    tls_pubkey_pinset:
      - digest: "sha256"
        value: WaG0kHUS5N/ny0labz85HZg+v+f0b/UQ73IZjFep0nM=
## This certificate is currently expired which
## does not pose any concerns in SPKI mode
## (in practice with Stubby)
## Source : https://ldn-fai.net/serveur-dns-recursif-ouvert/
## 13 - The DNSPRIVACY.at TLS Server #1  A+ ( DEU )
  - address_data: 94.130.110.185
    tls_auth_name: "ns1.dnsprivacy.at"
    tls_port: 853
    tls_pubkey_pinset:
      - digest: "sha256"
        value: MjA0IXWNt3+LCmuKT9ewjX3PwJxNqs2RoTa/NmzPHwI=
## 14 - The DNSPRIVACY.at TLS Server #2  A+ ( DEU ) - expired 2020-04-01
  - address_data: 94.130.110.178
    tls_auth_name: "ns2.dnsprivacy.at"
    tls_port: 853
    tls_pubkey_pinset:
      - digest: "sha256"
        value: 68MH4G5hipbK1xYATBFgA+/DNLDd333oXr22QyB/RRo=
# 15 - The ibksturm.synology.me DNS TLS Server  A+ ( CHE )
  - address_data: 85.5.93.230
    tls_auth_name: "ibksturm.synology.me"
    tls_port: 853
    tls_pubkey_pinset:
      - digest: "sha256"
        value: npNOnBcLbvZWZgdmcuFaEqYJbaGjBlHMf9DknDoIkgg=
## 16 - The dns.flatuslifir.is DNS TLS Server  A+ ( ISL )
  - address_data: 46.239.223.80
    tls_auth_name: "dns.flatuslifir.is"
    tls_port: 853
    tls_pubkey_pinset:
      - digest: "sha256"
        value: 3QPTZIcJdZFCx5t3tZiqdCBYpigUX+1Gwz+iQfLXrJE=
### Publicly Available DOT Test Servers ###
## 17 - The ContainerPI.com - CPI DNS TLS Server  A+ ( JPN )
  - address_data: 45.77.180.10
    tls_auth_name: "dns.containerpi.com"
    tls_port: 853
    tls_pubkey_pinset:
      - digest: "sha256"
        value: xz8kGlumwEGkPwJ3QV/XlHRKCVNo2Fae8bM5YqlyvFs=
## 18 - The FEROZ SALAM DNS TLS Server  A+ ( GBR )
  - address_data: 46.101.66.244
    tls_auth_name: "doh.li"
    tls_port: 853
    tls_pubkey_pinset:
      - digest: "sha256"
        value: VEjC/umyfulb4CbLZ6mIyEqHPbwv0D6osfrUbi8Dm28=
## 19 - The Andrews & Arnold DNS TLS Server #1  A+ ( GBR )
  - address_data: 217.169.20.23
    tls_auth_name: "dns.aa.net.uk"
    tls_port: 853
    tls_pubkey_pinset:
      - digest: "sha256"
        value: 41OknyzhvFDNZqlvTs4mFTWSkAXSPXWQ4wRgky5Qyzc=
## 20 - The Andrews & Arnold DNS TLS Server #2  A+ ( GBR )
  - address_data: 217.169.20.22
    tls_auth_name: "dns.aa.net.uk"
    tls_port: 853
    tls_pubkey_pinset:
      - digest: "sha256"
        value: I88W3UOUiCa+1KMukcoys2FtyL93GAKalO1EW7iOZJk=
## 21 - The dns.seby.io - Vultr DNS TLS Server  A+ ( AUS )
  - address_data: 45.76.113.31
    tls_auth_name: "dot.seby.io"
    tls_port: 853
    tls_pubkey_pinset:
      - digest: "sha256"
        value: H13Su1659zEn0ZIblEShwjZO+M5gxKK2wXpVKQHgibM=
## 22 - The dns.seby.io - OVH DNS TLS Server  A+ ( AUS )
  - address_data: 139.99.222.72
    tls_auth_name: "dot.seby.io"
    tls_port: 853
    tls_pubkey_pinset:
      - digest: "sha256"
        value: 8A/1KQQiN+aFWenQon076nAINhlZjGkB15C4E/qogGw=
## 23 - The Digitale Gesellschaft DNS TLS Server #1  A+ ( CHE )
  - address_data: 185.95.218.43
    tls_auth_name: "dns.digitale-gesellschaft.ch"
    tls_port: 853
    tls_pubkey_pinset:
      - digest: "sha256"
        value: S+DuqASQtCTm8qr4G9z53uLEy230lIDgbHl9AtId0Yw=
## 24 - The Digitale Gesellschaft DNS TLS Server #2  A+ ( CHE )
  - address_data: 185.95.218.42
    tls_auth_name: "dns.digitale-gesellschaft.ch"
    tls_port: 853
    tls_pubkey_pinset:
      - digest: "sha256"
        value: bthpji8smy3f2lSvweu5hXpb/6hLrk3Txh6euWztF5Q=
## 25 - The Antoine Aflalo DNS TLS Server #1  A+ ( USA )
  - address_data: 168.235.81.167
    tls_auth_name: "dns-nyc.aaflalo.me"
    tls_port: 853
    tls_pubkey_pinset:
      - digest: "sha256"
        value: kjMUEH0kNEaZ4cDn3SQV/vANgycPm0qRPMU2yd4OlT0=
## 26 - The Privacy-First DNS TLS Server #1  A+ ( JPN )
  - address_data: 172.104.93.80
    tls_auth_name: "jp.tiar.app"
    tls_port: 853
    tls_pubkey_pinset:
      - digest: "sha256"
        value: 6PiLZvmKVJKLekrweBWO1tjRmratPGWkadjsicFXAlU=
## 27 - The Privacy-First DNS TLS Server #2  A+ ( SGP Hosted In USA )
  - address_data: 174.138.29.175
    tls_auth_name: "dot.tiar.app"
    tls_port: 853
    tls_pubkey_pinset:
      - digest: "sha256"
        value: 5hG9dlXtWeLWdCfE4QdNWlalxlFITtt8c2YgZVaCNWQ=
## 28 - The ibuki.cgnat.net DNS TLS Server  A+ ( USA )
  - address_data: 35.198.2.76
    tls_auth_name: "ibuki.cgnat.net"
    tls_port: 853
    tls_pubkey_pinset:
      - digest: "sha256"
        value: C+ximOx14NAMAWq9TvgT1irRs2R37MnECtGBTO1OOYU=
## 29 - The PI-DNS.COM West USA DNS TLS Server A+ ( USA )
  - address_data: 45.67.219.208
    tls_auth_name: "dot.westus.pi-dns.com"
    tls_port: 853
    tls_pubkey_pinset:
      - digest: "sha256"
        value: tfdCeUhPuPGyufMk1O1m8wMirCGpuS/chiAUyRCkBmY=
## 30 - The PI-DNS.COM DNS TLS East USA Server A+ ( USA )
  - address_data: 185.213.26.187
    tls_auth_name: "dot.eastus.pi-dns.com"
    tls_port: 853
    tls_pubkey_pinset:
      - digest: "sha256"
        value: PDuAjVfbR5apthM4n0c1LzcmJH/aBd4SAqpnnt4Bmy4=
## 31 - The PI-DNS.COM Central Europe DNS TLS Server A+ ( DEU )
  - address_data: 88.198.91.187
    tls_auth_name: "dot.centraleu.pi-dns.com"
    tls_port: 853
    tls_pubkey_pinset:
      - digest: "sha256"
        value: 9rEHDwaRyQf/NFX6OH2gyJOrPg6ZABeEQ2PIXgrgyyE=
## 32 - The PI-DNS.COM North Europe DNS TLS Server A+ ( FIN )
  - address_data: 95.216.181.228
    tls_auth_name: "dot.northeu.pi-dns.com"
    tls_port: 853
    tls_pubkey_pinset:
      - digest: "sha256"
        value: gouwOSAsY4GvTHhm1aai15Xt8+L84199aAVN3CrWsiI=
## 33 - The PI-DNS.COM East Australia DNS TLS Server A+ ( AUS )
  - address_data: 45.63.30.163
    tls_auth_name: "dot.eastau.pi-dns.com"
    tls_port: 853
    tls_pubkey_pinset:
      - digest: "sha256"
        value: TFNiPxVz7a1gxDV5x8i6zY3gvEFL/o99zgmwc79KrTs=
## 34 - The PI-DNS.COM East Asia DNS TLS Server A+ ( USA )
  - address_data: 66.42.33.135
    tls_auth_name: "dot.eastas.pi-dns.com"
    tls_port: 853
    tls_pubkey_pinset:
      - digest: "sha256"
        value: XDrRwtqxJgnvmBoWZrD9QE1QAjF74qPWnBv2UJ4Wkgg=
## 35 - The Snopyta DNS TLS Server A+ ( FIN )
  - address_data: 95.216.24.230
    tls_auth_name: "fi.dot.dns.snopyta.org"
    tls_port: 853
    tls_pubkey_pinset:
      - digest: "sha256"
        value: cYf+8BXhzbBmQe6qP+BHzLb2UZ/rgOspuyCmk2aVhlE=
## 36 - The NixNet Uncensored Las Vegas DNS TLS Server A+ ( USA )
## - or use ( tls_auth_name: "adblock.lv1.dns.nixnet.xyz" )
  - address_data: 209.141.34.95
    tls_auth_name: "uncensored.lv1.dns.nixnet.xyz"
    tls_port: 853
    tls_pubkey_pinset:
      - digest: "sha256"
        value: flpUestk4tYCQ1wB3WP5sIztvRIOiAPLKCtVqbM/SJ8=
## 37 - The NixNet Uncensored New York DNS TLS Server A+ ( USA )
## - or use ( tls_auth_name: "adblock.ny1.dns.nixnet.xyz" )
  - address_data: 199.195.251.84
    tls_auth_name: "uncensored.ny1.dns.nixnet.xyz"
    tls_port: 853
    tls_pubkey_pinset:
      - digest: "sha256"
        value: cXriM10X2+lW6V8NOrMZd2nssgC1TeW2DutGlmMn5fc=
## 38 - The NixNet Uncensored Luxembourg DNS TLS Server A+ ( LUX )
## - or use ( tls_auth_name: "adblock.lux1.dns.nixnet.xyz" )
  - address_data: 104.244.78.231
    tls_auth_name: "uncensored.lux1.dns.nixnet.xyz"
    tls_port: 853
    tls_pubkey_pinset:
      - digest: "sha256"
        value: 7cOZUgpjYw3Qy5K97ww3APnMau8zHrIEbC0znGgEGyw=
## 39 - The Lelux.fi DNS TLS Server  A+ ( FRA Hosted In GBR )
  - address_data: 51.158.147.50
    tls_auth_name: "resolver-eu.lelux.fi"
    tls_port: 853
    tls_pubkey_pinset:
      - digest: "sha256"
        value: 77zOtPEiiEnIEliuHySTchfWbyfCV+nfHeejrN0gzpM=
## 40 - The Lightning Wire Labs DNS TLS Server  A+ ( DEU )
  - address_data: 81.3.27.54
    tls_auth_name: "recursor01.dns.lightningwirelabs.com"
    tls_port: 853
    tls_pubkey_pinset:
      - digest: "sha256"
        value: jVdEaKPP27O6wPq6wbvXrTtDsDEiOoVdyTY9uUHXDJ0=
## 41 - The Hostux DNS TLS Server  A+ ( LUX )
  - address_data: 185.26.126.37
    tls_auth_name: "dns.hostux.net"
    tls_port: 853
    tls_pubkey_pinset:
      - digest: "sha256"
        value: P0gaP31TQQzAIN3DomM5vXS3+8oCgYcTA/ZJ09Jw4QE=
## 42 - The dnsforge.de DNS TLS Server #1  A+ ( DEU )
  - address_data: 176.9.1.117
    tls_auth_name: "dnsforge.de"
    tls_port: 853
    tls_pubkey_pinset:
      - digest: "sha256"
        value: m51QwAhzNDSa3G7c1Y6eOEsskzp6ySzeOqy0LKcptDw=
## 43 - The dnsforge.de DNS TLS Server #2  A+ ( DEU )
  - address_data: 176.9.93.198
    tls_auth_name: "dnsforge.de"
    tls_port: 853
    tls_pubkey_pinset:
      - digest: "sha256"
        value: m51QwAhzNDSa3G7c1Y6eOEsskzp6ySzeOqy0LKcptDw=
# 44 - The Freifunk München DNS TLS Server  A+ ( DEU )
  - address_data: 195.30.94.28
    tls_auth_name: "doh.ffmuc.net"
    tls_port: 853
    tls_pubkey_pinset:
      - digest: "sha256"
        value: 1swf1Y7mDE9KBYARlBG00o5sQ7zZjOGSb0ahWpaKV5M=
# 45 - The doh.defaultroutes.de DNS TLS Server  A+ ( DEU )
  - address_data: 5.45.107.88
    tls_auth_name: "doh.defaultroutes.de"
    tls_port: 853
    tls_pubkey_pinset:
      - digest: "sha256"
        value: p7t6DDebAlM1rwkrJgZJ6CDkuJG0Ff5PKYZ8bUPQCM0=
## 46 - The CIRA Canadian Shield DNS TLS Servers  A+ ( CAN )
  - address_data: 149.112.121.10
    tls_auth_name: "private.canadianshield.cira.ca"
    tls_port: 853
    tls_pubkey_pinset:
      - digest: "sha256"
        value: sXmZXPsnkbQMw68THpV0Tgh9zCe12TtXIinSTf7lkkw=
  - address_data: 149.112.122.10
    tls_auth_name: "private.canadianshield.cira.ca"
    tls_port: 853
    tls_pubkey_pinset:
      - digest: "sha256"
        value: sXmZXPsnkbQMw68THpV0Tgh9zCe12TtXIinSTf7lkkw=
# 47 - The dns.dnshome.de DNS TLS Server #1  A+ ( DEU )
  - address_data: 185.233.106.232
    tls_auth_name: "dns.dnshome.de"
    tls_port: 853
    tls_pubkey_pinset:
      - digest: "sha256"
        value: q5AkxgnWVCVjCUNUKl3aIBpGTfXF5GahE0RcncwbZoc=
  - address_data: 185.233.107.4
    tls_auth_name: "dns.dnshome.de"
    tls_port: 853
    tls_pubkey_pinset:
      - digest: "sha256"
        value: q5AkxgnWVCVjCUNUKl3aIBpGTfXF5GahE0RcncwbZoc=
## 48 - The Usable Privacy DNS TLS Server  A+ ( DEU / AUT )
  - address_data: 149.154.153.153
    tls_auth_name: "adfree.usableprivacy.net"
    tls_port: 853
    tls_pubkey_pinset:
      - digest: "sha256"
        value: VEmtR6+zgZ2mcyEI0NvpDCFhijAoawwKbStKYTj+774=
## 49 - The DeCloudUs DNS TLS Server  A+ ( DEU )
  - address_data: 176.9.199.152
    tls_auth_name: "dot.decloudus.com"
    tls_port: 853
    tls_pubkey_pinset:
      - digest: "sha256"
        value: L/QUBSkq/goTWjGgW7DjC29IoSdaqrVYGG5ME7lJYMo=
## 50 - The Hurricane Electric DNS TLS Server A+ ( USA )
  - address_data: 74.82.42.42
    tls_auth_name: "ordns.he.net"
    tls_port: 853
    tls_pubkey_pinset:
      - digest: "sha256"
        value: G9pQNrYB98Wll0AmBF/GsMMn6gaDbXDnInV1je1MaPo=
### Anycast Publicly Available DOT Test Servers ###
## 51 - The NixNet Uncensored Anycast DNS TLS Servers  ( Anycast )
  - address_data: 198.251.90.114
    tls_auth_name: "uncensored.any.dns.nixnet.xyz"
    tls_port: 853
    tls_pubkey_pinset:
      - digest: "sha256"
        value: Ryhjf7K6V9/Fw/7XU7fqzrVJVEOyPtlHR/rFetOXrug=
  - address_data: 198.251.90.89
    tls_auth_name: "adblock.any.dns.nixnet.xyz"
    tls_port: 853
    tls_pubkey_pinset:
      - digest: "sha256"
        value: Ryhjf7K6V9/Fw/7XU7fqzrVJVEOyPtlHR/rFetOXrug=
## 52 - The DNSlify DNS TLS Servers  A+ ( Anycast )
  - address_data: 185.235.81.1
    tls_auth_name: "doh.dnslify.com"
    tls_port: 853
    tls_pubkey_pinset:
      - digest: "sha256"
        value: w5AEEaNvoBOl4+QeDIuRaaL6ku+nZfrhZdB2f0lSITM=
  - address_data: 185.235.81.2
    tls_auth_name: "doh.dnslify.com"
    tls_port: 853
    tls_pubkey_pinset:
      - digest: "sha256"
        value: w5AEEaNvoBOl4+QeDIuRaaL6ku+nZfrhZdB2f0lSITM=
### DNS Privacy Anycast DOT Public Resolvers ###

# Set the acceptable cipher for DNS over TLS1.3. OpenSSL >= 1.1.1 is required
# for this option. This option can also be given per upstream.
tls_ciphersuites: "TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256"
# Set the minimum acceptable TLS version. Works with OpenSSL >= 1.1.1 only.
# This option can also be given per upstream.
tls_min_version: GETDNS_TLS1_3

In order for TLSv1.3 protocol to work properly ( read at all ) in your Stubby 
instance, OpenWrt must have OpenSSL 1.1.1 active and configured in the kernel.
Any OpenWrt 18.06 Build does not offer OpenSSL 1.1.1 
in any shape, form or fashion.OpenWrt 19.07.0 Release 
Candidates and Snapshots do provide OpenSSL 1.1.1 support.
Once you have OpenSSL 1.1.1 with TLSv1.3 simply follow 
the guide above in order to set Stubby to implement TLS1.3. 
The operative lines necessary are these two specifically 
found at the bottom of the stubby.yml file above:

tls_ciphersuites: "TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256"
tls_min_version: GETDNS_TLS1_3

See below for TLS1.3 Support Check SSH Commands -

openssl s_client 168.235.81.167:853

OR :

openssl s_client 159.69.198.101:443

Read Out Will Be Verified By These Lines Below:

Post-Handshake New Session Ticket arrived:
SSL-Session:
    Protocol  : TLSv1.3
    Cipher    : TLS_CHACHA20_POLY1305_SHA256

OR :

Post-Handshake New Session Ticket arrived:
SSL-Session:
    Protocol  : TLSv1.3
    Cipher    : TLS_AES_256_GCM_SHA384

Depending on Configuration on Tested DOT Server

I also strongly encourage you to subscribe to blockerDNS found here : https://blockerdns.com/
This new DOH / DNS OVER TLS provider is the fastest I have run across. blockerDNS is run by
Tambe Barsbay a seasoned, thorough and extremely proficient tech practitioner.
blockerDNS is based in the U.S. and its infrastructure is hosted on Google Cloud Platform
and DigitalOcean. You can view blockerDNS subscription options here : https://blockerdns.com/tryit -
Tambe stands by his claim " Instant support by phone or email ".
Overall blockerDNS is a great DNSPRIVACY DNS Service. Tip : The Mobile $0.99 per month option should suffice for most home users. Links : https://tambeb.com/ https://blockerdns.com/blog
https://blockerdns.com/support https://blockerdns.com/overview

5 - MY WORKING CONFIG /etc/unbound/unbound_ext.conf

( Simply Copy and Paste Into Your SSH Session and Hit Enter )

cat >> /etc/unbound/unbound_ext.conf <<UNBOUND_FORWARD_CONF
forward-zone:
name: "." # Allow all DNS queries
forward-addr: 192.168.7.11@5453 # Forward Unbound To Stubby Address/Port
UNBOUND_FORWARD_CONF
6 - # Move dnsmasq to port 53535 where it will still serve local DNS from DHCP
# Network -> DHCP & DNS -> Advanced Settings -> DNS server port to 53535
uci set 'dhcp.@dnsmasq[0].port=53535'

# Configure dnsmasq to send a DNS Server DHCP option with its LAN IP
# since it does not do this by default when port is configured.
uci add_list "dhcp.lan.dhcp_option=option:dns-server,$(uci get network.lan.ipaddr)"

uci set 'unbound.@unbound[0].dhcp_link=dnsmasq'

# Save & Apply (will restart dnsmasq, DNS unreachable until unbound is up)    
uci commit && reload_config

# Restart (or start) unbound (System -> Startup -> unbound -> Restart)
/etc/init.d/unbound restart


7 - uci add_list dhcp.@dnsmasq[-1].server='192.168.7.11#5453' # Put You One Main LAN Address Here
    uci set dhcp.@dnsmasq[-1].noresolv=1
    uci commit && reload_config

A - Via UCI (Unified Configuration Interface) - in shell
uci set dhcp.@dnsmasq[0].cachesize=8192
uci set dhcp.@dnsmasq[0].dnsforwardmax=250
uci set dhcp.@dnsmasq[0].rebind_protection=1
uci set dhcp.@dnsmasq[0].ednspacket_max=4096
uci commit dhcp && reload_config

8 - nano /etc/config/network 

uci set network.wan.peerdns='0'
uci set network.wan.dns='192.168.7.11'
uci commit && reload_config

9 - nano /etc/config/unbound  # Edit Unbound Config File

config unbound
        option add_extra_dns '0'
        option add_local_fqdn '1'
        option add_wan_fqdn '0'
        option dhcp4_slaac6 '0'
        option dns64 '0'
        option dns64_prefix '64:ff9b::/96'
        option domain "secureone.duckdns.org" # Used For Illustrative Purposes ( See **Note Above )
        option domain_type 'transparent'
        option edns_size '4096'
        option extended_stats '1'
        option hide_binddata '1'
        option extended_luci '1'
        option luci_expanded '1'
        option listen_port '53'
        option localservice '1'
        option num_threads '2'
        option manual_conf '0'
        option protocol 'ip4_only'
        option query_minimize '1'
        option query_min_strict '1'
        option rebind_localhost '1'
        option rebind_protection '1'
        option recursion 'aggressive'
        option resource 'medium'
        option root_age '9'
        option ttl_min '150'
        option unbound_control '3'
        option validator '1'
        option validator_ntp '1'
        option verbosity '2'
        list trigger_interface 'wan'
        list trigger_interface 'lan'
        list domain_insecure '3.us.pool.ntp.org'
        option dhcp_link 'dnsmasq'

10 - Final Step --- # /etc/init.d/unbound restart

11 - # reboot & exit

12 - Install OpenWRT dnsmasq-full package - ( Optional )

# opkg update ; opkg install dnsmasq-full --download-only && opkg remove dnsmasq && opkg install dnsmasq-full --cache . && rm *.ipk

Lastly, Check Your DNS Servers Below :

https://www.dnsleaktest.com/ https://cryptoip.info/dns-leak-test
https://www.grc.com/dns/dns.htm https://bash.ws/dnsleak/test/ and last but not least
https://cmdns.dev.dns-oarc.net/ for a thorough in depth DNS Test

Now all you need to do is run is a properly configured VPN Service.

2 Likes

What makes this way better than just running the DNS-over-https-proxy on OpenWrt? The DNS-over-https-proxy is a doddel to install and setup.

Dear Tapper82,
Hello and I hope that you are well. Read this and make your
decisions and conclusions concerning DOH vs DOT . Here is the article below:


Personally, I run GETDNS STUBBY and UNBOUND as described here along with ( wait for it )
FireFox DOH along with Encrypted SNI - plus TLS v 1.3 in Stubby
and naturally a properly configured and encrypted VPN

Short Synopsis of DOH:
In other words , ( with DOH ) we gain the same
protections as with DoT for our web applications,
but leaves all other DNS traffic vulnerable.

Subsequently, as a matter of fact and in practice
with DNS OVER TLS ALL DNS traffic is invulnerable
and protected.This is why I run DOT and
eschew DOH on my OpenWRT Router.

that was a long and rambling article but it did have some useful discussion.

here's the thing, in most people's threat model, they own their router (if you have a threat model, you are already sophisticated enough to see that you must own your router). so using the router as your DNS provider makes sense. then, the router can use unbound to forward lookups over DoT to a provider that is trusted for whatever reason... now 100% of DNS on the local network is protected.

so the usual solution for OpenWrt is

client -> dnsmasq -> unbound (also on router)-> (choose... 1.1.1.1 or quad nines or 8.8.8.8 or whatever)

1 Like

I sent you pm

Dear Jamesbe12,
Hello - I did not receive your PM - maybe you will send it again. I hope that you are well and safe - and
I hope to hear from you soon.

Peace and God Bless

Greetings from Spain @directnupe, here a newbie learning step by step, about OpenWRT and networking in general, first of all, thank you so much!! for this great and excellent tutorial, very clear and so useful too.

I've been using until today your method described at this tutorial but today I've impemented this method than like you say, is better, at least in my opinion (it will be so useful when I will deploy my Hyper-V enviorement in a near future).

Like you, I'm the owner of a Linksys WRT 3200 ACM, but using the last stable 19.07.5 release, not the David's releases, and only for INFO:

I've set a VLAN for each IP subnet [VoIP, hosts, servidores (servers), wireless, wlessguests (wireless for guests obviously), vpnlocal with wireguard protocol], for this reason, I've added a new VLAN/IP subnet only for use like DNS interface where send all the DNS queries from my Pihole, just works like a charm!!

Any local VLAN/IP subnet -> PiHole -> DNS VLAN/IP subnet -> Internet

######################################################################################
I've been able, like I said bedore, to set up everything that you expose on your tutrorial without problems, but I've doubts about MY dnsmasq-full configuration with this method, because I'm reusing my old config with this new method and I suppose that not all options set will be compatible or in the worst case, my dnsmasq configuration can be problematic with unbound.

Can you take a look to my dnsmasq-full and unbound config files and tell me what I've to change - delete in my dnsmasq config?

Dnsmasq config file:

config dnsmasq
        option port '53535'
        option domainneeded '1'
        option boguspriv '1'
        option filterwin2k '0'
        option local '/exampleforthispost/'
        option domain 'exampleforthispost'
        option rebind_domain '/exampleforthispost/'
        option rebind_protection '1'
        option rebind_localhost '1'
        option add_local_fqdn '3'
        option fqdn '1'
        option expandhosts '1'
        option authoritative '0'
        option readethers '0'
        option nonwildcard '1'
        option localservice '1'
        option localuse '1'
        option noresolv '1'
        option nonegcache '0'
        option dnssec '1'
        option dnsseccheckunsigned '1'
        option cachesize '8192'
        option dnsforwardmax '250'
        option ednspacket_max '4096'
        option localise_queries '1'
        option logfacility '/mnt/sda2/0.log_files/dnsmasq/dnsmasq_queries.log'
        option leasefile '/tmp/dhcp.leases'
        list server '192.168.50.1#5453'

Unbound config file:

config unbound
        option add_extra_dns '0'
        option add_local_fqdn '1'
        option add_wan_fqdn '0'
        option dhcp4_slaac6 '0'
        option dns64 '0'
        option dns64_prefix '64:ff9b::/96'
        option domain 'home.homedomainhsh.duckdns.org'
        option domain_type 'transparent'
        option edns_size '4096'
        option extended_stats '1'
        option hide_binddata '1'
        option extended_luci '1'
        option luci_expanded '1'
        option listen_port '53'
        option localservice '1'
        option num_threads '2'
        option manual_conf '0'
        option protocol 'ip4_only'
        option query_minimize '1'
        option query_min_strict '1'
        option rebind_localhost '1'
        option rebind_protection '1'
        option recursion 'aggressive'
        option resource 'medium'
        option root_age '9'
        option ttl_min '150'
        option unbound_control '3'
        option validator '1'
        option validator_ntp '1'
        option verbosity '2'
        list trigger_interface 'wan'
        list trigger_interface 'dns'
        list domain_insecure '3.es.pool.ntp.org'
        option dhcp_link 'dnsmasq'

P.S.: Like you can see at the dnsmasq config, I don't use hosts and ethers files, instead, I've domain records at this file for each host with static IP like servers, and domain and host records for each host with dynamic or lease dhcp.

######################################################################################

Talking about the unbound config, there are two zones by default below the config showed that are disabled, which is the purpose of these zones and do I have to enable them?

######################################################################################

To know if unbound was working properly, I typed the command 'unbound -v' and the command shows this:

[1610821318] unbound[7523:0] notice: Start of unbound 1.11.0.
[1610821318] unbound[7523:0] error: can't bind socket: Address in use for 0.0.0.0 port 8953
[1610821318] unbound[7523:0] error: cannot open control interface 0.0.0.0 8953
[1610821318] unbound[7523:0] fatal error: could not open ports

I've searched info about this port, and I've found that is "unbound dns nameserver control", I suppose that if unbound tells me that there is an error, I've to solve it, but I'm not sure if this is related with my setup, the use of this port is for other available advanced option or how to solve it.

######################################################################################

Well, until here hehehe, apologies for my english, I hope than you can understand me without problems, and one more time, thank you so much for your useful and incredible tutorials.

Kind regards.

EDIT: When the process finished (last step of the tutorial), a server key was generated and at the screen appeared a message telling me that if I want to use it, I had to enable it at the config file, which is the purpose of this?

EDIT2: I forgot it, why install odhcpd package if we don't use it for dhcp, can I uninstall it?

hi, I have implemented this successfully previously, but it broke when trying to add further configuration. Now I have tried to go through this guide a number of times, but I cannot get this back to where I was and working again. Does anyone have any idea how I might go about troubleshooting? Thanks

Dear AGS13,
Hello and I hope that you are both safe and well. Read here for the solution :
DNSPRIVACY FOR ALL -especially read the solution to fixing the entire setup here : UNBOUND SOLUTION - hope this helps - By the way - in the new updated tutorial - I included detailed setup videos here DNSPRIVACY FOR ALL REDEUX - that should fix your issues - just read carefully
Peace

1 Like

Thanks for your reply directnupe. I will follow the new updated tutorial and take any issues I may have on that thread there. Appreciate your efforts

1 Like