dnscrypt-proxy

来自 ArchWiki
(重定向自 DNSCrypt

此文章或章节需要扩充。

原因:dnscrypt-wrapper 有什么区别?(在 Talk:Dnscrypt-proxy 中讨论)

dnscrypt-proxy 是一个 DNS 代理客户端,支持加密 DNS 协议 DNS over HTTPSDNSCrypt,可以用于防止中间人攻击和窃听。dnscrypt-proxy 也兼容 DNSSEC

安装

安装 dnscrypt-proxy 软件包。

配置

默认配置文件位于 /etc/dnscrypt-proxy/dnscrypt-proxy.toml

提示: 虽然 dnscrypt-proxy 目前没有手册,但该项目维护了一个广泛的 配置 wiki

启动

注意: 即使有两种启动代理的方法,上游仍然推荐使用 service 方式。[1][2]

该服务可以通过两种互斥的方式启动(即,两种方式中只能启用一种)

  1. 使用 systemd 服务 dnscrypt-proxy.service
    • 使用服务时,必须在配置文件中配置 listen_addresses 选项(例如 listen_addresses = ['127.0.0.1:53', '[::1]:53'])。
  2. 通过套接字激活使用 dnscrypt-proxy.socket
    • listen_addresses 选项必须在配置文件中设置为空(即 listen_addresses = [ ]),因为 systemd 负责套接字配置。

选择解析器

通过在配置文件中注释掉 server_namesdnscrypt-proxy 将从 [sources] 下已配置的源中选择最快的服务器 [3]。列表将被下载、验证和自动更新 [4]。因此,配置特定的服务器集是可选的。

要手动设置使用的服务器,请取消注释配置文件中的 server_names 变量,并选择一个或多个服务器。例如,要使用 Cloudflare 的服务器

server_names = ['cloudflare', 'cloudflare-ipv6']

完整的解析器列表位于 上游页面Github。如果 dnscrypt-proxy 之前已在系统上成功运行,则 /var/cache/dnscrypt-proxy/public-resolvers.md 也将包含列表。查看服务器的描述,注意哪些服务器验证 DNSSEC、不记录日志且未审查。这些要求可以使用 require_dnssecrequire_nologrequire_nofilter 选项全局配置。

修改 resolv.conf 并协调其他本地域名解析器

修改 resolv.conf 文件,并将当前的解析器地址集替换为 localhost 的地址和选项[5]

/etc/resolv.conf
nameserver ::1
nameserver 127.0.0.1
options edns0

接下来,必须配置正在进行域名解析的现有服务,以防止覆盖设置。有关详细信息,请参阅 resolv.conf#覆盖 /etc/resolv.conf。如果它们配置为绑定到与 localhost 不同的地址并将 DNS 请求转发到 localhost 端口 53,则可以使用它们。例如,systemd-resolved 默认使用地址 127.0.0.53

禁用绑定到端口 53 的任何服务

提示: 如果使用 #Unbound 作为本地 DNS 缓存,则可以忽略此部分,因为 unbound 默认在端口 53 上运行。

要查看是否有任何程序正在使用端口 53,请运行

 $ ss -lp 'sport = :domain'

如果输出包含多于第一行列标题的内容,则需要禁用任何正在使用端口 53 的服务。例如,NetworkManager 可能会尝试自动激活解析器,但其他网络管理器可能具有类似的组件。一旦上述命令输出的内容仅包含以下行,您就可以继续操作

 Netid               State                 Recv-Q                Send-Q                                 Local Address:Port                                   Peer Address:Port

启动 systemd 服务

最后,启动/启用 dnscrypt-proxy.service 单元或 dnscrypt-proxy.socket,具体取决于您上面选择的方法。

检查 dnscrypt-proxy 是否工作

打开浏览器并访问 DnsLeakTest 并进行扩展测试,如果结果显示您在配置文件中设置的服务器,则表示 dnscrypt-proxy 正在工作,否则说明有问题。

技巧与诀窍

启用、下载和自动更新过滤器列表/阻止列表

此文章或章节正在考虑移除。

原因: 覆盖 dnscrypt-proxy 软件包拥有的 /usr/share/dnscrypt-proxy/utils/generate-domains-blocklist/ 中的文件不是一个好主意。(在 Talk:Dnscrypt-proxy#automatic blocklist updates 中讨论)

在 /usr/share/dnscrypt-proxy/utils/generate-domains-blocklist/domains-blocklist.conf 中配置过滤器列表源。例如

# NextDNS CNAME cloaking list
https://raw.githubusercontent.com/nextdns/cname-cloaking-blocklist/master/domains
# AdGuard Simplified Domain Names filter
https://adguardteam.github.io/AdGuardSDNSFilter/Filters/filter.txt
# OISD.NL Big:
https://big.oisd.nl/domainswild
# HaGeZi Multi Pro
https://raw.githubusercontent.com/hagezi/dns-blocklists/main/wildcard/pro-onlydomains.txt
# HaGeZi Thread Intelligence Feeds
https://raw.githubusercontent.com/hagezi/dns-blocklists/main/wildcard/tif-onlydomains.txt

创建一个服务来下载和合并过滤器列表。/etc/systemd/system/dnscrypt-filterlist-update.service

[Unit]
Description=DNSCrypt Filterlist Update

[Service]
Type=oneshot
User=root
WorkingDirectory=/usr/share/dnscrypt-proxy/utils/generate-domains-blocklist/
ExecStart=generate-domains-blocklist -a domains-allowlist.txt -o blocklist.txt ; sleep 2 ; systemctl restart dnscrypt-proxy.service

[Install]
WantedBy=multi-user.target

创建一个定时器以在启动时以及每 5 小时运行一次。/etc/systemd/system/dnscrypt-filterlist-update.timer

[Unit]
Description=Run 15min after boot and every 5 hours (DNSCrypt Filterlist Update)

[Timer]
OnBootSec=15min
OnUnitActiveSec=5h

[Install]
WantedBy=timers.target

启用定时器

systemctl daemon-reload
systemctl enable dnscrypt-filterlist-update.timer

配置 DNSCrypt 以应用创建的过滤器规则。/etc/dnscrypt-proxy/dnscrypt-proxy.toml

blocked_names_file = '/usr/share/dnscrypt-proxy/utils/generate-domains-blocklist/blocklist.txt'
log_file = '/var/log/dnscrypt-proxy/blocked-names.log'

本地 DNS 缓存配置

提示: dnscrypt-proxy 可以缓存条目,而无需依赖其他程序。此功能默认启用,配置文件中的行为 cache = true

如果未使用 dnscrypt-proxy 的缓存功能,建议将 dnscrypt-proxy 作为本地 DNS 缓存的转发器运行;否则,每个查询都会往返上游解析器。任何本地 DNS 缓存程序都应该可以工作。除了设置 dnscrypt-proxy 之外,您还必须设置本地 DNS 缓存程序。

更改端口

为了从本地 DNS 缓存转发查询,dnscrypt-proxy 应该监听与默认端口 53 不同的端口,因为 DNS 缓存本身需要监听 53 端口,并查询 dnscrypt-proxy 的不同端口。端口号 53000 在本节中用作示例。在此示例中,端口号大于 1024,因此 dnscrypt-proxy 不需要以 root 身份运行。

有两种更改默认端口的方法

套接字方法

编辑 具有以下内容的 dnscrypt-proxy.socket

[Socket]
ListenStream=
ListenDatagram=
ListenStream=127.0.0.1:53000
ListenStream=[::1]:53000
ListenDatagram=127.0.0.1:53000
ListenDatagram=[::1]:53000

当查询从本地 DNS 缓存转发到 53000 时,dnscrypt-proxy.socket 将启动 dnscrypt-proxy.service

服务方法

使用以下内容编辑 /etc/dnscrypt-proxy/dnscrypt-proxy.toml 中的 listen_addresses 选项

listen_addresses = ['127.0.0.1:53000', '[::1]:53000']

本地 DNS 缓存配置示例

以下配置应该可以与 dnscrypt-proxy 一起使用,并假设它正在监听端口 53000

Unbound

根据您的喜好配置 Unbound(特别是,请参阅 Unbound#本地 DNS 服务器),并将以下行添加到 /etc/unbound/unbound.confserver 部分的末尾

  do-not-query-localhost: no
forward-zone:
  name: "."
  forward-addr: ::1@53000
  forward-addr: 127.0.0.1@53000
提示: 如果您正在设置服务器,请在 server: 部分内添加 interface: 0.0.0.0@53access-control: your-network/subnet-mask allow,以便其他计算机可以连接到服务器。客户端必须在 /etc/resolv.conf 中配置 nameserver 服务器地址

重启 unbound.service 以应用更改。

dnsmasq

将 dnsmasq 配置为 本地 DNS 缓存。与 dnscrypt-proxy 配合使用的基本配置

/etc/dnsmasq.conf
no-resolv
server=::1#53000
server=127.0.0.1#53000
listen-address=::1,127.0.0.1

如果您配置 dnscrypt-proxy 以使用启用 DNSSEC 验证的解析器,请确保也在 dnsmasq 中启用它

/etc/dnsmasq.conf
conf-file=/usr/share/dnsmasq/trust-anchors.conf
dnssec

重启 dnsmasq.service 以应用更改。

pdnsd

安装 pdnsd。与 dnscrypt-proxy 配合使用的基本配置是

/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";
}

重启 pdnsd.service 以应用更改。

启用 EDNS0

此文章或章节需要扩充。

原因: 说明启用此功能的优点/动机。(在 Talk:Dnscrypt-proxy 中讨论)

DNS 扩展机制,除其他外,允许客户端指定通过 UDP 可以接收的最大回复大小。

将以下行添加到您的 /etc/resolv.conf

options edns0

测试 EDNS0

使用 DNS 回复大小测试服务器,使用 drill 命令行工具为名称 rs.dns-oarc.net 发出 TXT 查询

$ drill rs.dns-oarc.net TXT

在支持 EDNS0 的情况下,输出的“answer section”应类似于以下内容

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"