配置dnscrypt-proxy加密DNS查询

默认分类 · 2024-04-08

某套线下环境网络不稳定,有dns劫持的问题,对业务影响比较大,需要配置dns加密来对抗劫持,DNS加密方案有 DNS over HTTPS(DoH)以及DNS over TLS(DoT)两种,dnsmasq似乎是不支持这两种方式的,所以需要装一个dnscrypt-proxy,将查询请求通过DoH/DoT发出,将查询结果返回给dnsmasq。

1.安装

yum install dnscrypt-proxy

2.配置

配置文件/etc/dnscrypt-proxy/dnscrypt-proxy.toml
修改dnscrypt-proxy监听的端口,因为53端口已经被dnsmasq占用,这里修改成5353

listen_addresses = ['127.0.0.1:5353']

来到sources这一块,把自带的远程源全部注释掉,不然每次启动都要到远程源下载可用服务器列表,影响启动速度,自带源又都放在github上,下不到就会启动失败,用自己配的自定义服务器就行,下面会写

[sources]

  ## An example of a remote source from https://github.com/DNSCrypt/dnscrypt-resolvers

  # [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 = ''

  ## Anonymized DNS relays

  # [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 = ''

来到最底下,加上自定义服务器,可用的服务器可以在这里找到List

[static]

  [static.'aliyun']
  stamp = 'sdns://AgAAAAAAAAAACTIyMy41LjUuNSCY49XlNq8pWM0vfxT3BO9KJ20l4zzWXy5l9eTycnwTMA5kbnMuYWxpZG5zLmNvbQovZG5zLXF1ZXJ5'

  [static.'txyun']
  stamp = 'sdns://AgAAAAAAAAAACjEuMTIuMTIuMTIgj0tzmXxLBOpQ_q-pGiQx1CvKa1TCO8-du_VyJJOU4QwHZG9oLnB1YgovZG5zLXF1ZXJ5'

来到这一块,配置使用自定义服务器

# server_names = ['scaleway-fr', 'google', 'yandex', 'cloudflare']
server_names = ['aliyun', 'txyun']

修改初始的dns,这个初始dns是用来解析DoH服务器的ip地址的,解析后就不再使用,配置文件里的注释有详细说明,这里不赘述了

# bootstrap_resolvers = ['9.9.9.9:53', '8.8.8.8:53']
bootstrap_resolvers = ['223.5.5.5:53', '114.114.114.114:53']

修改检测网络是否连通的地址,可以是任意ip的任意端口,哪怕没有响应,只要端口是打开的,就认为网络连通

# netprobe_address = '9.9.9.9:53'
netprobe_address = '223.5.5.5:53'

因为集群环境没有ipv6,顺便禁用ipv6的AAAA查询

# block_ipv6 = false
block_ipv6 = true

启用dns查询日志(可选)

[query_log]
  file = '/var/log/dnscrypt-proxy/query.log'

3.启动服务&测试

启动服务

systemctl start dnscrypt-proxy
systemctl enable dnscrypt-proxy

测试

dnscrypt-proxy -config /etc/dnscrypt-proxy/dnscrypt-proxy.toml -resolve baidu.com

打印出查询结果则服务正常

Resolving [baidu.com] using 127.0.0.1 port 5353

Resolver      : 116.253.27.4

Canonical name: baidu.com.

IPv4 addresses: 39.156.66.10, 110.242.68.66
IPv6 addresses: -

Name servers  : ns2.baidu.com., ns7.baidu.com., dns.baidu.com., ns3.baidu.com., ns4.baidu.com.
DNSSEC signed : no
Mail servers  : 6 mail servers found

也可以用nslookup查询,但nslookup似乎不能指定端口号,默认的53端口是dnsmasq占用,已经配置dnsmasq将dns查询转发给5353端口的dnscrypt-proxy

nslookup baidu.com 127.0.0.1

查询结果可以看到ipv6的AAAA记录查询是被屏蔽的

Server:         127.0.0.1
Address:        127.0.0.1#53

Non-authoritative answer:
Name:   baidu.com
Address: 110.242.68.66
Name:   baidu.com
Address: 39.156.66.10
baidu.com       hinfo = "AAAA queries have been locally blocked by dnscrypt-proxy" "Set block_ipv6 to false to disable that feature"

补一个dnsmasq转发到5353端口的配置

server=127.0.0.1#5353
Theme Jasmine by Kent Liao