现在直接把科学上网部署在路由设备上的方案越来越常见了,因为这种方案还是有不少优势的,所以第三方的openwrt固件中可选的各种科学上网工具集,DNS转发/优化器,广告过滤工具也越来越多了。于是便随便聊聊关于这些所谓的DNS转发器到底有没有用,怎么用,以及是否应该在路由器上进行广告过滤吧。

GFW除了墙IP墙端口外,还有一个部署最早,影响最广的问题,便是DNS污染,由于DNS查询的特性,在DNS污染了结果后,可能会被多级DNS递归缓存,导致查询结果错误,并且可能影响非常久的时间。现有科学上网软件的做法无非是转发DNS请求至指定的服务器,或是直接由科学上网服务器进行DNS请求,但若客户端不采用TUN网卡接管全部流量的方式时,DNS污染问题仍然会存在。通常建议Socks代理设置时选择代理DNS查询或是使用浏览器的“安全DNS”(即HOT/DOH)

同样的问题是,如果科学上网放到了路由器上,DNS污染问题该如何解决。

首先看一下openwrt默认情况下如何处理DNS请求,假如不进行任何设置,openwrt使用自带的dnsmasq作为DNS转发器,把DNS请求转发到pppoe拨号获取到的DNS服务器上。这个选项可以在[网络>DHCP/DNS>hosts和解析文件]中调整,解析文件通常是/tmp/resolv.conf.d/resolv.conf.auto。也就是说,如果不希望使用运营商的DNS或是需要手动设置DNS转发,就必须要选择忽略解析文件,或是手动设置解析文件。

科学上网工具集如何处理DNS

那么,假如我们使用了科学上网工具集passwall配置科学上网,passwall是如何协助我们进行配置的呢?

passwall中内置了gfwlist和cnlist,以及中国大陆IPSet,在用户默认配置的情况下,passwall会在连接服务器时生成一份dnsmasq配置文件,将GFWList中的域名请求转发到设置的DNS服务器,即DNS设置中的远程DNS。
所以在配置该选项时,就需要注意首先是远程DNS必须在代理列表以内,众所周知GFW会污染境外DNS返回的结果,所以远程DNS必须经过代理请求。其次是需要考虑代理服务器到远程DNS的连通性,比方说采用UDP形式请求DNS的话,假如代理节点不支持UDP,就会导致请求失败,TCP同理。

所以,科学上网工具集以及帮你想到了DNS污染问题,并做了处理。那么这样的配置是否是完美的?是否有问题,到底需不需要使用openwrt中的其他DNS转发器?

对于小白用户来讲,我们不建议再配置其他的DNS转发器了,因为DNS请求时递归缓存的,如果错误的配置多级转发器,会导致调试变得非常困难。但实际上passwall这样处理DNS会在特殊情况下泄露DNS请求到默认转发的DNS服务器,这个特殊情况便是切换节点或是临时关闭,再连接时。

一旦在切换服务器时进行了DNS请求,请求被转发到运营商的服务器,这个被污染的结果会被dnsmasq和本机缓存,当服务器切换完成后,dnsmasq的缓存正常情况下会刷新,但是Windows的缓存和浏览器的缓存则不会,用户可能需要关闭浏览器在执行DNS刷新命令

为什么要DNS转发器

为了解决上面的问题,我们需要一个DNS转发器,将机器的DNS流量转发到可靠的DNS递归解析服务器上,虽然我们有说到dnsmasq这个工具本身也是一个DNS转发器,但是dnsmasq作为转发器,不支持DOT和DOH等协议。我们也说道,GFW会污染来自境外的DNS相应,于是使用dnsmasq作转发着实有些不够用。此外,dnsmasq在处理高并发时,还存在性能问题,所以我们需要一个高新能,支持加密的dns转发器。

目前openwrt中支持luci界面的,比较常用的DNS转发器有SmartDNS,MosDNS,dnscrypt-proxy等等。随着DoT/DoH的出现,我们基本上不需要再使用dnscrypt-proxy来加密DNS请求了,直接使用DoH即可。 passwall支持smartdns作为前端,生成smartdns规则,于是我们用smartdns进行演示。MosDNS也是一个不错的DNS转发器,支持使用geosite作为数据源,支持配置文件监听,发生修改后自动重载,作为新出现的DNS转发器,也是一个不错的选择。

