Difference between revisions of "Dnscrypt-proxy"
Wincraft71 (talk | contribs) m (→Modify resolv.conf: options) |
(→Disable any services bound to port 53: style; flag with Template:Accuracy) |
||
(58 intermediate revisions by 11 users not shown) | |||
Line 1: | Line 1: | ||
+ | {{Lowercase title}} | ||
[[Category:Domain Name System]] | [[Category:Domain Name System]] | ||
[[Category:Encryption]] | [[Category:Encryption]] | ||
− | [[es: | + | [[es:Dnscrypt-proxy]] |
[[ja:DNSCrypt]] | [[ja:DNSCrypt]] | ||
− | [[pt: | + | [[pt:Dnscrypt-proxy]] |
[[zh-hans:DNSCrypt]] | [[zh-hans:DNSCrypt]] | ||
+ | {{Related articles start}} | ||
+ | {{Related|Domain name resolution}} | ||
+ | {{Related articles end}} | ||
− | [ | + | {{Expansion|What is the difference to {{Pkg|dnscrypt-wrapper}}?}} |
+ | |||
+ | [https://github.com/jedisct1/dnscrypt-proxy dnscrypt-proxy] is a DNS proxy with support for the encrypted DNS protocols [[Wikipedia:DNS over HTTPS|DNS over HTTPS]] and [https://dnscrypt.info/ DNSCrypt], which can be used to prevent man-in-the-middle attacks and eavesdropping. ''dnscrypt-proxy'' is also compatible with [[DNSSEC]]. | ||
== Installation == | == Installation == | ||
Line 14: | Line 20: | ||
== Configuration == | == Configuration == | ||
− | {{Note| | + | === Startup === |
+ | |||
+ | The service can be started in two mutually exclusive ways (i.e. only one of the two may be enabled): | ||
+ | |||
+ | * With the {{ic|.service}} file. | ||
+ | |||
+ | {{Note|The {{ic|listen_addresses}} option must be configured (e.g. {{ic|1=listen_addresses = ['127.0.0.1:53', '[::1]:53']}}) in the configuration file when using the {{ic|.service}} file.}} | ||
− | + | * Through the {{ic|.socket}} activation. | |
+ | |||
+ | {{Note|When using socket activation the {{ic|listen_addresses}} option must be set to empty (i.e. {{ic|1=listen_addresses = [ ]}}) in the configuration file, since systemd is taking care of the socket configuration.}} | ||
=== Select resolver === | === Select resolver === | ||
− | |||
− | + | By leaving {{ic|server_names}} commented out in the configuration file {{ic|/etc/dnscrypt-proxy/dnscrypt-proxy.toml}}, ''dnscrypt-proxy'' will choose the fastest server from the sources already configured under {{ic|[sources]}} [https://github.com/jedisct1/dnscrypt-proxy/wiki/Configuration#an-example-static-server-entry]. The lists will be downloaded, verified, and automatically updated [https://github.com/jedisct1/dnscrypt-proxy/wiki/Configuration-Sources#what-is-the-point-of-these-lists]. Thus, configuring a specific set of servers is optional. | |
+ | |||
+ | To manually set which server is used, edit {{ic|/etc/dnscrypt-proxy/dnscrypt-proxy.toml}} and uncomment the {{ic|server_names}} variable, selecting one or more of the servers. For example, to use Cloudflare's servers: | ||
server_names = ['cloudflare', 'cloudflare-ipv6'] | server_names = ['cloudflare', 'cloudflare-ipv6'] | ||
− | + | A full list of resolvers is located at the [https://download.dnscrypt.info/resolvers-list/v2/public-resolvers.md upstream page] or [https://raw.githubusercontent.com/DNSCrypt/dnscrypt-resolvers/master/v2/public-resolvers.md Github]. If ''dnscrypt-proxy'' has run successfully on the system before, {{ic|/var/cache/dnscrypt-proxy/public-resolvers.md}} will also contain a list. Look at the description for servers note which validate [[DNSSEC]], do not log, and are uncensored. These requirements can be configured globally with the {{ic|require_dnssec}}, {{ic|require_nolog}}, {{ic|require_nofilter}} options. | |
− | |||
− | |||
=== Disable any services bound to port 53 === | === Disable any services bound to port 53 === | ||
+ | |||
{{Tip|If using [[#Unbound]] as your local DNS cache this section can be ignored, as ''unbound'' runs on port 53 by default.}} | {{Tip|If using [[#Unbound]] as your local DNS cache this section can be ignored, as ''unbound'' runs on port 53 by default.}} | ||
− | To see if any programs are using port 53, run | + | |
+ | To see if any programs are using port 53, run: | ||
$ ss -lp 'sport = :domain' | $ ss -lp 'sport = :domain' | ||
− | If the output contains more than the first line of column names, you need to disable whatever service is using port 53. One common culprit is {{ic|systemd-resolved.service}}, but other network managers may have analogous components. You are ready to proceed once the above command outputs nothing more than the following line: | + | {{Accuracy|systemd-resolved listens on 127.0.0.53:53, it should not affect dnscrypt-proxy that listens on 127.0.0.1:53.}} |
+ | |||
+ | If the output contains more than the first line of column names, you need to disable whatever service is using port 53. One common culprit is {{ic|systemd-resolved.service}}([[NetworkManager#Unit dbus-org.freedesktop.resolve1.service not found]]), but other network managers may have analogous components. You are ready to proceed once the above command outputs nothing more than the following line: | ||
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port | Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port | ||
=== Modify resolv.conf === | === Modify resolv.conf === | ||
+ | |||
+ | {{Expansion|Explain what the options mean.}} | ||
Modify the [[resolv.conf]] file and replace the current set of resolver addresses with the address for ''localhost'' and options [https://github.com/jedisct1/dnscrypt-proxy/wiki/Installation-linux#step-4-change-the-system-dns-settings]: | Modify the [[resolv.conf]] file and replace the current set of resolver addresses with the address for ''localhost'' and options [https://github.com/jedisct1/dnscrypt-proxy/wiki/Installation-linux#step-4-change-the-system-dns-settings]: | ||
+ | nameserver ::1 | ||
nameserver 127.0.0.1 | nameserver 127.0.0.1 | ||
options edns0 single-request-reopen | options edns0 single-request-reopen | ||
− | Other programs may overwrite this setting; see [[resolv.conf# | + | Other programs may overwrite this setting; see [[resolv.conf#Overwriting of /etc/resolv.conf]] for details. |
=== Start systemd service === | === Start systemd service === | ||
− | Finally, [[ | + | Finally, [[start/enable]] the {{ic|dnscrypt-proxy.service}} unit or {{ic|dnscrypt-proxy.socket}}, depending on which method you chose above. |
== Tips and tricks == | == Tips and tricks == | ||
Line 56: | Line 76: | ||
=== Local DNS cache configuration === | === Local DNS cache configuration === | ||
− | {{ | + | {{Tip|''dnscrypt-proxy'' can cache entries without relying on another program. This feature is enabled by default with the line {{ic|1=cache = true}} in your ''dnscrypt-proxy'' configuration file}} |
− | It is recommended to run | + | It is recommended to run ''dnscrypt-proxy'' as a forwarder for a local DNS cache if not using ''dnscrypt-proxy's'' cache feature; otherwise, every single query will make a round-trip to the upstream resolver. Any local DNS caching program should work. In addition to setting up ''dnscrypt-proxy'', you must setup your local DNS cache program. |
==== Change port ==== | ==== Change port ==== | ||
− | {{ | + | In order to forward queries from a local DNS cache, ''dnscrypt-proxy'' should listen on a port different from the default {{ic|53}}, since the DNS cache itself needs to listen on {{ic|53}} and query ''dnscrypt-proxy'' on a different port. Port number {{ic|53000}} is used as an example in this section. In this example, the port number is larger than 1024 so ''dnscrypt-proxy'' is not required to be run by root. |
− | + | There are two methods for changing the default port: | |
+ | |||
+ | '''Socket method''' | ||
+ | |||
+ | [[Edit]] {{ic|dnscrypt-proxy.socket}} with the following contents: | ||
[Socket] | [Socket] | ||
ListenStream= | ListenStream= | ||
ListenDatagram= | ListenDatagram= | ||
− | ListenStream=127.0.0.1: | + | ListenStream=127.0.0.1:53000 |
− | ListenDatagram=127.0.0.1: | + | ListenStream=[::1]:53000 |
+ | ListenDatagram=127.0.0.1:53000 | ||
+ | ListenDatagram=[::1]:53000 | ||
− | {{ | + | When queries are forwarded from the local DNS cache to {{ic|53000}}, {{ic|dnscrypt-proxy.socket}} will start {{ic|dnscrypt-proxy.service}}. |
− | + | '''Service method''' | |
− | The following configurations should work with ''dnscrypt-proxy'' and assume that it is listening on port {{ic| | + | Edit the {{ic|listen_addresses}} option in {{ic|/etc/dnscrypt-proxy/dnscrypt-proxy.toml}} with the following: |
+ | |||
+ | listen_addresses = ['127.0.0.1:53000', '[::1]:53000'] | ||
+ | |||
+ | ==== Example local DNS cache configurations ==== | ||
+ | |||
+ | The following configurations should work with ''dnscrypt-proxy'' and assume that it is listening on port {{ic|53000}}. | ||
===== Unbound ===== | ===== Unbound ===== | ||
Line 85: | Line 117: | ||
forward-zone: | forward-zone: | ||
name: "." | name: "." | ||
− | forward-addr: 127.0.0.1@ | + | forward-addr: ::1@53000 |
+ | forward-addr: 127.0.0.1@53000 | ||
{{Tip|If you are setting up a server, add {{ic|interface: 0.0.0.0@53}} and {{ic|access-control: ''your-network''/''subnet-mask'' allow}} inside the {{ic|server:}} section so that the other computers can connect to the server. A client must be configured with {{ic|nameserver ''address-of-your-server''}} in {{ic|/etc/resolv.conf}}.}} | {{Tip|If you are setting up a server, add {{ic|interface: 0.0.0.0@53}} and {{ic|access-control: ''your-network''/''subnet-mask'' allow}} inside the {{ic|server:}} section so that the other computers can connect to the server. A client must be configured with {{ic|nameserver ''address-of-your-server''}} in {{ic|/etc/resolv.conf}}.}} | ||
Line 93: | Line 126: | ||
===== dnsmasq ===== | ===== dnsmasq ===== | ||
− | Configure dnsmasq as a [[dnsmasq#DNS | + | Configure dnsmasq as a [[dnsmasq#DNS server|local DNS cache]]. The basic configuration to work with ''dnscrypt-proxy'': |
{{hc|/etc/dnsmasq.conf|2= | {{hc|/etc/dnsmasq.conf|2= | ||
no-resolv | no-resolv | ||
− | server=127.0.0.1# | + | server=::1#53000 |
− | listen-address=127.0.0.1 | + | server=127.0.0.1#53000 |
+ | listen-address=::1,127.0.0.1 | ||
}} | }} | ||
− | If you configured | + | If you configured ''dnscrypt-proxy'' to use a resolver with enabled [[DNSSEC]] validation, make sure to enable it also in dnsmasq: |
{{hc|/etc/dnsmasq.conf|2= | {{hc|/etc/dnsmasq.conf|2= | ||
− | + | conf-file=/usr/share/dnsmasq/trust-anchors.conf | |
+ | dnssec | ||
}} | }} | ||
Line 111: | Line 146: | ||
===== pdnsd ===== | ===== pdnsd ===== | ||
− | Install [[pdnsd]]. A basic configuration to work with | + | Install [[pdnsd]]. A basic configuration to work with ''dnscrypt-proxy'' is: |
{{hc|/etc/pdnsd.conf|2= | {{hc|/etc/pdnsd.conf|2= | ||
Line 131: | Line 166: | ||
label = "dnscrypt-proxy"; | label = "dnscrypt-proxy"; | ||
ip = 127.0.0.1; | ip = 127.0.0.1; | ||
− | port = | + | port = 53000; |
timeout = 4; | timeout = 4; | ||
proxy_only = on; | proxy_only = on; | ||
Line 149: | Line 184: | ||
[Service] | [Service] | ||
− | CapabilityBoundingSet=CAP_IPC_LOCK CAP_SETGID CAP_SETUID | + | CapabilityBoundingSet=CAP_IPC_LOCK CAP_SETGID CAP_SETUID CAP_NET_BIND_SERVICE |
ProtectSystem=strict | ProtectSystem=strict | ||
ProtectHome=true | ProtectHome=true | ||
Line 168: | Line 203: | ||
=== Enable EDNS0 === | === Enable EDNS0 === | ||
− | [[ | + | {{Expansion|Name the advantages/motivation for enabling this.}} |
+ | |||
+ | [[Wikipedia:Extension mechanisms for DNS|Extension Mechanisms for DNS]] that, among other things, allows a client to specify how large a reply over UDP can be. | ||
Add the following line to your {{ic|/etc/resolv.conf}}: | Add the following line to your {{ic|/etc/resolv.conf}}: | ||
+ | |||
options edns0 | options edns0 | ||
+ | |||
+ | {{Out of date|dnscrypt-proxy v2 uses different configuration file.}} | ||
You may also wish to append the following to {{ic|/etc/dnscrypt-proxy.conf}}: | You may also wish to append the following to {{ic|/etc/dnscrypt-proxy.conf}}: | ||
+ | |||
EDNSPayloadSize ''<bytes>'' | EDNSPayloadSize ''<bytes>'' | ||
Line 181: | Line 222: | ||
Make use of the [https://www.dns-oarc.net/oarc/services/replysizetest DNS Reply Size Test Server], use the ''drill'' command line tool to issue a TXT query for the name ''rs.dns-oarc.net'': | Make use of the [https://www.dns-oarc.net/oarc/services/replysizetest DNS Reply Size Test Server], use the ''drill'' command line tool to issue a TXT query for the name ''rs.dns-oarc.net'': | ||
+ | |||
$ drill rs.dns-oarc.net TXT | $ drill rs.dns-oarc.net TXT | ||
With '''EDNS0''' supported, the "answer section" of the output should look similar to this: | With '''EDNS0''' supported, the "answer section" of the output should look similar to this: | ||
+ | |||
rst.x3827.rs.dns-oarc.net. | rst.x3827.rs.dns-oarc.net. | ||
rst.x4049.x3827.rs.dns-oarc.net. | rst.x4049.x3827.rs.dns-oarc.net. | ||
Line 189: | Line 232: | ||
"2a00:d880:3:1::a6c1:2e89 DNS reply size limit is at least 4055 bytes" | "2a00:d880:3:1::a6c1:2e89 DNS reply size limit is at least 4055 bytes" | ||
"2a00:d880:3:1::a6c1:2e89 sent EDNS buffer size 4096" | "2a00:d880:3:1::a6c1:2e89 sent EDNS buffer size 4096" | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− |
Latest revision as of 08:13, 12 April 2019
dnscrypt-proxy is a DNS proxy with support for the encrypted DNS protocols DNS over HTTPS and DNSCrypt, which can be used to prevent man-in-the-middle attacks and eavesdropping. dnscrypt-proxy is also compatible with DNSSEC.
Installation
Install the dnscrypt-proxy package.
Configuration
Startup
The service can be started in two mutually exclusive ways (i.e. only one of the two may be enabled):
- With the
.service
file.
listen_addresses
option must be configured (e.g. listen_addresses = ['127.0.0.1:53', '[::1]:53']
) in the configuration file when using the .service
file.- Through the
.socket
activation.
listen_addresses
option must be set to empty (i.e. listen_addresses = [ ]
) in the configuration file, since systemd is taking care of the socket configuration.Select resolver
By leaving server_names
commented out in the configuration file /etc/dnscrypt-proxy/dnscrypt-proxy.toml
, dnscrypt-proxy will choose the fastest server from the sources already configured under [sources]
[1]. The lists will be downloaded, verified, and automatically updated [2]. Thus, configuring a specific set of servers is optional.
To manually set which server is used, edit /etc/dnscrypt-proxy/dnscrypt-proxy.toml
and uncomment the server_names
variable, selecting one or more of the servers. For example, to use Cloudflare's servers:
server_names = ['cloudflare', 'cloudflare-ipv6']
A full list of resolvers is located at the upstream page or Github. If dnscrypt-proxy has run successfully on the system before, /var/cache/dnscrypt-proxy/public-resolvers.md
will also contain a list. Look at the description for servers note which validate DNSSEC, do not log, and are uncensored. These requirements can be configured globally with the require_dnssec
, require_nolog
, require_nofilter
options.
Disable any services bound to port 53
To see if any programs are using port 53, run:
$ ss -lp 'sport = :domain'
If the output contains more than the first line of column names, you need to disable whatever service is using port 53. One common culprit is systemd-resolved.service
(NetworkManager#Unit dbus-org.freedesktop.resolve1.service not found), but other network managers may have analogous components. You are ready to proceed once the above command outputs nothing more than the following line:
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
Modify resolv.conf
Modify the resolv.conf file and replace the current set of resolver addresses with the address for localhost and options [3]:
nameserver ::1 nameserver 127.0.0.1 options edns0 single-request-reopen
Other programs may overwrite this setting; see resolv.conf#Overwriting of /etc/resolv.conf for details.
Start systemd service
Finally, start/enable the dnscrypt-proxy.service
unit or dnscrypt-proxy.socket
, depending on which method you chose above.
Tips and tricks
Local DNS cache configuration
cache = true
in your dnscrypt-proxy configuration fileIt is recommended to run dnscrypt-proxy as a forwarder for a local DNS cache if not using dnscrypt-proxy's cache feature; otherwise, every single query will make a round-trip to the upstream resolver. Any local DNS caching program should work. In addition to setting up dnscrypt-proxy, you must setup your local DNS cache program.
Change port
In order to forward queries from a local DNS cache, dnscrypt-proxy should listen on a port different from the default 53
, since the DNS cache itself needs to listen on 53
and query dnscrypt-proxy on a different port. Port number 53000
is used as an example in this section. In this example, the port number is larger than 1024 so dnscrypt-proxy is not required to be run by root.
There are two methods for changing the default port:
Socket method
Edit dnscrypt-proxy.socket
with the following contents:
[Socket] ListenStream= ListenDatagram= ListenStream=127.0.0.1:53000 ListenStream=[::1]:53000 ListenDatagram=127.0.0.1:53000 ListenDatagram=[::1]:53000
When queries are forwarded from the local DNS cache to 53000
, dnscrypt-proxy.socket
will start dnscrypt-proxy.service
.
Service method
Edit the listen_addresses
option in /etc/dnscrypt-proxy/dnscrypt-proxy.toml
with the following:
listen_addresses = ['127.0.0.1:53000', '[::1]:53000']
Example local DNS cache configurations
The following configurations should work with dnscrypt-proxy and assume that it is listening on port 53000
.
Unbound
Configure Unbound to your liking (in particular, see Unbound#Local DNS server) and add the following lines to the end of the server
section in /etc/unbound/unbound.conf
:
do-not-query-localhost: no forward-zone: name: "." forward-addr: ::1@53000 forward-addr: 127.0.0.1@53000
interface: 0.0.0.0@53
and access-control: your-network/subnet-mask allow
inside the server:
section so that the other computers can connect to the server. A client must be configured with nameserver address-of-your-server
in /etc/resolv.conf
.Restart unbound.service
to apply the changes.
dnsmasq
Configure dnsmasq as a local DNS cache. The basic configuration to work with dnscrypt-proxy:
/etc/dnsmasq.conf
no-resolv server=::1#53000 server=127.0.0.1#53000 listen-address=::1,127.0.0.1
If you configured dnscrypt-proxy to use a resolver with enabled DNSSEC validation, make sure to enable it also in dnsmasq:
/etc/dnsmasq.conf
conf-file=/usr/share/dnsmasq/trust-anchors.conf dnssec
Restart dnsmasq.service
to apply the changes.
pdnsd
Install pdnsd. A basic configuration to work with dnscrypt-proxy is:
/etc/pdnsd.conf
global { perm_cache = 1024; cache_dir = "/var/cache/pdnsd"; run_as = "pdnsd"; server_ip = 127.0.0.1; status_ctl = on; query_method = udp_tcp; min_ttl = 15m; # Retain cached entries at least 15 minutes. max_ttl = 1w; # One week. timeout = 10; # Global timeout option (10 seconds). neg_domain_pol = on; udpbufsize = 1024; # Upper limit on the size of UDP messages. } server { label = "dnscrypt-proxy"; ip = 127.0.0.1; port = 53000; timeout = 4; proxy_only = on; } source { owner = localhost; file = "/etc/hosts"; }
Restart pdnsd.service
to apply the changes.
Sandboxing
Edit dnscrypt-proxy.service
to include the following lines:
[Service] CapabilityBoundingSet=CAP_IPC_LOCK CAP_SETGID CAP_SETUID CAP_NET_BIND_SERVICE ProtectSystem=strict ProtectHome=true ProtectKernelTunables=true ProtectKernelModules=true ProtectControlGroups=true PrivateTmp=true PrivateDevices=true MemoryDenyWriteExecute=true NoNewPrivileges=true RestrictRealtime=true RestrictAddressFamilies=AF_INET AF_INET6 SystemCallArchitectures=native SystemCallFilter=~@clock @cpu-emulation @debug @keyring @ipc @module @mount @obsolete @raw-io
See systemd.exec(5) and Systemd#Sandboxing application environments for more information. Additionally see upstream comments[dead link 2018-01-08].
Enable EDNS0
Extension Mechanisms for DNS that, among other things, allows a client to specify how large a reply over UDP can be.
Add the following line to your /etc/resolv.conf
:
options edns0
You may also wish to append the following to /etc/dnscrypt-proxy.conf
:
EDNSPayloadSize <bytes>
Where <bytes> is a number, the default size being 1252, with values up to 4096 bytes being purportedly safe. A value below or equal to 512 bytes will disable this mechanism, unless a client sends a packet with an OPT section providing a payload size.
Test EDNS0
Make use of the DNS Reply Size Test Server, use the drill command line tool to issue a TXT query for the name rs.dns-oarc.net:
$ drill rs.dns-oarc.net TXT
With EDNS0 supported, the "answer section" of the output should look similar to this:
rst.x3827.rs.dns-oarc.net. rst.x4049.x3827.rs.dns-oarc.net. rst.x4055.x4049.x3827.rs.dns-oarc.net. "2a00:d880:3:1::a6c1:2e89 DNS reply size limit is at least 4055 bytes" "2a00:d880:3:1::a6c1:2e89 sent EDNS buffer size 4096"