利用网关设备搭建私用无污染 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 服务器已完全搭建完成。