vernesong / OpenClash

A Clash Client For OpenWrt
MIT License
17.47k stars 3.18k forks source link

关于当前是否可避免DNS泄露的问题 #2750

Closed Lilies-of-the-valley closed 1 year ago

Lilies-of-the-valley commented 2 years ago

Verify Steps

OpenClash Version

v0.45.51-beta

Bug on Environment

Official OpenWrt

Bug on Platform

Linux-armv8

To Reproduce

DNS泄露测试链接:https://whoer.net/dns-leak-test

用以下在Clash for Windows处使用TUN模式运行无DNS泄露的简单配置:

script:
  shortcuts:
    QUIC: network == 'udp' and dst_port == 443
rules:
- SCRIPT,QUIC,Quick UDP Internet Connections
- DOMAIN,localhost,DIRECT
- DOMAIN-SUFFIX,local,DIRECT
- IP-CIDR,0.0.0.0/8,DIRECT,no-resolve
- IP-CIDR,10.0.0.0/8,DIRECT,no-resolve
- IP-CIDR,100.64.0.0/10,DIRECT,no-resolve
- IP-CIDR,127.0.0.0/8,DIRECT,no-resolve
- IP-CIDR,169.254.0.0/16,DIRECT,no-resolve
- IP-CIDR,172.16.0.0/12,DIRECT,no-resolve
- IP-CIDR,192.0.0.0/24,DIRECT,no-resolve
- IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
- IP-CIDR,198.18.0.0/15,DIRECT,no-resolve
- IP-CIDR,224.0.0.0/3,DIRECT,no-resolve
- IP-CIDR6,::1/128,DIRECT,no-resolve
- IP-CIDR6,fc00::/7,DIRECT,no-resolve
- IP-CIDR6,fe80::/10,DIRECT,no-resolve
- MATCH,Proxy
dns:
  enable: true
  listen: 0.0.0.0:7874
  enhanced-mode: fake-ip
  use-hosts: true
  nameserver:
  - 223.5.5.5
  fallback: ['208.67.222.222:5353', '208.67.220.220:5353', '208.67.222.220:5353', '208.67.220.222:5353', 'https://1.1.1.1/dns-query', 'https://1.1.1.2/dns-query', 'https://1.1.1.3/dns-query', 'https://1.0.0.1/dns-query', 'https://1.0.0.2/dns-query', 'https://1.0.0.3/dns-query', 'https://45.11.45.11/dns-query', 'https://146.112.41.2/dns-query', 'https://162.159.36.1/dns-query', 'https://162.159.46.1/dns-query', 'https://9.9.9.11:5053/dns-query', 'https://101.6.6.6:8443/dns-query', 'https://208.67.222.222/dns-query', 'https://208.67.220.220/dns-query', 'https://185.222.222.222/dns-query', 'https://101.101.101.101/dns-query', 'https://149.112.112.11:5053/dns-query']
  fallback-filter:
    geoip: false
  ipv6: false
  fake-ip-range: 198.18.0.1/16

Describe the Bug

预期行为:非UDP的协议无DNS请求。 结果:在试错调整了不少配置后始终无法避免DNS泄露

563 #1007 两个相似的issues里无任何可用信息

OpenClash Log

#此项有值时,如不使用IPv6,建议到网络-接口-lan的设置中禁用IPV6的DHCP
IPV6-DHCP: disabled

#此项结果应仅有配置文件的DNS监听地址
Dnsmasq转发设置: 127.0.0.1#7874

运行模式: fake-ip-tun
默认代理模式: rule
UDP流量转发(tproxy): 停用
DNS劫持: 启用
自定义DNS: 停用
IPV6代理: 停用
IPV6-DNS解析: 停用
禁用Dnsmasq缓存: 启用
自定义规则: 启用
仅允许内网: 启用
仅代理命中规则流量: 停用
仅允许常用端口流量: 停用
绕过中国大陆IP: 停用
DNS远程解析: 启用
路由本机代理: 启用

#启动异常时建议关闭此项后重试
混合节点: 停用
保留配置: 停用

#启动异常时建议关闭此项后重试
第三方规则: 停用

#===================== 自定义规则 一 =====================#
script:

rules:
- SRC-IP-CIDR,192.168.8.1/21,DIRECT,no-resolve

#===================== 自定义规则 二 =====================#

Expected Behavior

现在是否能做到无DNS泄露?若否且无计划的话我就不继续投资时间在这一方面了。

