Comments (38)
当然那只是假设为 -X。不是真的叫这个名。
from chinadns-ng.
你如果之前就描述的如此清楚明白,问题或许早已解决。
from chinadns-ng.
我以为写chinadns的和类似功能软件的作者会懂与这类似的逻辑(不少文章都是chnroute+一些国内有CDN的dnsmasq规则来分流)...于是我直接用“优先使用国内IPv4 CDN”来指代这个功能了...
from chinadns-ng.
这个情况的确存在。我先说说我自己的简略看法:
加个选项,比如 -X
,该选项默认未启用(禁用)
- 禁用状态:相关逻辑同前,不做改变。
- 启用状态:当 chinadns-ng 从国内 DNS 收到 AAAA 类型的 reply 时,如果此 reply 中未包含任何 ipv6 地址(比如只有 CNAME 记录),那么也将其视为“包含 ipv6 地址,且该 ipv6 地址为国内地址”,于是 chinadns-ng 会最终接受此 reply,并返回给请求客户端。
from chinadns-ng.
至于你说的“请求国内网站”,因为chinadns-ng无法判断域名是国内还是国外,因此只能进行如上判断。
from chinadns-ng.
改成这两个个状态如何?
状态一:禁用状态,保持现在的逻辑
状态二:
当已从国内DNS得到有效的A结果后,丢弃从国内DNS得到相同域名的AAAA结果,并不再继续查询
若无A结果,但AAAA结果在chnroute6内,则在此返回结果,否则继续向国外DNS查询,这样应该能处理掉绝大部分了吧...
from chinadns-ng.
“国内网址逻辑”是基于优先匹配IPv4地址是否在chnroute里,然后匹配IPv6 ONLY的网址是否在chnroute6里,但如果用户喜欢皮...那也没办法了
from chinadns-ng.
你说的状态二不现实,chinadns-ng 只认单个查询。如果要实现你说的“丢弃从国内dns得到的相同域名的aaaa结果”,那么chinadns_ng还需要维护另外一个hashmap,key为域名,而且还要考虑该hashmap中的entry如何清除,比如超时逻辑?否则这个map会越来越大。总之这么做极大的增加了复杂度,会引来更多的bug。
from chinadns-ng.
另外丢弃aaaa结果也不是一个好的解决办法,很多程序在未收到相应的解析结果时,会进行重试,这反而会恶化用户的体验。这种情况不少见,curl就是典型。
from chinadns-ng.
看起来还需要严谨的考虑啊...但看起来对有国内IPv4的网址进行对AAAA结果进行丢弃还行啊,也不会缺少什么...
from chinadns-ng.
当然不排除一些鹅心的鹤立鸡群的网址,例如 ipv6.baidu.com ,但该网址使用率远没有 www.baidu.com 来的高吧...对目前的国内环境来说,暂且还不算是损人利己的程度...
from chinadns-ng.
这个情况的确存在。我先说说我自己的简略看法:
加个选项,比如-X
,该选项默认未启用(禁用)
- 禁用状态:相关逻辑同前,不做改变。
- 启用状态:当 chinadns-ng 从国内 DNS 收到 AAAA 类型的 reply 时,如果此 reply 中未包含任何 ipv6 地址(比如只有 CNAME 记录),那么也将其视为“包含 ipv6 地址,且该 ipv6 地址为国内地址”,于是 chinadns-ng 会最终接受此 reply,并返回给请求客户端。
总之,我认为这种方式是比较可取的。当请求客户端收到这个 reply 后,检查发现里面并没有 ipv6 地址,那么它就会采用 ipv4 类型的 reply。这符合你的期望。
这样操作的结果其实与直接请求 114 这样的 dns 的结果是一样的。没有区别。解析如下:直接使用 114 作为 dns 时,客户端也是同时发送两个 query,一个 a,一个 aaaa,然后会从 114 收到两个 reply,分别对应 a 类型的和 aaaa 类型的,aaaa 类型的没有 ipv6 地址,只有一个 cname 记录,a 类型的有 ipv4 地址,于是客户端最终选择 a 类型的 reply。与上述的“启用状态”产生的结果完全一致。
from chinadns-ng.
那也可以...至少先把目前的bug给修了...
既然你都说到这个份上了...那在此改进版的基础上加个给6in4用户实验用的选项:过滤国内DNS返回的有效的国内AAAA结果,至少我这类用户几乎和非仅有国内IPv6地址的网站是无缘的
from chinadns-ng.
没有明白你说的:
在此基础上,过滤国内dns返回有效国内aaaa记录。
请给出判断流程。
from chinadns-ng.
以下流程只针对国内dns:
发送DNS解析请求到国内DNS(一个是A,另一个AAAA) ----> 得到两个reply ----> 同时将其与chnroute(6)进行对比(得到在表内和不在表内的两个结果) ----> A在表内 或 A不在表内但AAAA在表内,立刻丢弃AAAA结果并不再查询 / 都不在表内,开始对境外DNS的结果进行判断...
大概这样子的流程
from chinadns-ng.
我还是要重复那句话,chinadns-ng 只认单个 query/reply,他并不知道哪两个 query 或 reply 是相关联的。因此目前我只考虑之前讨论的 -X
选项,讨论结束。如下图,如果你没有明白我说的“只认单个 query/reply”是什么意思,那么请看 chinadns.c
源码。
from chinadns-ng.
只认单个那也行...就请让用户能设置chnroute6为空或者只留一些需要的名单的IPv6地址或者网段 加个只对国内DNS起作用黑名单功能,这样在逻辑上就能尽可能的满足了吧...
from chinadns-ng.
如果你认真读过文档,就会知道,chnroute/chnroute6 这些 ipset 可以一个都不导入(或者导入一个空的 chnroute/chnroute6),这样产生的效果就是国内dns返回的ipv4/ipv6都会被过滤。
from chinadns-ng.
如果你认真读过文档,就会知道,chnroute/chnroute6 这些 ipset 可以一个都不导入(或者导入一个空的 chnroute/chnroute6),这样产生的效果就是国内dns返回的ipv4/ipv6都会被过滤。
嘶...那从目前来看(把目前的逻辑缺陷修了)没问题了?我目前遇到这个混合结果的问题(无论是否有指定chnroute6文件或将其设置为空)都会返回目前的国内DNS的A结果+国外DNS的AAAA结果
from chinadns-ng.
是的,有时间我再加上那个选项(也即上面讨论的 -X
)。
from chinadns-ng.
是的,有时间我再加上那个选项(也即上面讨论的
-X
)。
但如果还是出现了逻辑爆炸问题或许该考虑黑名单了...
from chinadns-ng.
先这样吧,到时候再看效果。
from chinadns-ng.
好的
from chinadns-ng.
我再加上那个选项(也即上面
小写的 -x
会不会和谐一点?其他选项都是小写的
from chinadns-ng.
@PussAzuki 我回想了一下,这个改动其实不大,仅仅是一个返回值的问题。具体的:在检查一个 dns reply packet 的时候,如果与之关联的 query type 为 A/AAAA,但其 answer 中却未找到任何 ipv4/ipv6 地址时,我返回给上层的处理结果为 NOTCHN(非国内 IP),这样的结果就是,在解析 yys.163.com AAAA
时 china-dns 的响应结果被过滤的情况,因为程序内部认为 china-dns 返回的是"国外ip"。
Line 234 in b82028e
from chinadns-ng.
如果改为 DNSRET_PASS
(国内 IP),问题就解决了。我待会加个切换选项吧,用来处理这种情况。
from chinadns-ng.
已更新,见选项 -n/--noip-as-chnip
。
from chinadns-ng.
有种你走进了你自己写的代码的坑里的感觉...参见您的这条评论....
你自己的逻辑的坑
正如您所说的...或许"n"这个选项默认开启会更好的符合您的预期?
from chinadns-ng.
正如您所说的...或许"n"这个选项默认开启会更好的符合您的预期?
我自己的期望是应该丢弃这样的 reply,许多默认选项产生的效果都是我个人最期望的。
from chinadns-ng.
前提
部分域名的国内DNS查询结果
其相对应的国外DNS结果
理应命中的CIDR
实际返回的结果
so...how?
from chinadns-ng.
目前国内DNS查询到只有IPv4结果的已经正常...但ipv4/6都有的好像都会这样...chn(6)文件可以去op适配的那边查看
from chinadns-ng.
能尽量文字描述最好。图片连个copy都没有。。。
from chinadns-ng.
你自己上 op 系统,手动测试下这个命令:
ipset test chnroute6 2402:4e00:8010::155 # 应该是这个 ip 吧,自己检查下
from chinadns-ng.
我这边测试是没有问题的:
chinadns-ng 的 log 如下:
2019-09-15 14:45:04 INF: [handle_local_packet] query [www.qq.com] from 127.0.0.1#13552
2019-09-15 14:45:04 INF: [handle_remote_packet] reply [www.qq.com] from 114.114.114.114#53, result: accept
2019-09-15 14:45:04 INF: [handle_remote_packet] reply [www.qq.com] from 8.8.8.8#53, result: ignore
2019-09-15 14:45:10 INF: [handle_local_packet] query [www.qq.com] from 127.0.0.1#50121
2019-09-15 14:45:10 INF: [handle_remote_packet] reply [www.qq.com] from 114.114.114.114#53, result: accept
2019-09-15 14:45:10 INF: [handle_remote_packet] reply [www.qq.com] from 8.8.8.8#53, result: ignore
A 查询的输出如下:
$ dig @127.0.0.1 -p55 www.qq.com A
; <<>> DiG 9.14.4 <<>> @127.0.0.1 -p55 www.qq.com A
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 14743
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; COOKIE: 931d4dda8f02916b (echoed)
;; QUESTION SECTION:
;www.qq.com. IN A
;; ANSWER SECTION:
www.qq.com. 245 IN CNAME public.sparta.mig.tencent-cloud.net.
public.sparta.mig.tencent-cloud.net. 245 IN A 120.241.186.165
public.sparta.mig.tencent-cloud.net. 245 IN A 120.241.186.164
;; Query time: 37 msec
;; SERVER: 127.0.0.1#55(127.0.0.1)
;; WHEN: Sun Sep 15 14:45:04 CST 2019
;; MSG SIZE rcvd: 132
AAAA 查询的输出如下:
$ dig @127.0.0.1 -p55 www.qq.com AAAA
; <<>> DiG 9.14.4 <<>> @127.0.0.1 -p55 www.qq.com AAAA
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 53636
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; COOKIE: cafd557bd3f199d5 (echoed)
;; QUESTION SECTION:
;www.qq.com. IN AAAA
;; ANSWER SECTION:
www.qq.com. 234 IN CNAME public.sparta.mig.tencent-cloud.net.
public.sparta.mig.tencent-cloud.net. 234 IN AAAA 2402:4e00:8010::154
public.sparta.mig.tencent-cloud.net. 234 IN AAAA 2402:4e00:8010::155
;; Query time: 37 msec
;; SERVER: 127.0.0.1#55(127.0.0.1)
;; WHEN: Sun Sep 15 14:45:10 CST 2019
;; MSG SIZE rcvd: 156
from chinadns-ng.
自己注意一下 chinadns-ng 的日志,必要的话打开 --verbose 选项。
from chinadns-ng.
使用 nslookup 再次测试了一遍,没毛病:
> server
Default server: 127.0.0.1
Address: 127.0.0.1#55
> www.qq.com
Server: 127.0.0.1
Address: 127.0.0.1#55
Non-authoritative answer:
www.qq.com canonical name = public.sparta.mig.tencent-cloud.net.
Name: public.sparta.mig.tencent-cloud.net
Address: 120.241.186.165
Name: public.sparta.mig.tencent-cloud.net
Address: 120.241.186.164
Name: public.sparta.mig.tencent-cloud.net
Address: 2402:4e00:8010::155
Name: public.sparta.mig.tencent-cloud.net
Address: 2402:4e00:8010::154
chinadns-ng 输出:
2019-09-15 14:54:25 INF: [handle_local_packet] query [www.qq.com] from 127.0.0.1#41559
2019-09-15 14:54:25 INF: [handle_remote_packet] reply [www.qq.com] from 114.114.114.114#53, result: accept
2019-09-15 14:54:25 INF: [handle_local_packet] query [public.sparta.mig.tencent-cloud.net] from 127.0.0.1#41637
2019-09-15 14:54:25 INF: [handle_remote_packet] reply [public.sparta.mig.tencent-cloud.net] from 114.114.114.114#53, result: accept
2019-09-15 14:54:25 INF: [handle_remote_packet] reply [public.sparta.mig.tencent-cloud.net] from 8.8.8.8#53, result: ignore
2019-09-15 14:54:25 INF: [handle_remote_packet] reply [www.qq.com] from 8.8.8.8#53, result: ignore
from chinadns-ng.
你自己上 op 系统,手动测试下这个命令:
ipset test chnroute6 2402:4e00:8010::155 # 应该是这个 ip 吧,自己检查下
看起来是chnroute6文件里的有误...没问题了
from chinadns-ng.
emmmmmm,说来有点好笑,现在我这省的DNS不污染ipv6结果了,直接返回空值...所以,你懂的,今天我这方案暴毙了一半,然后我个人不太喜欢黑名单(因为要么误伤+够不到 的部分很多,要么就是要维护很多东西),所以...我还得再深思熟虑啊
from chinadns-ng.
Related Issues (20)
- 可信DNS解析结果没有加入ipset的集合中,麻烦看一下是配置哪里有问题哦 HOT 4
- chnroute.ipset 国内IP库不全 HOT 10
- 群晖ds216se上运行报错protocol:12 errno:22 Invalid argument HOT 4
- chnlist.txt加入 -d gfw 之后可信上游不返回v6解析 HOT 2
- @fast+lto是什么后缀?怎么安装到openwrt HOT 3
- [增强] tcp pipeline 长连接支持 HOT 6
- [Feature Request]: 希望能手动指定监听协议 HOT 2
- 建议可在上游地址前加上 udp:// 来强制使用 UDP DNS HOT 8
- 请教该下哪个版本合适? HOT 3
- 添加 ip 到 ipset/nftset 时,支持指定元素级别的 timeout 参数
- 关于新版本的使用方法 HOT 20
- `--no-ipv6` 修改: 不过滤、过滤所有、按域名tag过滤、按ip测试结果过滤 HOT 5
- 新版本(2024.03.27)的 udp 似乎有问题 HOT 5
- [ipset.c:606 test_res_ipset] error when querying ip: (2) No such file or directory HOT 2
- [增强] 支持 `udp://` 上游 HOT 37
- tag 的说明和功能的例子是混淆了? HOT 2
- --add-tagchn-ip 选项可否设置黑名单 HOT 17
- 对于不支持tcp查询的上游,请带上`udp://`限定 HOT 12
- 是否个例:域名层级问题 HOT 3
- 使用 chinadns-ng 替代 dnsmasq 时,需要注意的事项 HOT 81
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from chinadns-ng.