LOADING...

加载过慢请开启缓存(浏览器默认开启)

loading

使用smartDns+openClash实现DNS分流访问

使用smartDns+openClash实现DNS分流访问

前言

本文是基于skk大佬的我有特别的 DNS 配置和使用技巧文章进行实际部署后的经验文章,本文中很多配置都是引用了SKK大佬的配置文件,因此,如果你想完整的体验,建议去看一下原文。

当然,这篇文章是准备给看了那篇文章但是不太会部署的用户看的,当然,我也不能保证100%的准确,只能说达到了我预期的效果了(笑)

为什么要这么做

我说我是闲得慌你信么(笑)

是为了更快的去访问网站,事实上,我用了很久软件,都发现一个问题,慢,访问一些网站的时候(国内),莫名走了国外的服务器,究其原因,是因为一个叫cname的玩意,他配合DNS,实现了就近访问的问题

我人在上海,用上海运营商DNS去请求数据,DNS在向上游DNS请求数据的时候,上游服务器发现这个DNS请求是在上海,就分配上海的节点。

这本来是好的,我在上海就上海的节点,我在四川就在四川的节点,问题就来了,我们请求的DNS是部署在一个固定的地方的,如114.114.114.114的DNS服务器就只有在江苏南京的和美国伊利诺伊州芝加哥有节点,那么,我们对114请求的解析,在上游服务器看来,是从南京来的(事实上,除非特殊的配置,否则上游DNS是不知道你在哪里,只知道下级DNS的位置),于是,他就给你分配到了南京的节点。

问题就已经出现了,我们只是在国内互联网环境下,就已经出现解析位置与实际位置偏差的问题了,那么,我们打开openclash?更大的问题就来了,我们依旧使用114的DNS服务,先不讨论屏蔽的站点,光是普通的站点(比如我的国际站博客),使用了就近访问的技术,解析到了位于香港的节点,但是,实际上,我们挂着美国的节点,那么此时,DNS给与的节点与实际节点就有很大的偏差了。

但是,clash对其提出了解决方法,也就是规则组,他设定一系列国内域名走国内的DNS解析,国外的域名走国外的DNS,这固然解决了一些问题,但是,又带来了新的问题,我们摸一个假设。

我是kitemoon网站的管理员,针对我的网站,我部署了位于中国大陆的加速节点和位于美国的加速节点。但是我网站较小,没有被大众的clash规则收录,那么问题来了,用户A没有开clash,访问我的网站,没问题,就近给与了访问节点,用户B开了clash,访问我的网站,会发生什么?

结果有两种,取决于你的配置,如果你配置clash为漏网之鱼走节点,那么kitemoon就自然分配给你了国外的节点,因为此时,你的DNS记录是通过你的国外的服务器解析的,就近到国外。反之则走国内。

一切开始不妙了起来,你会发现,你的国外服务器流量激增,我作为kitemoon网站的管理员也开始迷惑起来,”为什么有个用户在美国用zh_CN?” ,这对于我们都是不利的,更何况,有的时候,国内的视频网站使用了PCDN技术和就近访问技术,但是,你的规则组没有更新这些域名,然后你又开启了漏网之鱼走节点,BOOM。卡顿+流量费激增就来了。

这里其实还有个小问题,那就是为什么香港的代理服务器请求数据要从美国?香港没有数据中心吗?

这个问题其实很好解决,那就是DNS入口问题,你刚才所有的解析,都是走的国内DNS,那么有可能,在国内,美国服务器或许确实要更快些,但是要注意,这个是相对于你裸连而来的,如果你使用了代理,你就需要让你的DNS走代理的位置出发,这样才是最快的,而不是在国内解析到错误的IP后让你的代理服务器绕路。

那?关掉漏网之鱼走节点?

如果你是一个轻度用户,平常只是看看Netflix啥的,那自然可以,但是,假如说,你是一个开发者,你习惯在外网查询资料,这个时候你没有开启漏网之鱼走节点,你会发现很多文章打开很慢乃至于打不开,问题就在这里了。之前我说过的所有环境都是基于在国内部署了节点,如果说,国外的博客网站站长没有开启国内节点(事实上,很少有站长这么做,北岸),那么你的访问速度会很慢乃至于没法访问(墙的速度可比你规则更新速度要快),这无疑是灾难的。