痛点主要是我自己维护配置,并倾向国外服务,但一些在国内有可用IP的服务因为DNS解析而被GEOIP,CN,Mainland China,no-resolve直连了(比如Apple.com :'()

Lilies-of-the-valley commented 2 years ago

附加的相关日志(用的另一份不会DNS泄露的配置):

[2022-10-17 05:36:28][DEBUG] [DNS] resolve cavgx1665956.ep.whrq.net error: couldn't find ip: cavgx1665956.ep.whrq.net
[2022-10-17 05:36:28][DEBUG] [DNS] resolve apygk1665956.ca.whrq.net error: couldn't find ip: apygk1665956.ca.whrq.net
[2022-10-17 05:36:28][DEBUG] [DNS] resolve ihyrl1665956.cy.whrq.net error: couldn't find ip: ihyrl1665956.cy.whrq.net
[2022-10-17 05:36:28][DEBUG] [DNS] resolve jkkih1665956.dz.whrq.net error: couldn't find ip: jkkih1665956.dz.whrq.net
[2022-10-17 05:36:28][DEBUG] [DNS] resolve eqnwb1665956.ef.whrq.net error: couldn't find ip: eqnwb1665956.ef.whrq.net
[2022-10-17 05:36:28][INFO] [TCP] 192.168.2.244:51016 --> cavgx1665956.ep.whrq.net:443 match Match() using Proxy[**]
[2022-10-17 05:36:28][INFO] [TCP] 192.168.2.244:51017 --> apygk1665956.ca.whrq.net:443 match Match() using Proxy[**]
[2022-10-17 05:36:28][INFO] [TCP] 192.168.2.244:51018 --> ihyrl1665956.cy.whrq.net:443 match Match() using Proxy[**]
[2022-10-17 05:36:28][INFO] [TCP] 192.168.2.244:51019 --> jkkih1665956.dz.whrq.net:443 match Match() using Proxy[**]
[2022-10-17 05:36:28][INFO] [TCP] 192.168.2.244:51021 --> eqnwb1665956.ef.whrq.net:443 match Match() using Proxy[**]
[2022-10-17 05:36:57][DEBUG] [Process] find process amp-api.apps.apple.com: netlink message: NLMSG_ERROR
[2022-10-17 05:36:57][DEBUG] [Process] find process api-edge.apps.apple.com: netlink message: NLMSG_ERROR
[2022-10-17 05:36:57][DEBUG] [Process] find process www.apple.com: netlink message: NLMSG_ERROR
[2022-10-17 05:36:57][DEBUG] [Process] find process www.apple.com: netlink message: NLMSG_ERROR
[2022-10-17 05:36:57][DEBUG] [Process] find process is1-ssl.mzstatic.com: netlink message: NLMSG_ERROR
[2022-10-17 05:36:57][DEBUG] [DNS] amp-api.apps.apple.com --> 183.240.58.86
[2022-10-17 05:36:57][DEBUG] [DNS] api-edge.apps.apple.com --> 183.240.58.86
[2022-10-17 05:36:57][DEBUG] [DNS] www.apple.com --> 223.111.101.29
[2022-10-17 05:36:57][DEBUG] [DNS] www.apple.com --> 223.111.101.29
[2022-10-17 05:36:57][DEBUG] [DNS] is1-ssl.mzstatic.com --> 183.240.58.86
[2022-10-17 05:36:57][INFO] [TCP] 192.168.2.244:51050 --> api-edge.apps.apple.com:443 match GeoIP(CN) using Mainland China[DIRECT]
[2022-10-17 05:36:57][INFO] [TCP] 192.168.2.244:51053 --> is1-ssl.mzstatic.com:443 match GeoIP(CN) using Mainland China[DIRECT]
[2022-10-17 05:36:57][INFO] [TCP] 192.168.2.244:51049 --> amp-api.apps.apple.com:443 match GeoIP(CN) using Mainland China[DIRECT]
[2022-10-17 05:36:57][INFO] [TCP] 192.168.2.244:51051 --> www.apple.com:443 match GeoIP(CN) using Mainland China[DIRECT]
[2022-10-17 05:36:57][INFO] [TCP] 192.168.2.244:51052 --> www.apple.com:443 match GeoIP(CN) using Mainland China[DIRECT]
zheshifandian commented 2 years ago

同问+1

Lilies-of-the-valley commented 2 years ago

@vernesong bump

photkey commented 2 years ago

@vernesong +1

vernesong commented 2 years ago

image

Lilies-of-the-valley commented 2 years ago

image

意思是DNS泄露当前无法避免且不在最近几个release的milestone安排里,只能通过DoH减少中间人被动窃听?

这样仍然会有一些在国内有可用IP的服务因为DNS解析而被GEOIP,CN,Mainland China,no-resolve直连了的问题。仍是我的痛点。

长期的考虑,有完善防DNS泄露相关机制的计划吗?

bluesyk commented 2 years ago

同样对DNS查询加密需求强烈,这样配置可以吗,我现在是这样配置的。(fack-ip增强模式)

1.勾选 本地劫持,自定义DNS服务器,禁止 Dnsmasq 缓存 DNS 2.去勾选 ,追加上游 DNS和追加默认 DNS //因为上游运营商提供的默认都不是安全的DNS查询) 3.自定义的DNS服务器,只使用DOH的。 name-server dns.alidns.com/dns-query fall-back dns.cloudflare.com/dns-query 其他多余的DNS服务器都不要了,感觉DNS多个并发查选优没有啥作用。

我暂时想到的避免DNS泄露的思路: 1.不使用系统的系统的DNS,全部使用自定义的安全的DNS查询,如DOH (管道加密) 2.全部通过VPS节点代理DNS查询,(源地址隐藏)

Lilies-of-the-valley commented 2 years ago

我暂时想到的避免DNS泄露的思路: 1.不使用系统的系统的DNS,全部使用自定义的安全的DNS查询,如DOH (管道加密) 2.全部通过VPS节点代理DNS查询,(源地址隐藏)

Clash core是可以做到第二点了,除了UDP协议的需要本地查询拿IP地址再转发给服务器端。我以前用Clash for Windows TUN + 白名单外的域名全部代理,Wireshark累计监听了几百个小时没有任何多余DNS查询(只有CN域名、节点域名、UDP协议域名)。

不在nameserver处用DoH的另一个考虑是GFW是在主动试图屏蔽DoH的,像到223.5.5.5 443端口或者SNI里有dns.cloudflare.com这种包的特征还不明显吗? https://en.wikipedia.org/wiki/Public_recursive_name_server 里面有几个DoH的可以用?DNS over TLS都全部封杀了哈哈,用DoH起码得自己搭建DoH服务吧。

国内网站寻常走UDP给国内DNS服务商53端口延迟低又也不会受GFW掐断DoH的影响被随机丢包。Clash core便是这样考虑的。

现在不管如何设置每个请求都有DNS泄露,可以试一下连接挖矿网站会不会收到来自学校/单位/ISP的警告邮件,光天白日裸行,除非每天战战兢兢更新规则表写明代理域名,可OpenClash又有配置更新问题,我每次得Disable再Enable后新的代理文件才会生效。

bluesyk commented 2 years ago

那还是国内和国外流量分流,包括DNS查询,但都是使用DOH。 国内的用阿里的,国外的用google的。 选择支持IPLC/IEPL的机场,通过分流查询这样性能也有保障。不追求绝对的安全,相对可接受就可以。 也就是上个google,youtube,instagram等,通过加密的DNS查询,最大程度的减少DNS查询被干扰。

当前路由器openclash基于上面的配置后,在电脑上针对dns.cloudflare.com的best trace结果 目标IP: 104.16.132.229 ( dns.cloudflare.com )

1 192.168.31.1 3 ms 4 ms 4 ms 局域网
2 192.168.5.1 3 ms 6 ms 6 ms 局域网

3 192.168.1.1 4 ms 5 ms 5 ms 局域网
4 10.22.0.1 6 ms 6 ms 6 ms 局域网

5 172.19.3.17 6 ms 8 ms 局域网
6 172.19.21.17 6 ms 7 ms 局域网
7
8
9
10 172.31.234.50 9 ms 9 ms 11 ms 局域网
11

12 211.139.139.37 13 ms 13 ms 13 ms 中国 广东 广州 chinamobile.com 移动 AS9808
13
*
14 111.24.5.209 15 ms 17 ms 25 ms 中国 广东 广州 chinamobile.com 移动 AS9808
15 111.24.5.178 11 ms 13 ms 13 ms 中国 广东 广州 chinamobile.com 移动 AS9808
16 221.183.68.145 13 ms 15 ms 20 ms 中国 广东 广州 chinamobile.com 移动 AS9808
17 221.183.25.117 14 ms 15 ms 16 ms 中国 广东 广州 chinamobile.com 移动 AS9808
18 221.183.55.57 15 ms 16 ms 18 ms 中国 广东 广州 chinamobile.com 移动 AS9808
19 223.120.13.221 173 ms 174 ms 175 ms 美国 加利福尼亚州 圣何塞 chinamobile.com 移动 AS58453
20 223.120.6.70 174 ms 174 ms 174 ms 美国 加利福尼亚州 圣何塞 chinamobile.com 移动 AS58453
21 223.119.66.102 177 ms 178 ms 179 ms 美国 加利福尼亚州 圣何塞 chinamobile.com 移动 AS58453
22 172.71.152.4 174 ms 176 ms 177 ms 美国 加利福尼亚州 圣何塞 cloudflare.com AS13335
23 104.16.132.229 177 ms 178 ms 180 ms CLOUDFLARE.COM cloudflare.com AS13335

当前手机上的quantumultx,就禁用了系统dns,只配置了一个阿里的doh,也不追求绝对的安全。 通过阿里的doh,解析google,youtube等都正常,平常也就是用google查查资料,看看youtube视频等。

Lilies-of-the-valley commented 2 years ago

@bluesyk DNS来回350 ms+,再加上一个HTTPS代理那起步链接建立就得一秒,对于不在代理名单里的小网站,你的Fake-ip和Redir-host有什么区别吗?

另外你偏题了,这个Issue是反应Clash core内能做到DNS不泄露不需要用DoH,但OpenClash内尚不行的问题。

bluesyk commented 2 years ago

补充:测试best trace是用redir-host模式,fake ip模式测不了. 对dns.cloudflare的平均相应是170ms,对dns.google的平均是27ms,但用dns.google感觉页面速度也没有上去,感觉还没有用dns.cloufflare的时候快,原因未知,所以fallback 就继续用cloudflare了. 嗯,跑题了,暂停发散.

Lilies-of-the-valley commented 2 years ago

@vernesong bump

vernesong commented 2 years ago

问题就是GEOIP,CN,Mainland China,no-resolve触发了DNS,这也不是插件的问题啊

Lilies-of-the-valley commented 1 year ago

@vernesong no-resolve即显式地告诉Clash不resolve DNS。在Clash for Windows下确实也无DNS解析,但OpenClash有…… 且以下这份完全无GEOIP,CN,Mainland China,no-resolve的配置也会DNS泄露

script:
  shortcuts:
    QUIC: network == 'udp' and dst_port == 443
rules:
- SCRIPT,QUIC,Quick UDP Internet Connections
- DOMAIN,localhost,DIRECT
- DOMAIN-SUFFIX,local,DIRECT
- IP-CIDR,0.0.0.0/8,DIRECT,no-resolve
- IP-CIDR,10.0.0.0/8,DIRECT,no-resolve
- IP-CIDR,100.64.0.0/10,DIRECT,no-resolve
- IP-CIDR,127.0.0.0/8,DIRECT,no-resolve
- IP-CIDR,169.254.0.0/16,DIRECT,no-resolve
- IP-CIDR,172.16.0.0/12,DIRECT,no-resolve
- IP-CIDR,192.0.0.0/24,DIRECT,no-resolve
- IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
- IP-CIDR,198.18.0.0/15,DIRECT,no-resolve
- IP-CIDR,224.0.0.0/3,DIRECT,no-resolve
- IP-CIDR6,::1/128,DIRECT,no-resolve
- IP-CIDR6,fc00::/7,DIRECT,no-resolve
- IP-CIDR6,fe80::/10,DIRECT,no-resolve
- MATCH,Proxy
dns:
  enable: true
  listen: 0.0.0.0:7874
  enhanced-mode: fake-ip
  use-hosts: true
  nameserver:
  - 223.5.5.5
  fallback: ['208.67.222.222:5353', '208.67.220.220:5353', '208.67.222.220:5353', '208.67.220.222:5353', 'https://1.1.1.1/dns-query', 'https://1.1.1.2/dns-query', 'https://1.1.1.3/dns-query', 'https://1.0.0.1/dns-query', 'https://1.0.0.2/dns-query', 'https://1.0.0.3/dns-query', 'https://45.11.45.11/dns-query', 'https://146.112.41.2/dns-query', 'https://162.159.36.1/dns-query', 'https://162.159.46.1/dns-query', 'https://9.9.9.11:5053/dns-query', 'https://101.6.6.6:8443/dns-query', 'https://208.67.222.222/dns-query', 'https://208.67.220.220/dns-query', 'https://185.222.222.222/dns-query', 'https://101.101.101.101/dns-query', 'https://149.112.112.11:5053/dns-query']
  fallback-filter:
    geoip: false
  ipv6: false
  fake-ip-range: 198.18.0.1/16

调了许多设置也无法做到不DNS泄露,看running configuration也没有问题……能麻烦抽时间复现一下吗?谢谢啦!

vernesong commented 1 year ago

把SCRIPT删了

Lilies-of-the-valley commented 1 year ago

更改为SCRIPT,QUIC,Quick UDP Internet Connections,no-resolve后无泄露,见Dreamacro/clash/issues/2192。不知Clash For Windows 0.19.17有何神奇处理。

谢谢!

frui85 commented 11 months ago

更改为SCRIPT,QUIC,Quick UDP Internet Connections,no-resolve后无泄露,见Dreamacro/clash/issues/2192。不知Clash For Windows 0.19.17有何神奇处理。

谢谢!

估计加了“no-resolve”,意思是不会向dns发起解析请求,所以解决了