传统的UDP DNS泄漏隐私,容易被篡改。尤其是隐私问题,你的运营商可以轻易知道你访问过哪些网站,想想都可怕。因此加密DNS显得尤为重要。
当然,DNS只是你访问互联网的第一个步骤而已,加密DNS并不能保证万无一失。HTTP自不必说,对于HTTPS,当你和服务器握手时,SNI也会暴露你访问的域名。但是,这并不代表加密dns没有用,至少在我朝网络环境下,可以保证DNS不被篡改,减少攻击面。

在TLS1.3中已经可以加密SNI了,可以通过在firefox中开启ESNI实现,但是需要服务端和客户端都支持,预计还要几年才能普及。

在PC上,加密dns很简单,只需要下载一个SimpleDnsCrypt,他就能自动帮你配好dnscrypt-proxy了。Linux的话,除了dnscrypt-proxy,还有dns-overtlsdns-over-https的各种软件可供选择。但是在安卓手机上,想要实现加密DNS就比较难了。

dns-over-tls

从安卓9开始,就自带了加密dns功能,只要你在设置里填上合适的服务器地址就行,但是呢,这个自带的加密dns在使用代理时不会生效,如果你使用了SS,那么你还是会用SS里的DNS服务器明文查询,而且只能填一个域名,容易出故障。

dnscrypt-proxy

为了让全局DNS都能加密,这里就要使用一个magisk模块了,那就是dnscrypt-proxy。这个是dnscrypt-proxy的ARM版本,用magisk刷入,然后修改位于/sdcard/dnscrypt-proxy目录下的文件就能启用了。

为了方便配置,你可以在PC端用SimpleDnsCrypt配置好,然后把配置文件dnscrypt-proxy.toml复制过去。PC端默认监听53端口,建议修改为5353端口


这是我的配置文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
server_names = ["rubyfish-ea", "geekdns-doh-west", "geekdns-doh-north", "geekdns-doh-east"]
listen_addresses = ["127.0.0.1:53", "[::1]:53"]
max_clients = 250
ipv4_servers = true
ipv6_servers = false
disabled_server_names = []
refused_code_in_responses = false
dnscrypt_servers = false
doh_servers = true
require_dnssec = false
require_nolog = false
require_nofilter = false
daemonize = false
force_tcp = true
dnscrypt_ephemeral_keys = false
tls_disable_session_tickets = false
offline_mode = false
timeout = 2500
keepalive = 30
lb_estimator = false
netprobe_timeout = 60
netprobe_address = "9.9.9.9:53"
log_level = 0
use_syslog = false
cert_refresh_delay = 240
fallback_resolver = "223.5.5.5:53"
ignore_system_dns = false
log_files_max_size = 10
log_files_max_age = 7
log_files_max_backups = 1
block_ipv6 = true
cache = true
cache_size = 256
cache_min_ttl = 600
cache_max_ttl = 86400
cache_neg_ttl = 60

[query_log]
format = "ltsv"

[nx_log]
format = "ltsv"

[blacklist]

[ip_blacklist]

[sources]

[sources.public-resolvers]
urls = ["https://raw.githubusercontent.com/DNSCrypt/dnscrypt-resolvers/master/v2/public-resolvers.md", "https://download.dnscrypt.info/resolvers-list/v2/public-resolvers.md"]
minisign_key = "RWQf6LRCGA9i53mlYecO4IzT51TGPpvWucNSCh1CBM0QTaLn73Y7GFO3"
cache_file = "public-resolvers.md"
refresh_delay = 72
prefix = ""

然后,你有两个选择,一是安装一个修改dns的app,将dns指向dnscrypt-proxy监听的地址,比如我这里是127.0.0.1:5353,填进去,然后app一般会启动一个vpn,用这个vpn上网就行。
如果不想用vpn,那么可以安装这个magisk模块,这个模块会使用iptables把所有53端口的出口流量转到127.0.0.1:5353,也就是全局启用了dnscrypt-proxy

测试

配置完dns后,我们来测试一下有没有成功,访问https://www.dnsleaktest.com/或者http://nstool.netease.com/。如果看到的DNS和你在dnscrypt-proxy中配置的一样,恭喜你,你的DNS已经被加密了。

参考链接

浅析加密DNS