这篇文章就是为了解决这个问题而来的,利用smartDns所提供的DNS分流功能,配合openClash的一些设置,让拥有国内加速节点的网站,走国内就近DNS解析,国外站点则通过你代理服务器所在的位置发起DNS请求,并且获取距离你代理服务器最近的加速节点访问。(具体见下图)

image-20220903221833342

前置条件

  • 一个OpenWRT软路由
  • 装好了smartDNS
  • 装好了OPENWRT
  • 开放了SSH

具体步骤

安装必要组件

因为我们的中国列表是通过C语言写的,因此会用到make命令,需要安装下面三个软件包

  • make
  • gcc
  • libgcc1

image-20220905203325256

image-20220905203336007

这里自行前往系统-软件包进行下载安装

注意下,make包搜索后是在中间,记得去中间去查看

安装完毕后,进入下一步

下载中国列表包

我们获取的包含中国节点/CDN的域名列表名单是通过项目:dnsmasq-china-list来实现的,因此,我们只需要在我们路由器中的任意位置(当然,前提是你找得到),执行下面这串命令拉取库

有可能你的软路由没有自带git,安装一个就好,方法和上面安装gcc一样

你执行git命令的时候,可能会提示:git: 'remote-https' is not a git command. See 'git --help'.
此时,执行下面的命令即可

opkg install git-http

确定无误后,继续执行命令

git clone https://github.com/felixonmars/dnsmasq-china-list.git

拉取项目后,我们进入项目目录,查看是否全部拉取完成

image-20220905205935817

确认拉取完成后,我们进入目录,执行下面这一串命令,获取支持smartDNS的名单

make SERVER=domestic SMARTDNS_SPEEDTEST_MODE=tcp:80 smartdns-domain-rules

执行后,你应该能看到你电脑中多了两个文件accelerated-domains.china.domain.smartdns.confapple.china.domain.smartdns.conf

image-20220905205957484

这就是我们需要的东西了,接下来,把这两个小东西拷贝到/etc/iphub

这里并不是强求,你只要找得到,放哪里都行

mkdir /etc/iphub
chmod -R 777 /etc/iphub/
cp accelerated-domains.china.domain.smartdns.conf /etc/iphub/accelerated-domains.china.domain.smartdns.conf
cp apple.china.domain.smartdns.conf /etc/iphub/apple.china.domain.smartdns.conf

执行完毕后,我们前往smartDNS的设置页面,选择自定义设置页面

修改smartDNS配置

你会看到一堆代码,不必担心,全部删除掉即可

image-20220905204734763

接着,我们来依次添加

首先,我们需要导入我们的IP库文件,因此,添加这两行

注意,这里文件执行的位置是刚才你cp出去的文件位置,别照抄

conf-file /etc/iphub/accelerated-domains.china.domain.smartdns.conf
conf-file  /etc/iphub/apple.china.domain.smartdns.conf

其次,我们需要关闭测速,防止GFW返回的127.0.0.1或者反诈地址导致被误判为最优节点

speed-check-mode none

接着,我们添加默认规则,也就是没有在中国名单中,未知的域名,让他们通过我们的VPS进行DNS查询

添加三个备用,防止污染

这里面的的DNS是用于解析没在名单中的,这样就能保证国外站点的访问速度

# ----- 未知域名分组 -----
# 默认使用的上游 DNS 组
# OpenDNS TCP查询 443
server-tcp 208.67.220.220:443
# OpenDNS IP DoH
server-https https://146.112.41.2/dns-query
# cf的 DNS
server 1.1.1.1

接着,我们添加中国大陆的域名库,遇到这些域名,使用中国的DNS请求IP。

