导语

中国大陆的互联网服务提供商经常劫持部分域名,转到自己指定的 IP,以强行插入自己的广告。dnscrypt-proxy 支持 DNSCrypt 协议和 DoH 方案等,可以避免受到 DNS 污染。

然而,很多人在按照官方教程安装完 dnscrypt-proxy 后,发现国内网站访问缓慢,甚至加载失败。这是由于 dnscrypt-proxy 在解析域名时,很可能会返回域名的国外主机的 IP。这就导致数据包传输距离大大变长,甚至可能需要经过海底光缆,耗时及久、速度下降明显。本教程采用的配置在很大程度上解决了这个问题,并提出了更多的可行思路。

第零步 前置要求

  • 你的电脑上应该有正常工作的 SOCKS5 Proxy。后文中,我们均假定它工作在本机的 8886 端口。
    • 如果还有 HTTP/HTTPS Proxy,当然更好。后文中,我们均假定它工作在本机的 8887 端口。
    • 如果只有 HTTP/HTTPS Proxy,需要另外再准备一个 SOCKS5 Proxy
  • 你的电脑上的本机 53 端口没有被占用。
  • 你的电脑上安装了 curlwget。本教程采用 curl
  • 你的电脑上可以使用 nslookup 命令。
  • 你应当拥有一个管理员(root)权限的账户,并知晓它的密码。
  • 你应当可以流畅访问 GitHub

第一步 安装 dnscrypt-proxy

1.1 获得 root 权限

打开 Terminal.app(或者任何你熟悉的 shell),在其中输入并执行:

1
sudo -s

你可能需要输入你的电脑密码。输入密码时,屏幕上不会有显示,这是为了防止你的密码被身后的陌生人偷看。

执行完成后,在命令行中输入并执行:

1
whoami

如果回显为 root,说明你成功获得了 root 权限。

1.2 下载文件

点击这个链接:gh: DNSCrypt/dnscrypt-proxy/releases,下载最新版本的 dnscrypt-proxy 的二进制发布版本。文件大小大约在 1-10 MB,文件名格式如下:

1
dnscrypt-proxy-macos-版本.tar.gz

下载完成后,解压缩至任何便于记忆的目录。后文中均假定解压到 ~/dnscrypt-proxy 目录下。

解压后的文件应当包含 dnscrypt-proxyexample-dnscrypt-proxy.toml 文件。

第二步 配置 dnscrypt-proxy

2.1 初始化

首先,在命令行中切换到 dnscrypt-proxy 所在目录:

1
cd ~/dnscrypt-proxy

随后,执行如下命令:

1
2
mv ./example-dnscrypt-proxy.toml ./dnscrypt-proxy.toml
./dnscrypt-proxy

因为是初次运行,dnscrypt-proxy 会自动初始化,需要较长时间。如果等待一段时间后命令行中不再显示新的文字,并且也没有出现 error 字样,表明初始化成功。

  • 如果初始化失败,并且出现了 permission denied 字样,可以尝试执行:sudo ./dnscrypt-proxy
  • 如果初始化失败,并且出现了 address already in use 字样,请检查本机的 53 端口是否被占用:sudo lsof -i:53,并退出此命令显示的全部进程(不论 NODETCP 还是 UDP,除非你确定完全知道你在做什么)。
  • 如果初始化失败,并且出现了 Syntax error 字样,说明你下载了错误的文件,需要重新下载。

2.2 测试 dnscrypt-proxy 是否正常工作

新开启一个命令行窗口。

首先,在此窗口中执行:

1
2
cd ~/dnscrypt-proxy
./dnscrypt-proxy -resolve www.baidu.com

你应当看到 IP addresses: xxx.xxx.xxx.xxx 的字样。如果出现 IP addresses: -,说明此前的配置有问题,或你的电脑的网络连接已中断。

随后,在命令行中执行:

1
nslookup www.baidu.com 127.0.0.1

你应当看到十行左右的文字出现。

接着,打开系统设置,在右上角搜索框中输入 DNS,点击 DNS 服务器DNS servers),并在左侧的白框左下角找到 + 号。点击 + 号,在新出现的输入框中输入 127.0.0.1 并回车;用鼠标将此条记录拖拽到所有其他记录的上方,以确保它是第一条记录。点击右下角的 确定OK)按钮,待此窗口关闭后,点击其下方的设置窗口右下角的 应用Apply)按钮。

打开你常用的浏览器,开启无痕模式(或无扩展模式),尝试访问 ip.sb。你可能需要事先关闭所有全局代理。此时,网页应当正常加载。

最后,回到最开始打开的命令行窗口,按下 Control-C 组合键以停止 ./dnscrypt-proxy。随后执行:

