A-A+

OpenWRT+MOSDNS+OpenClash防止dns泄漏

2024年01月23日 10:17 汪洋大海 评论 1 条 共3976字 (阅读4,532 views次)

前言

OpenClash请使用Meta内核, 某项设置仅支持Meta内核

环境

软路由: R4S, 固件来自haiibo大佬. 有点小毛病, 对电源要求过高?, 5v3a电源也会高负载重启, 温度正常, 和turbo acc网络加速里sfe和软件流量分载都是默认勾选, 需要手动全部点掉再选.
骷髅头最后一版固件, 已知问题docker容器进不去命令行, 其他正常

参考文献

笔者文笔不好, 建议参考恩山大佬的图文设置, 这里只是改了部分设置
https://www.right.com.cn/forum/thread-8284982-1-1.html
https://www.right.com.cn/forum/thread-8293938-1-1.html

思路

不使用OpenClash自带的dns模块, 将dns解析工作交给Mosdns处理, 并把解析国外ip请求转发给远程dns(即代理服务器).

操作开始

一.设置mosdns

  1. 进入服务→Mosdns, 取消勾选"DNS 转发", 勾选"本地 DNS", 按需填写"上游 DNS 服务器" "远程 DNS"和修改"Bootstrap DNS 服务器", 其中"远程 DNS"填入dot/doh服务器, 如图.
    OpenWRT+MOSDNS+OpenClash防止dns泄漏
  2. 进入 高级选项 选项卡, 勾选"防止 DNS 泄漏", 其余选项按需设置, 但请不要勾选"远程 DNS 启用 HTTP/3".
    其余规则请按需设置, 这里跳过使用默认设置.

二.设置OpenClash

  1. 模式选择
    进入服务→OpenClash, 在插件设置→模式设置里勾选"使用 Meta 内核", 运行模式随意, 笔者因为有智能家居缘故仍然使用Redir-Host模式. 后记: 请勾选转发udp或者使用tun模式,否则会出现Web RTC泄漏
    进入DNS设置标签, 本地 DNS 劫持选择使用Dnsmasq转发, 并勾选禁止 Dnsmasq 缓存 DNS.
    OpenWRT+MOSDNS+OpenClash防止dns泄漏
    OpenWRT+MOSDNS+OpenClash防止dns泄漏
  2. dns设置
    进入覆写设置→DNS设置,勾选"自定义上游 DNS 服务器", 在下一栏设置自定义上游 DNS 服务器里将NameServer,FallBack里的dns服务器全部取消勾选.
    在NameServer里添加服务器,地址127.0.0.1,端口5335,服务器类型为UDP.
    在Default-NameServer里添加任意国内/国外可以访问的dns服务器, 但不能设置为走代理服务器, 这里以阿里dns为例(加多少无所谓, 但是不能走代理) 并勾选节点域名解析, 最后会探讨这个设置的原因.
    Update: 在mosdns的规则列表→白名单内添加"domain:你节点的主域名"即可, 不需要折腾Default-NameServer
    OpenWRT+MOSDNS+OpenClash防止dns泄漏
    OpenWRT+MOSDNS+OpenClash防止dns泄漏
    OpenWRT+MOSDNS+OpenClash防止dns泄漏
  3. 其他设置
    在Meta设置里勾选"启用流量(域名)探测"和"探测(嗅探)纯 IP 连接", 其余OpenClash的设置按需选择, 这里不过多赘述. 设置完成后保存并应用, 可以访问
    https://browserleaks.com/dns
    https://ipleak.net/
    检查是否有dns泄漏, 即列表中是否出现中国服务器. 而且也能在Clash的web控制台看到dns请求的连接
    OpenWRT+MOSDNS+OpenClash防止dns泄漏
    OpenWRT+MOSDNS+OpenClash防止dns泄漏
    OpenWRT+MOSDNS+OpenClash防止dns泄漏

三(可选).设置adgurad home广告过滤

进入服务→openclash, 插件设置→dns设置, 将本地 DNS 劫持改为禁用, 应用配置.
进入网络→DHCP/DNS, 基本设置 dns转发里填入127.0.0.1#54, hosts和解析文件 勾选忽略解析文件, 高级设置 将DNS 查询缓存的大小改为0, 保存并应用
进入服务→AdGuard Home, 如果没有用过会没有核心, 请先更新核心版本, 我的固件默认带了配置, 如果没有可以去恩山偷一个粘贴进手动设置, 勾选启用, 6060重定向为定向53端C到AdGuardHome, 其余随意.
进入http://192.168.11.1:3000/ 账户密码默认root admin, 不对可以找教程更改. 在设置→dns设置, 上游dns服务器填入127.0.0.1:7874(端口在openclash全局设置 基础设置里可以查看), 选择并行请求, 记得点击应用并测试是否可用. 清空后备 DNS 服务器和私人反向 DNS 服务器, 取消勾选使用私人反向 DNS 解析器, 其余选项随意.
进入过滤器→dns黑名单, 添加黑名单, 添加一个自定义列表, 名称随意, url https://ghproxy.com/https://raw.githubusercontent.com/217heidai/adblockfilters/main/rules/adblockdns.txt 项目来自https://github.com/217heidai/adblockfilters 我暂时就用了这个, 如果过滤效果不好可以再加.
如有误伤, 可以在查询日志里找到被拦截的域名然后选择放行, 或者在过滤器→自定义自定义过滤规则里手动添加
想测试拦截效果可以进入一下两个网站测试
https://adblock-tester.com/
https://d3ward.github.io/toolz/adblock.html

