shawn1m / overture

A customized DNS relay server
MIT License
1.8k stars 284 forks source link

几个问题。 #51

Closed cjjdaq closed 7 years ago

cjjdaq commented 7 years ago

1:Domain 匹配失败的,又去匹配IP network,这样导致一些ip是非cn的亚洲域名解析明显变慢,如何单独关闭IP network匹配。 2,pc->dnsmasq->overtrue 哪怕"OnlyPrimaryDNS": true时,很多国内域名都解析很慢,换阿里dns和腾讯dns都这样。求解。 chrome里很多正在解析主机

shawn1m commented 7 years ago

1: 在 config 里把 path 留空即可。 2: 如直连有问题么?可提供出现这种情况的一下 -v 下的 log 和 config 本身。

cjjdaq commented 7 years ago

对于Domain如何自定义呢。是否再加个UserDomainFile 我是在lede x64中使用本程序的,当PrimaryDNS为tx的dns时,Policy为auto后会自动发送wan口ip吗? dnsmasq直接上游阿里或者腾讯的没有问题。

cjjdaq commented 7 years ago

ip文件留空后依然会去匹配,overtrue作为dnsmasq的时候,发现dnsmasq不会缓存了,囧 IP network match fail, finally use alternative DNS 还有经常会 Primary DNS answer is empty

Primary DNS如何设置多个上游dns

cjjdaq commented 7 years ago

overtrue作为dnsmasq上游时 curl -o /dev/null -s -m 10 --connect-timeout 2 -w %{http_code} 'http://www.baidu.com' 基本失败,而且119.29直接作为dnsmasq上游时基本不会失败。

shawn1m commented 7 years ago

Domain 自定义参考 README,把 base64 关掉即可,domain file 本来就是给用户自定义的,sample 只是示例,不做任何保证。 不会自动发送,overture 并不知道自己的公网 IP,除非有来自公网 IP 的客户端请求。 我指的是直接使用 overture。 留空后匹配的开销可以完全忽略不计,存在显示问题的话,未来可以改进。 empty 可能和你的请求和配置有关,如果请求一个不存在的域名或者和服务器的连接有问题的话就会返回 empty。 我直接使用 overture 的话测试返回的是200,请参考自己的网络环境和配置。

shawn1m commented 7 years ago

多上游的直接添加到 JSON 数组中即可。

cjjdaq commented 7 years ago

{ "BindAddress": ":7548", "PrimaryDNS": [ { "Name": "AliDNS", "Address": "223.5.5.5:53", "Protocol": "udp", "SOCKS5Address": "", "Timeout": 6, "EDNSClientSubnet": { "Policy": "disable", "ExternalIP": "" } }, { "Name": "AliDNS2", "Address": "223.6.6.6:53", "Protocol": "udp", "SOCKS5Address": "", "Timeout": 6, "EDNSClientSubnet": { "Policy": "disable", "ExternalIP": "" } }, { "Name": "DNSPod", "Address": "119.29.29.29:53", "Protocol": "udp", "SOCKS5Address": "", "Timeout": 6, "EDNSClientSubnet": { "Policy": "disable", "ExternalIP": "" } }, { "Name": "DNSPod2", "Address": "119.28.28.28:53", "Protocol": "udp", "SOCKS5Address": "", "Timeout": 6, "EDNSClientSubnet": { "Policy": "disable", "ExternalIP": "" } } ], "AlternativeDNS": [ { "Name": "VpsDNS", "Address": "8.8.8.8:53", "Protocol": "tcp", "SOCKS5Address": "", "Timeout": 6, "EDNSClientSubnet": { "Policy": "disable", "ExternalIP": "" } } ], "OnlyPrimaryDNS": true, "RedirectIPv6Record": true, "IPNetworkFile": "/etc/overture/ip.txt", "DomainFile": "/etc/overture/gfwlist.txt", "DomainBase64Decode": false, "HostsFile": "/etc/overture/hosts", "MinimumTTL": 0, "CacheSize" : 0, "RejectQtype": [255] }

ip.txt是原本的国内ip列表,gfwlist.txt里是空的(怎么配置都是和名单模式,一匹配就强制AlternativeDNS)。 dnsmasq里 server=127.0.0.1#7548

用overture后,shell里 curl -o /dev/null -s -m 10 --connect-timeout 2 -w %{http_code} 'http://www.baidu.com' 基本返回的是000,很少有200,而且chrome浏览器开一些国内网站出现很多正在解析主机。 日志在这:http://istatic.xiacb.com/1.txt

上游的7548换pdnsd或者直接阿里腾讯的则正常。请指教。

cjjdaq commented 7 years ago