1
2
./dnscrypt-proxy -service install
./dnscrypt-proxy -service start

这两条命令需要 root 权限。此后,均可以通过 sudo ./dnscrypt-proxy -service start 或 stop 来开始或停止 dnscrypt-proxy 服务。

2.3 使 dnscrypt-proxy 正确解析国内域名

也许此时你已经发现,dnscrypt-proxy 往往解析出海外 IP,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$ nslookup music.163.com 127.0.0.1
Server: 127.0.0.1
Address: 127.0.0.1#53

Non-authoritative answer:
music.163.com canonical name = music.ntes53.netease.com.
music.ntes53.netease.com canonical name = overseasv4.music.ntes53.netease.com.
Name: overseasv4.music.ntes53.netease.com
Address: 103.126.92.133
Name: overseasv4.music.ntes53.netease.com
Address: 103.126.92.132

$ whois 103.126.92.0/24
% Information related to '103.126.92.0/22AS137263'

route: 103.126.92.0/22
origin: AS137263
descr: HONGKONG NETEASE INTERACTIVE ENTERTAINMENT LIMITED
Unit 802, 8th Floor, Chuang's Tower,
30-32 Connaught Road Central
mnt-by: MAINT-NETEASEIE-HK
last-modified: 2018-12-03T07:34:50Z
source: APNIC

在这个例子中,网易云音乐的域名被解析到香港,显然不是最优解。

最简单的解决办法是,使用代码编辑软件编辑 ~/dnscrypt-proxy/dnscrypt-proxy.toml 文件:

  • 在第 96 行附近,找到:
1
# proxy = 'socks5://127.0.0.1:9050'

并修改为(以 8886 端口为例):

1
proxy = 'socks5://127.0.0.1:8886'
  • (可选的)在第 103 行附近,找到:
1
# http_proxy = 'http://127.0.0.1:8888'

并修改为(以 8887 端口为例):

1
http_proxy = 'http://127.0.0.1:8887'

最重要的一步:

访问 dnscrypt.info/map,找到地理位置在中国大陆的圆点,单击圆点以查看其名称。在创作此教程时(2020年02月04日),中国大陆上共有三个圆点(三台可用的服务器),分别是:geekdns-southgeekdns-doh-eastgeekdns-hk

~/dnscrypt-proxy/dnscrypt-proxy.toml 文件的第 30 行附近,找到:

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

并修改为(以 geekdns-southgeekdns-doh-eastgeekdns-hk 为例):

1
server_names = ['geekdns-south', 'geekdns-doh-east', 'geekdns-hk']

请注意,单引号为英文半角单引号。

保存文件并关闭代码编辑器。

在命令行中执行如下命令以重启 dnscrypt-proxy 服务:

1
2
./dnscrypt-proxy -service stop
./dnscrypt-proxy -service start

再次解析域名,就可以发现,此时的解析结果已经正常,如下所示:

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
$ nslookup music.163.com 127.0.0.1
Server: 127.0.0.1
Address: 127.0.0.1#53

Non-authoritative answer:
music.163.com canonical name = music.ntes53.netease.com.
music.ntes53.netease.com canonical name = bgpv6.music.ntes53.netease.com.
Name: bgpv6.music.ntes53.netease.com
Address: 59.111.181.35
Name: bgpv6.music.ntes53.netease.com
Address: 59.111.181.60
Name: bgpv6.music.ntes53.netease.com
Address: 59.111.181.38

$ whois 59.111.181.0/24
person: Zongyi Xu
address: NetEase Building No.16 Ke Yun Road,
address: Tianhe Avenue,Guangzhou,Guangdong,China.
country: CN
phone: +86020-85106115
e-mail: [email protected]
nic-hdl: ZX3316-AP
mnt-by: MAINT-CNNIC-AP
last-modified: 2016-03-07T06:05:41Z
source: APNIC

此结果与阿里巴巴公共 DNS 服务(223.5.5.5)解析结果相同。

2.4 其它思路

2.4.1 贵富网list + 黑白名单

参见:酥酥乳.tools 第 511 篇博文

在转换出 dnsmasq_贵富网list.conf 之后,使用正则替换:将 /^server=\/([\S\s]+)\/127.0.0.1#5353 替换为 $1 127.0.0.1:53,并将结果粘贴到 dnscrypt-proxy 配置文件的 301 行左右的 Example map entries 下方,配合自建的 DNSCrypt 协议或 DoH 的本机 DNS 服务器食用。

2.4.2 在路由器上完成

dnsmasq + lede 之类的,有成熟的教程了,不再赘述。

2.4.3 使用分流脚本

传统模式,需要经常维护,但是效果不错。

gh: CNMan/dnscrypt-proxy-config

来源:https://blog.jiejiss.com/