讲个冷笑话,CNNIC质量特别差,差到没边了,因此skk大佬就用这个特性,将该DNS请求作为兜底,因为smartDNS的特性,他会对所有返回IP的速度进行测试,选择最快的,如果说离我们最近的CDN节点挂掉了,那么我们就会用CNNIC的DNS请求到的IP,访问一个较远的CDN,这样至少能保证我们不会断网,而是卡。

原文如下

你可能注意到,我的配置中添加了 CNNIC(中国互联网络信息中心)的公共 DNS。这是考虑到 CNNIC 的公共 DNS 节点质量较差、出口 IP 位置稀少、基本没有针对 CDN 做任何优化(截至本文写就,1.2.4.8 的 Anycast 仅在 浙江杭州阿里云 和 香港 Zenlayer 广播路由,210.2.4.8 的 Anycast 仅在 北京联通 广播路由)。所以,一般情况下,只有 CNNIC 的公共 DNS 一定不能 返回距离我位置最近的 CDN 节点(其余的公共 DNS 基本都会返回给我最优的 CDN 节点)。 设想一下,除 CNNIC 外、大部分公共 DNS 都会尽可能返回距离我本地运营商最近的、最优的 CDN 节点;由于 SmartDNS 的测速和优选,CNNIC 返回的非最优 CDN 节点一般会被忽略。然而,假如距离我最近的 CDN 节点出现故障,只有 CNNIC 能够给我返回不一样的 CDN 节点、能够响应 SmartDNS 测速,因此我能够使用并非最优、但是可用的 CDN 节点「救急」、不至于直接「断网」。 简单来说,就是因为 CNNIC 公共 DNS 能够非常稳定地提供质量最差的递归 DNS 服务、不会间歇发生解析质量好转,才得以入选。


商业转载请联系作者获得授权,非商业转载请注明出处。
作者:Sukka
来源:我有特别的 DNS 配置和使用技巧 | Sukka’s Blog
链接:https://blog.skk.moe/post/i-have-my-unique-dns-setup/

# ----- Domestic Group: domestic -----
# 仅用于解析 dnsmasq-china-list 列表中的域名
# 联通DNS查询,作为基础DNS查询,保证速度快
server 119.6.6.6  -group domestic -exclude-default-group
# 阿里 IP DoT
server-tls 223.5.5.5:853 -group domestic -exclude-default-group
server-tls 223.6.6.6:853 -group domestic -exclude-default-group
# CNNIC 公共 DNS、仅支持 UDP 查询,用来保证DNS服务正常
server 1.2.4.8 -group domestic -exclude-default-group
server 210.2.4.8 -group domestic -exclude-default-group

添加完毕后,smartDNS的事情就OK了,接着就是openWRT了

接着,记得关闭OP的DNS劫持即可,记得让DNS请求全走国外(1.1.1.1等国际分组的),这样才能保证请求记录永远离我们VPS最近

现在,我们就完成了所有的工作,可以下班休息了(笑)

增强一点?

每隔一段时间上去更新下列表还是很麻烦的,这里有个脚本,按照脚本上写一下即可,之后设定脚本每天晚上12点运行下即可。

echo "预创建编译文件夹和配置文件夹"
mkdir /opt/iphub
mkdir /etc/iphub
echo "赋予权限"
chmod 777 -R  /etc/iphub/
echo "克隆仓库"
git clone https://github.com/felixonmars/dnsmasq-china-list.git  /opt/iphub
echo "提取远程修改"
git fetch --all
cd /opt/iphub/
echo "开始编译"
make SERVER=domestic SMARTDNS_SPEEDTEST_MODE=tcp:80 smartdns-domain-rules
echo "编译完成,拷贝列表到指定文件夹"
mv ./accelerated-domains.china.domain.smartdns.conf /etc/iphub/accelerated-domains.china.domain.smartdns.conf
mv ./apple.china.domain.smartdns.conf /etc/iphub/apple.china.domain.smartdns.conf
echo "拷贝列表完成,更新结束"

结语

这样设置后,速度感觉是要更快一点点了,重点是不会预判失误了,未知站点始终会使用VPS去请求DNS了。

img_show