MacOS下DNS防污染方案

事情的起因是因为公司的内网有一个全局的翻墙透明代理,但是使用体验不佳,而我自己是常年自备梯子的。两者同时存在的情况下经常导致有些应该能打开的网站无法打开,查看原因是因为DNS被污染了。

其次,因为经常需要浏览网页,我也不想被公司知道我访问了哪些网站(逃XD),毕竟查DNS记录是最简单的。

所以我就查找一番资料,在本地搭建了一个防污染的DNS服务,同时也能保证内网的正常访问。

1、 方案选择

很多翻墙软件其实都内置了dns解析,但每个都不是那么好用。

以我使用clash pro为例,它的DNS配置其实还挺复杂,自己的概念比较多;其次它的DNS解析请求是并行请求,类似于smartdns,但很多时候我们并不想让所有人都知道我们要访问这个网站了;而其中最大的问题是,无法指定域名使用DNS服务。

鉴于上述问题,我们基本只剩一条路了:自建DNS服务。

2、DNS服务选型

市面上能提供DNS服务的软件有这么几个:dnsmasq、pdnsd、dns2socks、smartdns。

其中pdnsd、dns2socks、smartdns都能通过tcp进行dns解析,所以也就能使用透明代理达到防污染的目的(其实这里默认海外的DNS服务都是无污染的,比如8.8.8.8)。

因为我家里的路由器上已经有了这么一套防污染的DNS解析服务,而且我也有公网IP,所以也就没有必要再搭建本地的防污染DNS服务,剩下的需求只有一个:能指定域名的DNS解析服务。剩下的选择只有一个,那就是dnsmasq。

3、dnsmasq安装与配置

MacOS上我们使用brew进行安装,至于什么是brew已经怎么安装brew,我们不做介绍,请自行解决。这里只放出安装dnsmasq的命令。

brew install dnsmasq

安装完成后,我们需要对其进行配置,打开配置文件,根据下面内容自行新增或取消注释:

vim /usr/local/etc/dnsmasq.conf

no-resolv
conf-dir=/usr/local/etc/dnsmasq.d
server=192.168.100.1

其中192.168.100.1作为默认的DNS服务,有同学会问了,为什么使用了一个私网的IP地址?这是因为国内对DNS解析服务监察比较严,如果你开放公网DNS服务,正常情况几个小时就会被封,而且我这是家庭宽带,找我喝茶轻轻松松。鉴于以上种种,我的解决方案就是通过wireguard直连家里路由器,再将192.168.100.1作为DNS服务。

配置好之后,我们就可以启动服务了(注意要使用root权限启动)

sudo brew services start dnsmasq

4、配置公司内网的DNS解析

到目前为止,如果直接使用的话,国内网站、国外网站基本都能正常解析了。但是,我们实在公司内的,公司内网有很多网址是需要公司内部的DNS进行解析,所以我们也需要配置下,指定公司的那些网址使用公司内部的DNS服务。

vim /usr/local/etc/dnsmasq.d/company.conf

server=/xxx.lan/10.xx.xx.xx

如果有多个网址,按照格式一行行添加即可。添加完之后就可以重新启动服务了。

sudo brew services restart dnsmasq

5、DNS服务的使用

其实到上一步已经结束了,这个防污染的DNS服务怎么使用,其实都要看你自己的代理配置。如果你有全局代理,那么直接将系统的DNS服务改成127.0.0.1即可(比如wireguard,不过要在allowed_ips里排除公司私网ips);如果你是用的是代理软件(比如clash),那么你可以把原来的DNS配置删掉了,直接使用这个本地的作为DNS服务。