wolf-joe / ts-dns

Telescope DNS,灵活快速的DNS分组转发器
MIT License
316 stars 31 forks source link

关于 ecs 和 缓存的问题 #20

Closed rampageX closed 4 years ago

rampageX commented 4 years ago

这个应该是 0.10 就开始引入的问题:

  1. 在 clean 和 dirty 组指定不同的 ecs 地址,但是查询时,都是使用了 clean 组的 ecs;
  2. 缓存失效;

我的配置文件:

# Telescope DNS Configure File
# https://github.com/wolf-joe/ts-dns

listen = ":53"  # 监听端口,支持指定tcp/udp
gfwlist = "gfwlist.txt"  # gfwlist文件路径,release包中已预下载。官方地址:https://raw.githubusercontent.com/gfwlist/gfwlist/master/gfwlist.txt
gfwlist_b64 = true  # 是否使用base64解码gfwlist文件,默认为true
cnip = "cnip.txt"  # 中国ip网段列表,用于辅助域名分组
disable_ipv6 = true  # 禁用IPv6地址解析,默认为false

#hosts_files = [""]  # hosts文件路径,支持多hosts

[hosts] # 自定义域名映射
"example.com" = "8.8.8.8"
"cloudflare-dns.com" = "1.0.0.1"  # 防止下文提到的DoH递归解析
"dns.google" = "8.8.4.4"  # 防止下文提到的DoH递归解析
"dns11.quad9.net" = "9.9.9.11"
"dns.alidns.com" = "223.6.6.6"

[query_log]
file = ""  # dns请求日志文件,值为/dev/null时不记录,值为空时记录到stdout
ignore_qtypes = ["DNSKEY", "NS"]  # 不记录指定类型的dns请求,默认为空
ignore_cache = false  # 不记录命中缓存的dns请求,默认为false
ignore_hosts = false  # 不记录命中hosts的dns请求,默认为false

[cache]  # dns缓存配置
size = 4096  # 缓存大小,为负数时禁用缓存
min_ttl = 60  # 最小ttl,单位为秒
max_ttl = 86400  # 最大ttl,单位为秒

[groups] # 对域名进行分组
  [groups.clean]  # 必选分组,默认域名所在分组
  ecs = "202.96.134.133"  # edns-client-subnet信息,配置后转发DNS请求时默认附带(已有ecs时不覆盖),暂不支持doh
  dns = ["223.5.5.5", "106.54.204.98:5353"]  # DNS服务器列表,默认使用53端口
  dot = ["223.6.6.6:853@dns.alidns.com"]
  doh = ["https://dns.alidns.com/dns-query"]
  concurrent = true  # 并发请求dns服务器列表
#  rules = ["qq.com", ".baidu.com", "*.taobao.com"]  # "qq.com"规则可匹配"test.qq.com"、"qq.com"两种域名,".qq.com"和"*.qq.com"规则无法匹配"qq.com"
  rules_file = ""  # 规则文件,每行一个规则 domain_acclist_lite.txt
  fastest_v4 = false  # 选择ping值最低的ipv4地址作为响应,启用且使用icmp ping时建议以root权限允许本程序
  tcp_ping_port = 80  # 当启用fastest_v4时,如该值大于0则使用tcp ping,小于等于0则使用icmp ping

  [groups.dirty]  # 必选分组,匹配GFWList的域名会归类到该组
#  socks5 = "127.0.0.1:7575"  # 当使用国外53端口dns解析时推荐用socks5代理解析
  ecs = "202.67.222.222"  # edns-client-subnet信息,配置后转发DNS请求时默认附带(已有ecs时不覆盖),暂不支持doh
#  dns = ["8.8.8.8", "8.8.4.4"]  # 如不想用socks5代理解析时推荐使用国外非53端口dns,或自建dnscrypt-proxy
  dns = ["9.9.9.11:9953", "149.112.112.11:9953"]
  dot = ["8.8.4.4:853@dns.google", "9.9.9.11:853@dns.quad9.net"]  # dns over tls服务器
  # 警告:如果本机的dns指向ts-dns自身,且DoH地址中的域名被归类到该组,则会出现递归解析的情况,此时需要在上面的hosts中指定对应IP
  doh = ["https://dns11.quad9.net/dns-query", "https://dns.google/dns-query"]
#  rules = ["google.com"]  # 官方gfwlist里只有".google.com"规则,无法匹配"google.com",所以手动加上

  # 警告:进程启动时会覆盖已有同名IPSet
  ipset = ""  # 目标IPSet名称,该组所有域名的ipv4解析结果将加入到该IPSet中
  ipset_ttl = 86400 # ipset记录超时时间,单位为秒,推荐设置以避免ipset记录过多

  # 以下为自定义分组,用于其它情况
  # 比如办公网内,内外域名(company.com)用内网dns(10.1.1.1)解析
  [groups.work]
  dns = ["192.168.0.1"]
  rules = ["yd.mail"]

相关截图:

查询结果 2020-05-09_160208

查询日志 ts-dns-log

rampageX commented 4 years ago

开启 -vv 后的日志:

