dnscrypt-proxy
dnscrypt-proxy 是一个 DNS 代理客户端,支持加密 DNS 协议 DNS over HTTPS 和 DNSCrypt,可以用于防止中间人攻击和窃听。dnscrypt-proxy 也兼容 DNSSEC。
安装
安装 dnscrypt-proxy 软件包。
配置
默认配置文件位于 /etc/dnscrypt-proxy/dnscrypt-proxy.toml
。
启动
该服务可以通过两种互斥的方式启动(即,两种方式中只能启用一种)
- 使用 systemd 服务
dnscrypt-proxy.service
。- 使用服务时,必须在配置文件中配置
listen_addresses
选项(例如listen_addresses = ['127.0.0.1:53', '[::1]:53']
)。
- 使用服务时,必须在配置文件中配置
- 通过套接字激活使用
dnscrypt-proxy.socket
。listen_addresses
选项必须在配置文件中设置为空(即listen_addresses = [ ]
),因为 systemd 负责套接字配置。
选择解析器
通过在配置文件中注释掉 server_names
,dnscrypt-proxy 将从 [sources]
下已配置的源中选择最快的服务器 [3]。列表将被下载、验证和自动更新 [4]。因此,配置特定的服务器集是可选的。
要手动设置使用的服务器,请取消注释配置文件中的 server_names
变量,并选择一个或多个服务器。例如,要使用 Cloudflare 的服务器
server_names = ['cloudflare', 'cloudflare-ipv6']
完整的解析器列表位于 上游页面 或 Github。如果 dnscrypt-proxy 之前已在系统上成功运行,则 /var/cache/dnscrypt-proxy/public-resolvers.md
也将包含列表。查看服务器的描述,注意哪些服务器验证 DNSSEC、不记录日志且未审查。这些要求可以使用 require_dnssec
、require_nolog
、require_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 的任何服务
要查看是否有任何程序正在使用端口 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 正在工作,否则说明有问题。
技巧与诀窍
启用、下载和自动更新过滤器列表/阻止列表
在 /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 缓存配置
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.conf
中 server
部分的末尾
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@53
和 access-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
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"