配置smartdns转发器

安装好smartdns及其luci界面后,我们需要首先添加上游服务器。不过在添加之前,我们先考虑一个问题 —— 如何处理DNS污染,采用黑名单还是白名单

首先我们要知道,对于境内网站,我们不希望使用来自境外的DNS对他们进行解析,原因是境外的DNS服务器往往会返回错误的CDN节点,比如返回国际CDN而不是境内CDN,会导致网页浏览速度变慢,这就本末倒置了。而对于境外的没有被墙的网站,我们也建议使用境内DNS进行解析,可以获得距离较近的CDN节点。但是鱼和熊掌不可兼得,GFW没有给我们一份具体的名单,所以我们必须做出取舍,是采用白名单(使用CNList为有国内CDN节点的网站使用国内DNS服务器)还是黑名单(使用GFWList为被墙的网站使用海外DNS服务器)。

我通常采取的是白名单模式,使用CNList对境内CDN节点网站实行解析,其他结果默认使用海外DNS,原因是GFW实时监控流量,对网站进行污染的列表随时可能会变化,所以我们对未知网站默认使用干净的DNS进行解析。那么便可以配置上游服务器,添加几个国内的DNS,服务器组填写CN(或别的用于标记),额外参数填写-exclude-default-group。也就是不让他作为默认组提供服务。
一般添加几个就行,没必要很多。然后配置海外组添加一些海外的DNS解析服务,尽量选择DoH或是DOT,因为这些加密传输的DNS响应不会被污染。添加时不需要填写额外参数,服务器组填写GFW,那么这些组也会被作为默认服务器,提供解析。

添加好上游服务器,我们调一下转发器的参数,如果你的网络不支持IPv6请把停用IPV6地址解析选上。如果有IPv6可以考虑选择双栈IP优选。他这个双栈IP优选的意思是,如果IPv6地址和IPv4地址延迟相差很大,就不返回IPv6结果了。然后设置一下DNS缓存时间,可以把返回个客户端的TTL最大值调小一些,另外建议开启SmartDNS的缓存。从开发者回答的一些ISSUE中可以得知,SmartDNS首次返回最快的服务器IP,然后下次从缓存中返回的记录按速度排序。

然后我们需要加载CNList,项目地址是:https://github.com/felixonmars/dnsmasq-china-list我们根据需要下载配置文件,一共有三个文件分别是
accelerated-domains.china.conf
apple.china.conf
google.china.conf
我们下载这些文件,并替换文件中的114.114.114.114为我们设置的国内上游组CN,然后再自定义设置中添加

conf-file /<配置文件路径>/accelerated-domains.conf
最后重启smartdns,现在smartdns已经在6053端口提供无污染的DNS服务了,同时还支持CN加速。但是我们还需要进行一部操作,即重定向。因为smartdns目前监听在6053端口,而DNS默认端口是53。我们可以将smartdns设置为重定向53端口至smartdns,这样操作就是让smartdns接管路由器DNS服务了,dnsmasq的所有DNS相关的配置都会失效。

如果不希望使用smartdns接管DNS,也可以把smartdns设置为dnsmasq的上游,这要设置,dns请求便经过2层转发。如果需要这样设置,不建议使用smartdns Luci界面中的重定向进行设置,推荐手动设置。

首先在DHCP/DNS中添加DNS转发,地址填127.0.0.1#6053

然后到HOSTS和解析文件中忽略解析文件。这样操作之后,路由器DNS请求由dnsmasq转发给smartdns再由smartdns转发给上游。dnsmasq的解析缓存不建议开启。

passwall科学上网工具集的DNS处理

我们说过passwall会帮助用户处理DNS请求转发的问题,那么我们已经设置了无污染DNS,passwall的DNS配置还有效吗?

答案是会的,即使我们设置了无污染DNS,passwall仍然会将passwall的CNList和GFWList写入smartdns或是dnsmasq的配置文件。只不过,目前passwall暂时不支持关闭内置的DNS配置生成功能。但要注意是,如果你在passwall的DNS设置中选择了DNS分流为smartdns,那么他会生成smartdns配置文件,将你填写的远程DNS作为单独一个组passwall_proxy,并将GFWList中的域名设置为由passwall_proxy解析。

PixivID=103181462@我美蘭