利用网关设备搭建私用无污染DNS服务器
前面文章提到过,即使使用了代理,也常会出现无法访问某些网站的情况,其实这就是因为DNS被污染了,因此为了更科学地上网,我们可以在网关设备上搭建一个私用的无污染DNS服务器。
网关设备
这里先简单讲一下什么是网关设备,网关设备可以简单理解为你的局域网接入外部网络的最后一道关口(当然实际上不一定是最后一道,比如我下面的例子里 网关外面还有一个路由器),所有局域网流量在进入公网前都将首先经过该设备,再由该设备进行转发。除了普通家用路由器自身即可充当网关设备外,任何一台具备ip转发功能的设备都可以作为网关,比如一台废弃不用的笔记本电脑、部署在设备上的虚拟机等等。
这里我使用的网关设备是树莓派,其相当于一台轻量级的Linux电脑,拥有4逻辑核CPU、4G内存与32G存储卡。
基本网络配置
我的网络架构及基本的网络设置大概如下(因为没办法在软件上模拟WiFi,故使用一条以太网线当做LAN-Device与路由器间的WiFi连接):
OpenWrt路由器WAN口连接外网,所有LAN口通过虚拟设备(br-lan)进行桥接,并分配静态IP为192.168.1.1
网关设备树莓派的以太口连接路由器一个LAN口,分配静态IP为192.168.1.2,网关设为LAN口IP:192.168.1.1,同时在网关设备上开启ipv4转发。
- 路由器开启DHCP服务,将自动分配的网关设为树莓派IP:192.168.1.2
如此配置后,局域网内的设备应该已经可以正常上网了,如果不能上网请仔细检查网络配置或重连WiFi再次尝试。
如上图中的箭头方向所示,从局域网设备发出的流量将经过路由器的网桥到达网关设备树莓派,经过树莓派的处理后再转发至路由器LAN口,最后由路由器转发至外部网络,这一流程可以通过traceroute
命令(Windows下是tracert
)进行验证。虽然这样配置会比正常家用路由器多两次转发,但相对于外网的延迟来说,这点延迟几乎可以忽略不计。
DNS服务器搭建
DNS查询过程
在上面的默认配置下,当局域网内主机发起一个DNS请求时,其查询顺序如下:
- 查询DNS缓存与本地的hosts文件,若查到,直接返回结果,否则进入下一步。
- 向路由器的53端口发起DNS查询,路由器查询DNS缓存与本地的hosts文件(如果有的话),若查到,则直接返回应答,否则进入下一步。
- 路由器向其上游DNS服务器(一般默认为当地ISP的DNS服务器)发起查询,至此,DNS查询进入了公网。然后,若上游DNS服务器被污染,你就有可能获得一个错误的DNS应答,然后因为路由器及本机会把查询结果进行一定时间的缓存,你就会发现有好一段时间访问不了该网站了。
由上面的查询过程可以发现,问题应该出在路由器上游DNS服务器的分配上,其默认的上游DNS一般是由ISP分配的自己的DNS服务器,而国内的DNS服务器因为某些特殊原因,几乎都是受污染的。因此有必要自己来搭建一台无污染的DNS服务器。
所谓无污染DNS服务器,其实就是通过一些域名列表来主动选择上游DNS服务器,以达到净化的目的,我感觉作为一种基于域名列表的筛选方法还是有一定的局限性,但对于我们个人的上网需求那是妥妥够用了。当然,你也可以简单粗暴直接直接配置国外的公用DNS作为全部域名查询的上游,但这样做会导致DNS响应速度慢,还很容易把国内一些有全球CDN或负载均衡的服务解析到国外的IP,对国内网站的访问速度极其不利。最优选择是你找到了一台国内的无污染DNS,但这往往不可多得。
软件及配置方法
这里我用到的软件是Dnsmasq与Pi-hole。
Dnsmasq是一款同时拥有DHCP与DNS查询缓存功能的软件,我将其装在了路由器上,当然也完全可以装在树莓派上,只是一些网络配置得做略微的修改。
Pi-hole最早是基于树莓派系统开发出来的软件,拥有DNS查询、缓存、广告屏蔽等功能,可操作性很强,目前已经适用于各大Linux系统。
关于两个软件的安装方法,这里不再赘述,你都想自己折腾DNS服务器了,最基本的软件安装肯定能自己解决吧。
以下基于Dnsmasq装在路由器上的配置来简单说明。
首先,当然是先取消路由器的resolve功能,即不使用ISP自动分配的DNS服务器,然后将路由器DHCP服务分配的DNS服务器设置为网关的IP,这里即192.168.1.2,并设置路由器的Dnsmasq监听端口为53(其实是默认值)。
随后打开Pi-hole的网页管理界面,选择Settings->DNS,将左侧的所有选项都取消勾选,但勾选右侧的Custom 1(ipv4),填入路由器的Dnsmasq监听地址,即192.168.1.1#53,也可以自己再加几个第三方的DNS作为备用,最后别忘了保存!
最后检查网关设备上的如下配置文件:/etc/dhcpcd.conf
,该文件是Pi-hole的依赖软件的一个配置文件,它将用于定义设备的接口信息,配置比较通俗易懂,注意将静态ip(static ip_address)与网关(static routers)设置正确,当然最重要的,一定要设置static domain_name_servers为127.0.0.1,即本地ip,这样才会在本地的53端口正常监听DNS请求,从而可以通过Pi-hole转发到其上游服务器(192.168.1.1#53)。
至此,一台普通的DNS服务器已经部署成功了,可以在本机与网关设备上通过nslookup查询一下国内的一些域名,看看能不能按你所希望的流程拿到查询结果。
当然现在还没有设置最重要的防污染,可以结合ChinaDNS项目来做防污染,不过因为该项目的作者之前被请喝茶了,这个项目已经多年没有维护,因此我只用Dnsmasq来完成类似的上游服务器选择工作。
在进行下一步之前,请先选择好最适合你的两台DNS服务器,一台为国内DNS,诸如阿里的DNS、电信的DNS都可;另一台为国外DNS,比如OpenDNS、或Google家的,每个人的网络环境差别巨大,所以还是得自己多实验,选择最适合自己的。
然后我们需要一些域名的列表,可参考下面链接:
下载文件后,我们将主要的文件accelerated-domains.china.conf
进行修改:使用全局替换将文件里的DNS服务器替换为刚刚选择的国内DNS,然后放置到Dnsmasq服务所在设备的/etc/dnsmasq.d/
目录下(如果没有该目录则新建),其余文件视情况随意添加。其余情况下则使用国外DNS进行解析。
最后在/etc/dnsmasq.conf
文件中添加一行:conf-dir=/etc/dnsmasq.d
,然后重启Dnsmasq服务即可生效。
为了优化上网体验,减少向外网的DNS查询次数,还可以将Dnsmasq的min-cache-ttl
设置的稍大一些,经实测,此套配置在访问外网时没有任何卡顿,网站打开的速度也有了飞跃性的提升。
至此,无污染DNS服务器已完全搭建完成。