curl测试具体错误代码 root@LEDE-X64:~# host www.baidu.com www.baidu.com is an alias for www.a.shifen.com. www.a.shifen.com has address 180.97.33.107 www.a.shifen.com has address 180.97.33.108 root@LEDE-X64:~# curl -o /dev/null -s -m 10 --connect-timeout 2 -w %{http_code} 'http://www.baidu.com' -S curl: (6) name lookup timed out root@LEDE-X64:~# curl -o /dev/null -s -m 10 --connect-timeout 2 -w %{http_code} 'http://www.baidu.com' -S curl: (6) name lookup timed out root@LEDE-X64:~# curl -o /dev/null -s -m 10 --connect-timeout 2 -w %{http_code} 'http://www.baidu.com' -S curl: (6) name lookup timed out root@LEDE-X64:~# curl -o /dev/null -s -m 10 --connect-timeout 2 -w %{http_code} 'http://www.baidu.com' -S curl: (6) name lookup timed out root@LEDE-X64:~# curl -o /dev/null -s -m 10 --connect-timeout 2 -w %{http_code} 'http://www.baidu.com' -S 200root@LEDE-X64:~#

shawn1m commented 7 years ago

日志中是完全正常的,你具体的使用环境我没法复现,我一直让你直接使用 overture 作为默认 DNS 进行测试你并没有这样做,我没法控制其他的变量。 另外,如果你的 OnlyPrimaryDNS 设置为 true ,那就已经避开了 IPv6、Domain 以及 IP Network 的匹配,直接使用 PrimaryDNS 查询了。 你可以尝试使用 dig 看看结果,比 curl 直观。

cjjdaq commented 7 years ago

蛋疼的就是dig正常,curl就000,配置不变,overture换pdns后正常。

cjjdaq commented 7 years ago

@shawn1m 特地按照你说的,用ot当做默认dns测试了一下。 time="2017-06-08T03:07:07+08:00" level=info msg="Overture 1.3.5.1-3-gc2cc31f" time="2017-06-08T03:07:07+08:00" level=info msg="If you need any help, please visit the project repository: https://github.com/shawn1m/overture" time="2017-06-08T03:07:07+08:00" level=info msg="Load IP network file successful" time="2017-06-08T03:07:07+08:00" level=warning msg="There is no element in domain file" time="2017-06-08T03:07:07+08:00" level=info msg="Minimum TTL is disabled" time="2017-06-08T03:07:07+08:00" level=info msg="Cache is disabled" time="2017-06-08T03:07:07+08:00" level=debug msg="Load hosts took 252ns" time="2017-06-08T03:07:07+08:00" level=info msg="Load hosts file successful" time="2017-06-08T03:07:07+08:00" level=info msg="Start overture on :53" time="2017-06-08T03:07:09+08:00" level=debug msg="Question: ;www.baidu.com. IN AAAA" time="2017-06-08T03:07:09+08:00" level=debug msg="Domain match fail, try to use primary DNS" time="2017-06-08T03:07:09+08:00" level=debug msg="Question: ;www.baidu.com. IN A" time="2017-06-08T03:07:09+08:00" level=debug msg="Domain match fail, try to use primary DNS" time="2017-06-08T03:07:09+08:00" level=debug msg="AliDNS Answer: www.baidu.com. 265 IN CNAME www.a.shifen.com." time="2017-06-08T03:07:09+08:00" level=debug msg="AliDNS Answer: www.a.shifen.com. 265 IN A 180.97.33.108" time="2017-06-08T03:07:09+08:00" level=debug msg="AliDNS Answer: www.a.shifen.com. 265 IN A 180.97.33.107" time="2017-06-08T03:07:09+08:00" level=debug msg="Try to match response ip address with IP network" time="2017-06-08T03:07:09+08:00" level=debug msg="Matched: IP network 180.97.33.108 180.96.0.0/11" time="2017-06-08T03:07:09+08:00" level=debug msg="Finally use primary DNS" time="2017-06-08T03:07:09+08:00" level=debug msg="AliDNS Answer: www.baidu.com. 265 IN CNAME www.a.shifen.com." time="2017-06-08T03:07:09+08:00" level=debug msg="AliDNS Answer: www.a.shifen.com. 265 IN A 180.97.33.108" time="2017-06-08T03:07:09+08:00" level=debug msg="AliDNS Answer: www.a.shifen.com. 265 IN A 180.97.33.107" time="2017-06-08T03:07:09+08:00" level=debug msg="Try to match response ip address with IP network" time="2017-06-08T03:07:09+08:00" level=debug msg="Matched: IP network 180.97.33.108 180.96.0.0/11" time="2017-06-08T03:07:09+08:00" level=debug msg="Finally use primary DNS" time="2017-06-08T03:07:10+08:00" level=debug msg="Google Answer: www.baidu.com. 864 IN CNAME www.a.shifen.com." time="2017-06-08T03:07:10+08:00" level=debug msg="Google Answer: www.a.shifen.com. 262 IN A 14.215.177.37" time="2017-06-08T03:07:10+08:00" level=debug msg="Google Answer: www.a.shifen.com. 262 IN A 14.215.177.38" time="2017-06-08T03:07:10+08:00" level=debug msg="Google Answer: www.baidu.com. 536 IN CNAME www.a.shifen.com." time="2017-06-08T03:07:10+08:00" level=debug msg="Google Answer: www.a.shifen.com. 274 IN A 103.235.46.39" time="2017-06-08T03:07:12+08:00" level=debug msg="Question: ;www.baidu.com. IN AAAA" time="2017-06-08T03:07:12+08:00" level=debug msg="Domain match fail, try to use primary DNS" time="2017-06-08T03:07:12+08:00" level=debug msg="AliDNS Answer: www.baidu.com. 145 IN CNAME www.a.shifen.com." time="2017-06-08T03:07:12+08:00" level=debug msg="Finally use primary DNS" time="2017-06-08T03:07:13+08:00" level=debug msg="Google Fail: Response message is nil, maybe timeout, please check your query or dns configuration"