一些疑问

这里列出一些我在部署时遇到的一些问题, 供大家参考.
Q1.为什么要勾选"探测(嗅探)纯 IP 连接"
A1.如果不勾选控制台内不会看到dot的连接, 而dot的连接是有的. 如果纯使用dot测试也不会出现dns泄漏, 这里就先选上, 以后有更好的方法再修改.

Q2.为什么要在Default-NameServer里添加一个dns服务器并勾选节点域名解析
A2.这里先理清Mosdns的流程(这里讨论使用内置配置, 不是手动写配置), Mosdns会内置geoip和geosite来为国内外域名分流.这里引用一张恩山大佬做的流程图.
OpenWRT+MOSDNS+OpenClash防止dns泄漏
当请求的域名为已知的国内域名, Mosdns会将请求发送给设置的上游 DNS 服务器(国内dns服务器), 获取到ip再返回.
当请求的域名为无法对应geodata里的数据或者对应为国外域名, 则会送给远程dns请求, 而我们开启了防止dns污染, 要将请求送给代理服务器, 让代理服务器为我们发送dns请求. 此时dns请求就由openclash转发给你所设置的代理节点.
简单说就是clash要连接节点就要对节点域名做dns请求, 但是我们设置的dns地址只有mosdns, 请求就发给mosdns, mosdns发现域名是国外的就又把请求丢给了clash, 但是clash没有节点ip发送请求就又会对节点域名做dns请求, 此时就会死循环.
查看mosdns的日志也会发现有很多的报错,大致都是forward_remote upstream error {"uqid": 1288, "qname": "节点域名.", "qtype": 1, "qclass": 1, "upstream": "tls://9.9.9.9", "error": "context deadline exceeded"}' 也就是dns请求超时的意思.
其实这也好解决, 可以如上面恩山的教程在fallback里加入可以访问的dns服务器. 但是会引出另一个问题, 原贴在hostloc的第二点疑问, 这里节选一部分

  1. 发生了2次Fake IP
    https://www.right.com.cn/forum/thread-8284982-1-1.html 这里,第12步的地方,是将Clash的NameServer设置为了127.0.0.1,假设请求的是国外站点A,会发生如下流程:

- 客户端发起DNS,来到MosDNS
- MosDNS判断为国外域名,转到Clash
- Clash返回Fake IP,并记录到自己的映射表
- 客户端用Fake IP发起请求
- 请求被Clash截获,Clash从映射表拿到原始域名
- 使用原始域名匹配路由规则,如果没有匹配到,会尝试使用IP规则分流
- Clash发起DNS拿IP,此时会同时从nameserver组和fallback组内的DNS服务器发起请求
- NameServer的127.0.0.1是自身,DNS又轮回了一遍,重新进到MosDNS,然后判断国外域名又被分流到Clash,Clash再次返回Fake IP
- 因为是Fake IP,所以Clash会抛弃,去使用fallback的结果
最终虽然通过fallback成功拿到真实IP,但是也多了一次DNS查询,这个查询兜了一圈,回到Clash并再次触发了Fake IP。
其实127.0.0.1也还算好的,如果不小心在NameServer组配置了国内的DNS服务器,那就是发生DNS泄露了。

题主假设的环境为fakeip,其实在redir-host模式下也能猜到结果, 对nameserver的请求多半因为等待fallback的结果而超时.
此时我们再利用clash meta可以单独设置节点域名解析的特性来规避这个问题(具体配置详情见wiki), 但是因为openclash并没有为这一项设置单独开发ui界面, 所以我们将dns服务器放入default-nameserver里, 而default-nameserver里的dns服务器仅用于对fallBack和nameserver的doh域名解析, 并不会参与分流的dns解析中来, 可以规避dns泄漏问题, 当然你也可以手动修改配置文件添加proxy-server-nameserver.

Q3.hostloc的帖子里第一点"针对国内站点的请求在Clash里全部变成只能根据IP规则路由了"
A3.dns请求没过openclash截取不到域名, 将openclash放在adgurad前/后即可

结尾

非常感谢你能看到这里, 如果配置有任何问题可以留下你的评论.
水完这次的文章我又可以潜水好几个月了.

文章来源:https://www.20040313.xyz/index.php/2023/09/22/openwrtmosdnsopenclash%E9%98%B2%E6%AD%A2dns%E6%B3%84%E6%BC%8F/

布施恩德可便相知重

微信扫一扫打赏

支付宝扫一扫打赏

×

1 条留言  访客:1 条  博主:0 条

  1. immortal

    webrtc泄漏是我没想到的

给我留言