E:\DNSServer\ts-dns>ts-dns.exe -vv
time="2020-05-09T16:23:11+08:00" level=debug msg="show debug log"
time="2020-05-09T16:23:11+08:00" level=warning msg="disable ipv6 resolve"
time="2020-05-09T16:23:11+08:00" level=debug msg="ecs conf: <nil>"
time="2020-05-09T16:23:11+08:00" level=warning msg="enable concurrent dns in group clean"
time="2020-05-09T16:23:11+08:00" level=debug msg="ecs conf: 202.96.134.133/32/0"
time="2020-05-09T16:23:11+08:00" level=debug msg="ecs conf: 202.67.222.222/32/0"
time="2020-05-09T16:23:11+08:00" level=warning msg="listen on :53/udp"
time="2020-05-09T16:23:12+08:00" level=info msg="resolve doh (dns.alidns.com): [223.6.6.6]"
time="2020-05-09T16:23:12+08:00" level=info msg="resolve doh (dns11.quad9.net): [9.9.9.11]"
time="2020-05-09T16:23:12+08:00" level=info msg="resolve doh (dns.google): [8.8.4.4]"
time="2020-05-09T16:23:21+08:00" level=debug msg="question: [{twitter.com. 1 1}], extract: [\n;; OPT PSEUDOSECTION:\n; EDNS: version 0; flags: ; udp: 4096\n; COOKIE: b3e919823e96fbe9]"
time="2020-05-09T16:23:21+08:00" level=debug msg="set default ecs 202.96.134.133/32/0 to msg"
time="2020-05-09T16:23:21+08:00" level=debug msg="forward question [{twitter.com. 1 1}] to &{0xc000224930 223.5.5.5:53 <nil> 0xc00017b1a0}"
time="2020-05-09T16:23:21+08:00" level=debug msg="forward question [{twitter.com. 1 1}] to &{0xc0002249a0 106.54.204.98:5353 <nil> 0xc00017b200}"
time="2020-05-09T16:23:21+08:00" level=debug msg="forward question [{twitter.com. 1 1}] to &{0xc000224a10 223.6.6.6:853 <nil> 0xc00017b260}"
time="2020-05-09T16:23:21+08:00" level=debug msg="forward question [{twitter.com. 1 1}] to &{0xc00017b290 https://dns.alidns.com:443/dns-query [223.6.6.6] 443 dns.alidns.com}"
time="2020-05-09T16:23:21+08:00" level=info msg="match gfwlist" domain=twitter.com. group=dirty src=192.168.4.1 type=A
time="2020-05-09T16:23:21+08:00" level=debug msg="forward question [{twitter.com. 1 1}] to &{0xc000224b60 9.9.9.11:9953 <nil> 0xc00017b3b0}"
time="2020-05-09T16:23:22+08:00" level=debug msg="response: [twitter.com.\t743\tIN\tA\t104.244.42.129 twitter.com.\t743\tIN\tA\t104.244.42.193]"
time="2020-05-09T16:23:55+08:00" level=debug msg="question: [{twitter.com. 1 1}], extract: [\n;; OPT PSEUDOSECTION:\n; EDNS: version 0; flags: ; udp: 4096\n; COOKIE: a1fa9d69d2d044ee]"
time="2020-05-09T16:23:55+08:00" level=debug msg="set default ecs 202.96.134.133/32/0 to msg"
time="2020-05-09T16:23:55+08:00" level=debug msg="forward question [{twitter.com. 1 1}] to &{0xc000224930 223.5.5.5:53 <nil> 0xc00017b1a0}"
time="2020-05-09T16:23:55+08:00" level=debug msg="forward question [{twitter.com. 1 1}] to &{0xc0002249a0 106.54.204.98:5353 <nil> 0xc00017b200}"
time="2020-05-09T16:23:55+08:00" level=debug msg="forward question [{twitter.com. 1 1}] to &{0xc000224a10 223.6.6.6:853 <nil> 0xc00017b260}"
time="2020-05-09T16:23:55+08:00" level=debug msg="forward question [{twitter.com. 1 1}] to &{0xc00017b290 https://dns.alidns.com:443/dns-query [223.6.6.6] 443 dns.alidns.com}"
time="2020-05-09T16:23:55+08:00" level=info msg="match gfwlist" domain=twitter.com. group=dirty src=192.168.4.1 type=A
time="2020-05-09T16:23:55+08:00" level=debug msg="forward question [{twitter.com. 1 1}] to &{0xc000224b60 9.9.9.11:9953 <nil> 0xc00017b3b0}"
time="2020-05-09T16:23:55+08:00" level=debug msg="response: [twitter.com.\t710\tIN\tA\t104.244.42.129 twitter.com.\t710\tIN\tA\t104.244.42.193]"

疑问:

  1. level=debug msg="ecs conf: <nil>" 这个不知道怎么来的?是否影响了 dirty 组的 ecs 设置?
  2. twitter.com 在 gfwlist 里,为何 ts-dns 还是先发送去了 clean 组做查询?

另外,日志是否可以提供这些信息(Debug):

  1. 每一个上游服务器的返回结果;
  2. ts-dns 最后返回了哪个服务器的查询结果?
  3. ts-dns 返回了缓存中的结果,以及缓存的 TTL。
wolf-joe commented 4 years ago

debug信息加的比较晚,记录点也比较凌乱……比如每个group都会输出一次ecs conf: xxx,而不管这个group有没有配置ecs。这个会逐渐重构&改进,包括提到的新记录点。

目前ts-dns会优先请求clean组dns,只有当解析结果中出现非CN IP、且匹配gfwlist时才会请求dirty组dns,这也是为了避免出现https://github.com/wolf-joe/ts-dns/issues/1#issuecomment-598297650 提到的问题。 如果想让gfwlist强制走dirty组的话,可以在dirty组的rules_file里指定gfwlist文件。

以上提到的ecs bug、ecs缓存问题将在下个版本修复。

wolf-joe commented 4 years ago

v0.13.1已发布,修复自v0.11.0以来的默认添加ecs相关bug。