本帖最后由 enrollee 于 2022-3-16 11:39 编辑
===========按以上配置,发现问题:P字头的科学软件中设置的自定义规则全都无效了(多好的一个软件,换作者后就越用越难受,终于决定放弃了)。所以改用S..p,设置在本文最后,前面的设置不用了,但原理依然有效===========
最近换了新路由,趁机安装了adguardhome用于广告过滤,在配置过程中花了点时间。原以为网上教程一大把,随便拿一个来照着做就成,结果发现这些教程很乱,绝大多数只是简单说了一下自己的配置,不说为什么这么配置,这么配置有什么好处与坏处,参考价值很低。每个人的网络情况不一致,需要也不一致,怎么可能完全照着别人的做呢?所以只好自己去相关网站看了一会资料,花了几小时,干脆再花点时间将自己的理解分享一下,供后人参考。也希望有高手批评指正,帮助我再优化。
先说基本网络拓扑与需求:
- 网络情况:只有一个刷了openwrt的主路由(随便吐槽一下,为什么本论坛以及外面的教程,大多数都在谈什么“旁路由”、“二级路由”,这与一个主路由相比,除了增加网络复杂性、降低网络性能、降低网络可靠性之外,有什么好处呢?如无必要,勿增实体,如果能用一个路由器搞定,还是建议尽量用不要再增加设备了。现在从80元到1000元,各种硬、软路由器都可以刷openwrt,一个openwrt完全可以胜任网关的功能了。)
- 需求:高效稳定地完成域名解析,免受污染。
- 新增需要:部分实现通过域名解析去广告的功能。
再说一下原理:(理解原理后,对相关APP的关键设置和优化设置就应该知道如何取舍了)
域名解析是实际网络访问的必要过程,标准的域名解析请求模式会以UDP协议发给指定的DNS服务器的53号端口。此外,还可以用TCP模式发请求(可靠性高,但效率低),或者用DoH/DoT方法(在TCP基础上增加了安全性,也就是说你的上游网关就不知道你请求将要访问的是什么网站,作为代价性能效率更受损伤。具体DoH和DoT哪个好,各有说法,大人就不做选择了。)
因为厉害国的特殊国情,域名解析的污染问题影响了上网。而某些科学软件,在解决域名解析的污染问题时比较笨拙,效率不高,表现比如:加载网页时有停顿。所以有必要在openwrt中加入处理域名解析的APP,使之不仅能解决污染问题,还更加安全可靠,并尽量减少效率的损失。需要补充一句的是,别指望提速太多,正常一个解析是几十毫秒(国内)到几百毫秒(国外),如果因为“科学”的原因,低效时一个解析会用时上千,这就需要改进了。否则几百毫秒的差异,随便怎么搞都行。
我选择了smartdns来提高解析速度,adguardhome来去广告。下面是我对openwrt上几个常用APP的理解:
- openwrt的域名解析是通过dnsmasq完成的,是一个本地化的DNS服务器,它典型地通过UDP53向上级DNS请求域名解析。dnsmasq还同时实现了DHCP和内网私有域的解析功能。它也可以实现DNS解析结果的缓存。
- SmartDNS 是一个运行在本地的 DNS 服务器,它接受来自本地客户端的 DNS 查询请求,然后从多个上游 DNS 服务器获取 DNS 查询结果,并将访问速度最快的结果返回给客户端,以此提高网络访问速度。它通过不同的分组,可以很好地平衡效率与污染问题,即国内走最快的受污染的DNS(因为它不污染国内域名),国外走不受污染的DNS(它肯定不如国内的快)。它也可以实现DNS解析结果的缓存。
- AdguardHome 的功能与smartdns类似,但它通过黑名单机制,实现了阻止某些域名的正常解析,实现去广告效果。简单地说,就是它做解析时,告诉客户某些广告域名不存在。它也可能对多个上游DNS进行速度优选,但它对污染问题的处理不好。它也可以实现DNS解析结果的缓存。
- 科学软件的主要功能是分流,指导与不同网站的数据流通过不同的路径实现。它是基于LINUX的ipset/iptalbes等功能模块实际的,并且它通过高效的加解密处理,隐藏特殊部分流量的真实目的地。从名字上就可以看出,它主要是基于IP的,所以它需要别的APP来帮助它实现域名解析,或者指导域名解析的访问请求走特殊的路径(厉害国之外的地方就没什么DNS污染了)。有些科学软件也内置了可以实现DNS解析结果缓存的模块。
从上面的描述可以看到,我一再提到缓存问题,因为我觉得它对效率的影响比较大,值得重视,有必要配置。
域名解析的一般流程:
内网的客户机会被设置成(接受DHCP自动配置,或者在客户机上手动配置)首先向路由器请求域名解析,正常情况下是路由器的53号端口,用UDP协议。
路由器收到的53号端口的UDP请求后,将请求交给dnsmasq处理,下面分2种情况:
1. dnsmasq发现自己能解析时(比如内网域名,比如对KMS的激活请求)就自己处理了,把结果反馈给客户机。
2. dnsmasq发现自己不能解析,它就向上级DNS请求,上级DNS一般是ISP的DNS (它会根据情况层层向上请求结果,但必要时会把结果污染掉),得到上级DNS的结果后,dnsmasq再反馈给客户机。
3. 完成一次解析后,它会将结果缓存下来(如果没有把它的缓存功能关闭的话),以供下次再收到同样请求时,迅速反馈客户,不再需要再向上级重新查询。
现在我需要增几个处理DNS请求的APP:smartdns, adguard-home, 以及科学软件。所以首先要考虑的是它们如何与dnsmasq的衔接。然后为了要实现它们各自功能,需要把它们串联起来。
我选择的方案是:以adguard-home接管53号端口的UDP请求;把dnsmasq置入adguard中作为私域服务器处理内网有关事务,在adguard中设置上游服务器为smartdns以处理外网事务;在smartdns中设置多个(10个左右)上流公共DNS服务器(其中有UDP方式的,TCP的,DoH, DoT的),并且分组处理国内外的域名,达到高效目的。设置科学软件不对域名解析做特殊处理,全交给路由器的UDP53号口(它以为是dnsmasq,实际是adguardhome)处理。
这么选择的好处是,每个APP都能发挥它们的功能,客户机的DNS请求必须经过以上的APP处理,不能绕过,但也不会重复处理。坏处是,以上APP任一个掉链子,就会造成DNS请求无法完成,一般表现为上不了网。
下面是实操:
一、设置总览:
- dnsmasq降级,让出53号端口,改到5353号口
- adguard-home: 接管53口,设置上游服务器为smartdns,过滤列表(它提供少许,可以上网找更多针对国内广告的列表),处理内网的反向DNS。
- smartdns: 设置总端口,设置多个(10个左右)上流公共DNS服务器(其中有UDP方式的,TCP的,DoH, DoT的),并且分组, 启用第2DNS服务器及其专用端口。
- 科学软件:取消所有对DNS的处理,就只用路由器的53UDP。dnsmasq留少许缓存,存内网有关部分。
主要由adguardhome进行缓存,因为它离客户最近,提供的是最后的解析结果,该过滤的已经去掉。smartdns的缓存,有部分内容将被adguardhome过滤掉,白存了。但如果内存空间没问题的话(只要不是太老的,内存总有几百M,足够用了),让它也进行缓存,以实现诸如预加载等加速功能。
二、具体设置:(为方便测试,设置次序上有调整,与上述的逻辑不一致。关键性选项我用【】框起来,这些选项错了,可能会造成网络访问的问题,其它选项错了只有性能安全等方面问题,不影响大局)
0. 先关闭科学软件,以减少麻烦
1. smartdns,在LUCI(即openwrt网页上)设置:
1.1 基本设置:
【启用】
名称随便填
【端口】随便选一个,比如6053,记住以后要用到。
TCP服务器不勾(因为它的服务对象是adguardhome,将会只用UDP)
ipv6服务器不勾(它不直接服务,adguardhome中的上游服务器将只填IPV4地址,即127.0.0.1)
双栈IP优选保留(不清楚它的机制,留着吧)
域名预加载、过期缓存服务:二选一(所谓域名预加载,就是在缓存中的域名快过期时,不管客户有没有请求,smartdns就会去查询一下,记录下来,保持它永不过期,以备将来的客户请求; 所谓缓存过期服务,就是缓存中的域名过期后,有客户请求时,将过期的结果反馈给客户,然后smartdns应该在其后更新该记录。所以可见,二者功能是矛盾的,不要一起选。另外缓存中的域名何时过期,将由后面的三个TTL设置决定)
【重定向:无】
缓存大小:随便,比如1000000
三个TTL决定何时缓存中的条目过期,我选最小60最大600,另一项空着不设
【上游服务器】:把下面的一个个填入。国内的以UDP为主。国外的不要有UDP,最好用DOH/DOT,也可TCP可能更快点。UDP的我加入ISP的、114、阿里,这三个设为国内组。国外的设置了google的TCP/DOT/DOH,OpenDNS的,cloudflare, quad9。这些设为国外组。具体地址如下,不必全选,照smartdns开发者的建议,10个左右为佳。
常用国内DNS: 114: 114.114.114.114 , 阿里 223.5.5.5 腾讯 119.29.29.29
#国内腾讯、阿里 加密dns DOH
dns.pub/dns-query
dns.alidns.com/dns-query
#国外谷歌、CF、Q9加密dns DOH
DOH: https://dns.google/dns-query
DOT & TCP: 8.8.8.8
DOH: https://doh.opendns.com/dns-query
DOT & TCP: 208.67.222.222
DOH: https://cloudflare-dns.com/dns-query
DOT & TCP: 1.1.1.1
DOH: https://dns.quad9.net/dns-query
DOT & TCP: 9.9.9.9
【补上组名】:加入后,点修改,填入组名,比如一个叫china, 一个叫foreign. 其它均默认。
smartdns的UI设计比较不聪明,所以加上游服务器和加组名都挺费劲的,可以加一两个代表性的,然后直接编辑 /etc/config/smartdns 文件,复制粘贴再修改。
1.2 保存后,点“第二DNS服务器”
【启用】
【端口】随便选一个,比如7053,记住以后要用到。
TCP服务器不勾(因为它的服务对象将是 科学软件,将会只用UDP)
【服务器组】:上面设的国外组名,比如foreign
后面的选项与性能以及自定义设置有关,除address SOA因为牵涉到与别的DNS交换而不敢跳过外,其它选项均可跳过。因为我没什么相关的自定义设置,而且我的ISP不能实现IPV6访问。另外关于CACHE,据说可能会受污染影响,所以也跳过。反正外网域名在adguardhome中的cache会发挥作用。
1.3 我没有设置,可以参考本论坛的贴子https://www.right.com.cn/forum/thread-5972643-1-1.html 中的介绍有限选取少许。
最后保存应用。
2. dnsmasq设置,改服务端口,不再处理/etc/resolv.conf,缩小缓存因为它只处理内部的PTR/rDNS信息,解除绑定保护,转发域名解析请求到本机默认端口(即53,将由adguardhome接管)。这些处理可以在LUCI中,网络--DHCP/DNS中选择,也可以直接修改 /etc/config/dhcp 文件,也可以命令行输入下列脚本内容,我是直接做了个SH文件设置了。脚本来自openwrt官网https://openwrt.org/docs/guide-user/services/dns/adguard-home,具体如下:
# Get the first IPv4 and IPv6 Address of router and store them in following variables for use during the script.
NET_ADDR=$(/sbin/ip -o -4 addr list br-lan | awk 'NR==1{ split($4, ip_addr, "/"); print ip_addr[1] }')
NET_ADDR6=$(/sbin/ip -o -6 addr list br-lan scope global | awk 'NR==1{ split($4, ip_addr, "/"); print ip_addr[1] }')
echo "Router IPv4 : ""${NET_ADDR}"
echo "Router IPv6 : ""${NET_ADDR6}"
# 1. Disable dnsmasq from needlessly looking at the /etc/resolv.conf file.
# 2. Reduce dnsmasq cache size as it will only provide PTR/rDNS info.
# 3. Disable rebind protection. Filtered DNS service responses from blocked domains are 0.0.0.0 which causes dnsmasq to fill the system log with possible DNS-rebind attack detected messages.
# 4. Move dnsmasq to port 5353.
# 5. Set Ipv4 DNS advertised by option 6 DHCP
# 6. Set Ipv6 DNS advertised by DHCP
uci set dhcp.@dnsmasq[0].noresolv="1"
uci set dhcp.@dnsmasq[0].cachesize="1000"
uci set dhcp.@dnsmasq[0].rebind_protection='0'
uci set dhcp.@dnsmasq[0].port="5353"
uci -q delete dhcp.@dnsmasq[0].server
uci add_list dhcp.@dnsmasq[0].server="${NET_ADDR}"
#delete existing ipv6 dns and replace.
uci -q delete dhcp.lan.dns
#Set IPv6 Announced DNS
for OUTPUT in $(ip -o -6 addr list br-lan scope global | awk '{ split($4, ip_addr, "/"); print ip_addr[1] }')
do
echo "Adding $OUTPUT to IPV6 DNS"
uci add_list dhcp.lan.dns=$OUTPUT
done
uci commit dhcp
/etc/init.d/dnsmasq restart
3. adguardhome设置,在LUCI中和它的web页上设置。
3.1 LUCI中,服务--adguardhome页,如果以前没有启动过adguardhome,它可能需要“更新核心版本”,进行“快速配置”。
3.1.1 【更新核心版本】 这儿我走过了弯路。因为我是自己编译的固件,编译时把BIN文件编进去了,所以已经有了最新的核心了。然后我点更新后,因为下载的核心版本比我固件中的老,所以出了点问题,懒得去一个个地调整,干脆恢复openwrt出厂才解决。
3.1.2 如果以前配置过,可以进“手动设置”把所有设置删掉,或把“配置文件路径 /etc/AdGuardHome.yaml”中列的文件删掉。就可以看见“快速配置”。
3.1.3 【快速配置】 直接点快速设置,它会自动完成所有设置。
3.1.4 设一下web密码,以前设过的可以跳过。具体方法:更多选项,添加 点击“改变网页登录密码”并添加。输入密码后点击“载入计算模块”,然后点击计算。将生成的密码复制并粘贴至“手动配置”中的password字段后,并保存应用。
3.1.5 确认一下【重定向】这儿应该自动配为:“使用53端口替换dnsmasq”
3.1.5 确认一下【重定向】这儿是:“使用53端口替换dnsmasq”
3.2 adguardhome的web页,地址是:路由器IP:3000
3.2.1 设置--DNS设置:
【上游 DNS 服务器】:127.0.0.1:6053 这个端口号是在smartdns基本设置页上的端口号。
负载均衡这儿选谁都无所谓,因为只有一个上游
Bootstrap DNS 服务器:无所谓,可以填最快的DNS,即你的ISP的DNS。(查看ISP的DNS的方法:在路由的SSH命令行中输入:ubus call network.interface.wan status 就可以看到)
【私人反向 DNS 服务器】:127.0.0.1:5353,勾上下面的2个选项,然后点测试上游DNS,如果按我的次序进行的设置,smardns和dnsmasq应该已经设好,这儿的测试应该正常。点“应用”
DNS缓存配置:默认4M,可以改大改小。TTL最大600最小60,与smartdns一致。不一致也无所谓,浪费一丁丁。乐观缓存勾上,与smartdns中的“过期缓存服务”一个意思。
保存。
3.2.2 过滤器--DNS约束清单:默认已经有2个清单,你可以自己加。具体上网搜吧。
3.2.3 如果内网有KMS激活服务:过滤器--自定义过滤规则,添加一条:||_vlmcs._tcp.lan^$dnsrewrite=NOERROR;SRV;0 100 1688 openwrt.lan 然后应用。 注意一:这儿的openwrt为你的主机名,如果不确认的话,到 /etc/config/dhcp 文件中查看一下config srvhost的记录。注意二:这儿的lan为你的内网域名,如果不确定的话,到 /etc/config/dhcp 文件中查看一下 config dnsmasq 内的domain项。注意三:此情况可能未来会产生变化,不再需要自己添加,参见:https://github.com/AdguardTeam/AdGuardHome/issues/2533
4. 这时系统的DNS应该已经正常工作,可以测试一下:
4.1 在路由器的SSH终端中:
nslookup baidu.com # 有解析结果
nsloockup google.com # 有解析结果,且是正确结果,可以用IP查询网页(别用baidu的,不会告诉你结果的)查一下。
nslookup -querytype=ptr smartdns # 有 name = smartdns
nslookup -querytype=srv _vlmcs._tcp.lan # 有 _vlmcs._tcp.lan service = 的结果,注意这儿的lan需要换成你的内网域名(如果不是叫lan的话)
nslookup ad.azure.com # 应该没有结果。广告网站,被过滤了。
4.2 在windows客户机中,也可以试一下以上命令,注意语法不同,且ptr查询不对。
5. 最后设置科学软件,这方面各个软件不一样,原则就是不要它们管,一概用路由器的53UDP。比如P字头那个,就强逼用户用它的DNS分流方案,我们可以在其DNS部分,设置DNS分流:dnsmasq, 过滤模式:UDP, 远程DNS: 127.0.0.1, 不勾chinadns-ng。如果别的APP有什么限制,那上面提到的国外组就能用上了,但国外部分就绕过了广告过滤。这方面内容限于版规,不展开了。
主要资料来源:
https://pymumu.github.io/smartdns/
https://github.com/AdguardTeam/AdGuardHome/issues/1464
https://openwrt.org/docs/guide-user/services/dns/adguard-home
谢谢看到这儿,看这么久。
================改用s..p后的设置:==========================================拓扑: smartdns(不需要第2服务器,不需要-exclude-default-group) -> adguardhome 绑定5335 -> dnsmasq 和 S..P
设置:
dnsmasq 全默认,如果前面已经改过又记不住改了哪儿,可以cp /rom/etc/config/dhcp /etc/config/dhcp #注意,这样DHCP中所有设置都没了,比如vlmcsd的,需要一个个地恢复 (vlmcsd只需要关闭再打开即可),
smartdns:加入国内和国外的DNS,随便搞个端口6053,不要重定向,不要TCP不要IPV6, 不需要第2服务器
adguardhome:启动,自定义绑定接口5335, 重定向为dnsmasq的上游,上游DNS写smartdns(127.0.0.1:6053),其它都不要都不选,缓存设置一下。设好后可以检查一下dnsmasq,应该发现dns转发已经被设置好了。
s..p: DNS解析方式改为 用5335.
请不要胡乱输入以及粘贴、复制等方式灌水
如果胡乱灌水账户将会受到限制,具体限制形式:https://www.right.com.cn/forum/thread-8307840-1-1.html
另外账户捆绑手机验证:https://www.right.com.cn/forum/home.php?mod=spacecp&ac=plugin&id=jzsjiale_sms:home
|