Encrypted DNS: Difference between revisions
Blocklist for DNSCrypt with Flake |
m Category:DNS added |
||
(4 intermediate revisions by 3 users not shown) | |||
Line 3: | Line 3: | ||
'''Encrypted DNS''' protocols aim to address this hole by encrypting queries and responses in transit between DNS resolvers and clients; the most widely deployed ones are [[wikipedia:DNS over HTTPS|DNS over HTTPS]] (DoH), [[wikipedia:DNS over TLS|DNS over TLS]] (DoT), and [https://dnscrypt.info/ DNSCrypt]. | '''Encrypted DNS''' protocols aim to address this hole by encrypting queries and responses in transit between DNS resolvers and clients; the most widely deployed ones are [[wikipedia:DNS over HTTPS|DNS over HTTPS]] (DoH), [[wikipedia:DNS over TLS|DNS over TLS]] (DoT), and [https://dnscrypt.info/ DNSCrypt]. | ||
NixOS has modules for multiple encrypted DNS proxies, including [https://github.com/DNSCrypt/dnscrypt-proxy dnscrypt-proxy 2] and [https://dnsprivacy.org/wiki/display/DP/DNS+Privacy+Daemon+-+Stubby Stubby]. <code>services.dnscrypt-proxy2</code> is generally recommended, as it has the widest protocol and feature support, and is written in a memory-safe language. | NixOS has modules for multiple encrypted DNS proxies, including [https://github.com/DNSCrypt/dnscrypt-proxy dnscrypt-proxy 2], [https://github.com/AdguardTeam/dnsproxy dnsproxy] and [https://dnsprivacy.org/wiki/display/DP/DNS+Privacy+Daemon+-+Stubby Stubby]. <code>services.dnscrypt-proxy2</code> is generally recommended, as it has the widest protocol and feature support, and is written in a memory-safe language. For DNS over TLS (DoT) support, <code>services.dnsproxy</code> can be used. Detailed comparison of DNS proxies can be found on [https://wiki.archlinux.org/title/Domain_name_resolution#DNS_servers ArchLinux Wiki]. | ||
== Setting nameservers == | == Setting nameservers == | ||
Line 49: | Line 49: | ||
# Use servers reachable over IPv6 -- Do not enable if you don't have IPv6 connectivity | # Use servers reachable over IPv6 -- Do not enable if you don't have IPv6 connectivity | ||
ipv6_servers = | ipv6_servers = hasIPv6Internet; | ||
block_ipv6 = ! ( | block_ipv6 = ! (hasIPv6Internet); | ||
require_dnssec = true; | require_dnssec = true; | ||
Line 70: | Line 70: | ||
See [https://github.com/DNSCrypt/dnscrypt-proxy/blob/master/dnscrypt-proxy/example-dnscrypt-proxy.toml the upstream example configuration file] for more configuration options. | See [https://github.com/DNSCrypt/dnscrypt-proxy/blob/master/dnscrypt-proxy/example-dnscrypt-proxy.toml the upstream example configuration file] for more configuration options. | ||
=== Blocklist === | |||
Fetch a blocklist file (e.g. oisd) as a flake input:<syntaxhighlight lang="nix"> | |||
# flake.nix | # flake.nix | ||
Line 76: | Line 78: | ||
inputs = { | inputs = { | ||
oisd = { | oisd = { | ||
url = " | url = "https://big.oisd.nl/domainswild"; | ||
flake = false; | flake = false; | ||
}; | }; | ||
Line 92: | Line 94: | ||
{ config, lib, pkgs, inputs, ... }: | { config, lib, pkgs, inputs, ... }: | ||
let | let | ||
blocklist_base = builtins.readFile | blocklist_base = builtins.readFile inputs.oisd; | ||
extraBlocklist = ''''; | extraBlocklist = ''''; | ||
blocklist_txt = pkgs.writeText "blocklist.txt" '' | blocklist_txt = pkgs.writeText "blocklist.txt" '' | ||
Line 152: | Line 154: | ||
Note that you can still access the other DNS server locally through the non-loopback interface (e.g. by using your server's external IP). | Note that you can still access the other DNS server locally through the non-loopback interface (e.g. by using your server's external IP). | ||
== dnsproxy == | |||
dnsproxy is a simple DNS proxy server with the widest protocol support. | |||
=== Example configuration === | |||
<syntaxhighlight lang="nix"> | |||
{ | |||
services.dnsproxy = { | |||
enable = true; | |||
settings = { | |||
# Plain DNS upstream | |||
upstream = [ "1.1.1.1:53" ]; | |||
# DNS over TLS upstream | |||
upstream = [ "tls://dns.adguard.com" ]; | |||
# DNS over HTTPS upstream | |||
upstream = [ "https://dns.adguard.com/dns-query" ]; | |||
listen-addrs = [ "0.0.0.0" ]; | |||
# Plain DNS server | |||
listen-ports = [ 53 ]; | |||
# DNS over TLS server | |||
tls-port = [ 853 ]; | |||
# DNS over HTTPS server | |||
https-port = [ 443 ]; | |||
# Certificate for encrypted DNS server | |||
tls-crt = "/var/lib/acme/example.org/fullchain.pem"; | |||
tls-key = "/var/lib/acme/example.org/key.pem"; | |||
}; | |||
# Additional launch flags | |||
flags = [ "--verbose" ]; | |||
}; | |||
} | |||
</syntaxhighlight> | |||
== Stubby == | == Stubby == | ||
Line 192: | Line 227: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
[[Category: Networking]] | [[Category:Networking]] | ||
[[Category:DNS]] |