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 address-of-your-server。重启 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"