这是我curl一次测试所用的时间,平均都是3.5秒左右。 root@LEDE-X64:~# curl -o /dev/null -s -w %{time_namelookup} www.baidu.com 3.514464

cjjdaq commented 7 years ago

第一次给出ip,并且被ip列表命中,不知道为什么不直接返回,而且是从头再来一次,再来一次还是不返回ip,囧,最后等完成AlternativeDNS(也就是Google)步骤给出了ip。花时3.5秒。这个逻辑看不懂啊。 我已经整合进lede软路由当中了,可一启用,就是各种解析慢的蛋疼。

shawn1m commented 7 years ago

curl 的话 3.5 秒还好,我自己也用了 2.5 秒 (163 的话 3.5s)。可以把你的配置提供一下。 现在的逻辑是只要进了 IP 判断阶段,就同时向两个服务器发送解析请求,然后选择判定的结果输出。所以这种情况必定会输出两个 DNS 的查询结果。

time="2017-06-08T03:07:13+08:00" level=debug msg="Google Fail: Response message is nil, maybe timeout, please check your query or dns configuration"

这一句对应的是 AAAA 请求,其他的是 A 请求。

cjjdaq commented 7 years ago

不管使用什么样的逻辑,一个正常的国内网站花在解析上的时间必然不能超过1s,使用任何dns软件,我们首先不能拖慢国内域名的解析速度是不是这样,拉慢了本应该毫秒级解析出来的国内域名,那么使用ot还有什么优势呢,没有国内节点的网站要使用AlternativeDNS解析,解析慢是正常,因为AlternativeDNS一般配置的都时候国外的dns。

shawn1m commented 7 years ago

嗯,这方面是存在一些问题有待进一步测试改进。我自用一直都开启缓存,对此感受不是很深,如果实在很困扰的话开启缓存可以降低影响。 我最近比较忙没空解决这些问题,如果你愿意直接修改源码的话可以自己先试试。

cjjdaq commented 7 years ago

我就是不会呀golang,所以我才提出host匹配直接返回ip,白名单直接走PrimaryDNS,黑名单走AlternativeDNS,(其实就是主从dns各对应一个名单列表),不在对应名单的咱们再进行ip列表(这个列表还不全,也是个坑)匹配,ip列表命中的直接走PrimaryDNS(国内dns),没命中的再走AlternativeDNS(国外dns)。 参数可以这样 "IPNetworkFile"=iplist/ #(目录下.conf) "Primary_domain":Primary_domain/ #(目录下.conf) "Alternative_domain":Alternative_domain/ #(目录下*.conf) 这个目前ot已经有了,就是DomainFile 参数这样弄的原因是,ip.txt可以自动更新+用户自定义.txt,domain也是如此,可以自动更新dnsmasq_china_list作为白名单和gfwlist作为黑名单,外加自定义满足不同用户的要求。 这样一来,我们可以最大限度的保证国内站点的解析。使用港澳台等亚洲主机的网站,我们可以加入到Primary_domain的自定义列表中,免除因为没有匹配列表ip而且强制走Alternative带来的慢解析,同时还能够消除因为ip.txt列表不全导致强制走Alternative的蛋疼问题。 最终我们完全能够通过维护ip列表名单和domian列表来愉快的使用overture进行分流。完全靠程序本身智能分流显然是达不到效果的(根本原因是没有非常快的国外dns,除非用的非国内的亚洲高速主机,也存在各种抽的情况),还是要靠自身维护列表。按用户意愿来分流。

真心希望作者能考虑一下我的建议。如果拥有了这些功能再配上ss,那是一绝。

lybtongji commented 7 years ago

我把 ip_network_sample 清空改成 0.0.0.0/0,相当于关闭 IP network 匹配

shawn1m commented 7 years ago

第一个问题可以参考上面的回复。 第二个问题根据后面 issue 的情况应该已经得到解决,可以试试最新版本 1.3.6rc2。而且由于 Chrome 等软件在访问域名的时候会同时查询 A 和 AAAA 记录,所以关掉 RedirectIPv6Record 可以提高反应速度。