在MacOS上配置dnscrypt-proxy(免分流)
文章目录
导语
中国大陆的互联网服务提供商经常劫持部分域名,转到自己指定的 IP,以强行插入自己的广告。dnscrypt-proxy
支持 DNSCrypt 协议和 DoH 方案等,可以避免受到 DNS 污染。
然而,很多人在按照官方教程安装完 dnscrypt-proxy
后,发现国内网站访问缓慢,甚至加载失败。这是由于 dnscrypt-proxy
在解析域名时,很可能会返回域名的国外主机的 IP。这就导致数据包传输距离大大变长,甚至可能需要经过海底光缆,耗时及久、速度下降明显。本教程采用的配置在很大程度上解决了这个问题,并提出了更多的可行思路。
第零步 前置要求
- 你的电脑上应该有正常工作的
SOCKS5 Proxy
。后文中,我们均假定它工作在本机的8886
端口。- 如果还有
HTTP/HTTPS Proxy
,当然更好。后文中,我们均假定它工作在本机的8887
端口。 - 如果只有
HTTP/HTTPS Proxy
,需要另外再准备一个SOCKS5 Proxy
。
- 如果还有
- 你的电脑上的本机
53
端口没有被占用。 - 你的电脑上安装了
curl
或wget
。本教程采用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-proxy
和 example-dnscrypt-proxy.toml
文件。
第二步 配置 dnscrypt-proxy
2.1 初始化
首先,在命令行中切换到 dnscrypt-proxy
所在目录:
1 | cd ~/dnscrypt-proxy |
随后,执行如下命令:
1 | mv ./example-dnscrypt-proxy.toml ./dnscrypt-proxy.toml |
因为是初次运行,dnscrypt-proxy
会自动初始化,需要较长时间。如果等待一段时间后命令行中不再显示新的文字,并且也没有出现 error
字样,表明初始化成功。
- 如果初始化失败,并且出现了
permission denied
字样,可以尝试执行:sudo ./dnscrypt-proxy
- 如果初始化失败,并且出现了
address already in use
字样,请检查本机的53
端口是否被占用:sudo lsof -i:53
,并退出此命令显示的全部进程(不论NODE
是TCP
还是UDP
,除非你确定完全知道你在做什么)。 - 如果初始化失败,并且出现了
Syntax error
字样,说明你下载了错误的文件,需要重新下载。
2.2 测试 dnscrypt-proxy
是否正常工作
新开启一个命令行窗口。
首先,在此窗口中执行:
1 | cd ~/dnscrypt-proxy |
你应当看到 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 | ./dnscrypt-proxy -service install |
这两条命令需要 root 权限。此后,均可以通过 sudo ./dnscrypt-proxy -service start 或 stop
来开始或停止 dnscrypt-proxy
服务。
2.3 使 dnscrypt-proxy
正确解析国内域名
也许此时你已经发现,dnscrypt-proxy
往往解析出海外 IP,如下所示:
1 | nslookup music.163.com 127.0.0.1 |
在这个例子中,网易云音乐的域名被解析到香港,显然不是最优解。
最简单的解决办法是,使用代码编辑软件编辑 ~/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-south
,geekdns-doh-east
和 geekdns-hk
。
在 ~/dnscrypt-proxy/dnscrypt-proxy.toml
文件的第 30
行附近,找到:
1 | # server_names = ['scaleway-fr', 'google', 'yandex', 'cloudflare'] |
并修改为(以 geekdns-south
,geekdns-doh-east
和 geekdns-hk
为例):
1 | server_names = ['geekdns-south', 'geekdns-doh-east', 'geekdns-hk'] |
请注意,单引号为英文半角单引号。
保存文件并关闭代码编辑器。
在命令行中执行如下命令以重启 dnscrypt-proxy
服务:
1 | ./dnscrypt-proxy -service stop |
再次解析域名,就可以发现,此时的解析结果已经正常,如下所示:
1 | nslookup music.163.com 127.0.0.1 |
此结果与阿里巴巴公共 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