一、配置 dsncrypt-proxy 本身

1.打开 dnscrypt-proxy 的配置文件样本 /usr/share/doc/dnscrypt-proxy/example/example-dnscrypt-proxy.toml,按照它编写实际起作用的配置文件 /etc/dnscrypt-proxy/dnscrypt-proxy.toml

建议添加的配置有:

dnscrypt_servers = true

require_dnssec = true

dnscrypt_ephemeral_keys = true

fallback_resolver = '8.8.8.8:53'

ignore_system_dns = true

配置文件中原有的listen_addresses = []建议空置,server_names = ['cloudflare']一行建议注释掉(在这一行的开头位置加上“#”),以上建议添加的配置项可写在原有的listen_addresses = []server_names = ['cloudflare'] 下方。

2.重新启动 dnscrypt-proxy:# systemctl restart dnscrypt-proxy,通过查看# journalctl -u dnscrypt-proxy的输出确认 dnscrypt-proxy 能够正常工作,否则请检查其配置文件。

  1. 安装 resolvconf ( # apt install resolvconf ),使 dns 解析器仅向 dnscrypt-proxy 所监听的 127.0.2.1:53 请求域名解析。

二、配置 dhcp(过时

注意:此部分内容均过时,不再作为配置步骤,仅保留作为参考。isc-dhcp-client (dhclient) 即将淘汰,且随着 dnscrypt-proxy 软件本体功能的完善。原本需要借助 dhclient 实现的使 dns 解析器仅向 dnscrypt-proxy 所监听的 127.0.2.1:53 请求域名解析的功能,仅需安装 resolvconf 和 dnscrypt-proxy 就已可实现,现无需安装和配置 dhclient 。

0.安装 isc-dhcp-client ( # apt install isc-dhcp-client );

提示:Network Manager 和 wicd 都是网络管理器,用途相同,基本不会同时出现在同一个系统环境中。

用户使用 Network Manager 的情况下的配置方法

1.向 /etc/NetworkManager/conf.d/15-dhcp.conf 写入如下内容(使 Network Manager 通过 dhclient 获取 dns 服务器相关信息,而非自行获取):

[main]

dhcp=dhclient

2.向 /etc/dhcp/dhclient.conf 添加选项

prepend domain-name-servers 127.0.2.1;

注意:“;”不可省略且必须为英文标准写法

3.重新启动 Network Manager (# systemctl restart NetworkManager

用户使用 wicd 的情况下的配置方法

向 wicd 的 dhcp 客户端配置模板 /etc/wicd/dhclient.conf.template 中加入选项

prepend domain-name-servers 127.0.2.1;”

提示:wicd 不使用 /etc/dhcp/dhclient.conf,而是基于模板临时生成配置文件

重新启动 wicd (# systemctl restart wicd),如果 /etc/resolv.conf 中除nameserver 127.0.2.1外没有其他 dns 服务器项目,则说明配置成功。

三、利用 dnscrypt-proxy 提供的本地 DNS over HTTPS 服务器

dnscrypt-proxy 可以加密 dns 请求本身,但 tls 协议仍然有一丝缺憾:由同一台服务器同时为多个域名提供服务是很常见的事情,但因为不同的域名会使用不同的 tls 证书,就需要一个机制 (SNI)在 tls 会话完全建立之前就让服务器知道客户端要访问哪个域名,因此按照标准 SNI 是明文传输的,由此暴露了客户端想要访问的域名。而后 cloudflare 等厂商开始提出对 SNI 字段加密的 ESNI/ECH 草案标准。firefox 支持这个标准,但仅可在 firefox 通过 DNS Over HTTPS 获取域名时方能起用。过去 dnscrypt-proxy 在本地表现为一个标准的明文 DNS,因此 firefox 通过它获取域名时不能启用 ESNI/ECH;而最近的 dnscrypt-proxy (自 2.0.34 版始)增加了在本地表现为 DNS Over HTTPS 服务器的功能,使得 firefox 配合 dnscrypt-proxy 使用时仍然可以启用 ESNI/ECH (只要服务器支持)进一步提高私密性。

1.生成所需的 localhost.pem 数字证书文件。

为 dnscrypt-proxy 生成一个用于 doh 服务的 localhost.pem 并让该文件能被 dnscrypt-proxy 利用。首先需要保证以下操作均在在用户目录下进行。

提示:可以找一个用户目录下容易记住的子目录进行操作。

调用命令:

$ openssl req -x509 -nodes -newkey rsa:2048 -days 5000 -sha256 -keyout localhost.pem -out localhost.pem

生成一个 localhost.pem 文件,然后弹出一些要求,这些要求均可以选择默认,回车即可。该命令能让生成的 localhost.pem 文件导出到当前所在的目录。

使用 root 权限将该文件复制到 /etc/dnscrypt-proxy 目录下,并配置所需的所有者和用户读写权限:

# cp localhost.pem /etc/dnscrypt-proxy

# chown root:root /etc/dnscrypt-proxy/localhost.pem

# chmod 644 /etc/dnscrypt-proxy/localhost.pem

2.在 dnscrypt-proxy 的配置文件 ( /etc/dnscrypt-proxy/dnscrypt-proxy.toml )中添加如下内容:

doh_servers = true

[local_doh]

listen_addresses = ['127.0.0.1:3000']

path = "/dns-query"

cert_file = "localhost.pem"

cert\_key\_file = "localhost.pem"

以上内容是 dnscrypt-proxy 的 doh 的相关配置内容,其中 [local_doh] 需要与其他内容保持一定的空行,与 [local_doh] 有关的项目都需要放在 [local_doh] 下,项目和项目之间不空行。 [local_doh] 和其他章节都包含哪些内容,可参考配置参考文件( /usr/share/doc/dnscrypt-proxy/examples/example-dnscrypt-proxy.toml )。

注意:doh_servers = true 不是 [local_doh] 下的项目,不能放在 [local_doh] 下。

然后输入# systemctl restart dnscrypt-proxy重启 dnscrypt-proxy 。稍等几分钟待 dnscrypt-proxy 完全启动后,输入# journalctl -u dnscrypt-proxy查看 dnscrypt-proxy 是否能正常运行。如果不能正常运行,请检查上述操作过程中是否存在问题。

3.配置 firefox 浏览器的 doh 服务。在 firefox 浏览器的地址输入框内键入about:config,选择“确认风险并继续”后,在“搜索首选项名称”框内键入trr,然后,

  • network.trr.custom_urinetwork.trr.uri的值改为https://127.0.0.1:3000/dns-query
  • network.trr.mode的值改为23
  • network.dns.echconfig.enabled的值改为true
  • network.dns.use_https_rr_as_altsvc的值改为true
  • network.security.esni.enabled的值改为true

之后重启 firefox 浏览器。

4.重启后,在地址框键入https://localhost:3000/dns-query,并将此“站”使用的证书添加为例外,方可正常使用 dnscrypt-proxy 提供的 DNS Over HTTPS 服务器以获取域名。

提示:也可参考英文教程:https://github.com/DNSCrypt/dnscrypt-proxy/wiki/Local-DoH 。这个 wiki 遗漏了一步:因为证书是自己随便生成的自签名证书,所以最后需要用 firefox 手动访问一下https://localhost:3000/dns-query并将此“站”使用的证书添加为例外,方可正常使用 dnscrypt-proxy 提供的 DNS Over HTTPS 服务器以获取域名(该步骤已在上述教程中描述)。

详细配置方法可参考此文

成功抵御住 DNS 污染后便可访问https://duckduckgo.com/,以及一系列仅受到 DNS 污染的网站。

四、配置匿名 dns 中继(Anonymized DNS Relay)

DNS 加密可以防止中间人记录和篡改 DNS 流量,但是用户和 DNS 解析器之间的通信行为依然能被第三方监视到,DNS 解析器也能获知用户的真实 IP。为了将通信 IP 匿名化,可以配置匿名 DNS 中继(Anonymized DNS Relay)。就像 tor 网络通过中继节点那样,匿名 DNS 解析器中继直接联系 DNS 解析器,而用户直接联系匿名 DNS 中继,匿名 DNS 中继虽然知道用户的真实 IP ,但是不知道用户的具体要求的 DNS 解析请求,只负责转发用户的加密 DNS 请求;真实的 DNS 解析器依然负责解析用户的 DNS 解析请求,但与它们直接通信的是匿名 DNS 中继,并不知道用户的真实 IP。dnscrypt-proxy 可以通过软件配置来让用户实现匿名 dns 中继功能。

将 anonymized dns 的有关配置内容:

[anonymized_dns]
  routes = [ { server_name='*', via=['*'] } ]

插入 dnscyrpt-proxy 的配置文件/etc/dnscrypt-proxy/dnscrypt-proxy.toml(置于全局配置与[local_doh]之间即可)。

然后修改配置文件中的[sources],将其替换为:

[sources]
  [sources.'public-resolvers']
  urls = ['https://raw.githubusercontent.com/DNSCrypt/dnscrypt-resolvers/master/v3/public-resolvers.md', 'https://download.dnscrypt.info/resolvers-list/v3/public-resolvers.md', 'https://ipv6.download.dnscrypt.info/resolvers-list/v3/public-resolvers.md', 'https://download.dnscrypt.net/resolvers-list/v3/public-resolvers.md']
  cache_file = '/var/cache/dnscrypt-proxy/public-resolvers.md'
  minisign_key = 'RWQf6LRCGA9i53mlYecO4IzT51TGPpvWucNSCh1CBM0QTaLn73Y7GFO3'
  refresh_delay = 72
  prefix = ''

  [sources.'relays']
  urls = ['https://raw.githubusercontent.com/DNSCrypt/dnscrypt-resolvers/master/v3/relays.md', 'https://download.dnscrypt.info/resolvers-list/v3/relays.md', 'https://ipv6.download.dnscrypt.info/resolvers-list/v3/relays.md', 'https://download.dnscrypt.net/resolvers-list/v3/relays.md']
  cache_file = '/var/cache/dnscrypt-proxy/relays.md'
  minisign_key = 'RWQf6LRCGA9i53mlYecO4IzT51TGPpvWucNSCh1CBM0QTaLn73Y7GFO3'
  refresh_delay = 72
  prefix = ''

以保证能和中继节点正常通信。

最后,重新启动 dnscrypt-proxy:# systemctl restart dnscrypt-proxy,通过查看# journalctl -u dnscrypt-proxy的输出确认 dnscrypt-proxy 能够正常工作,否则请检查其配置文件。

提示:本节可参考https://github.com/DNSCrypt/dnscrypt-proxy/wiki/Anonymized-DNS