Openwrt 旁路由 + MoDNS + Openclash + Adguard Home 配置教程

这篇文章是 openwrt 系列 15 篇文章中的第 6 篇

DNS 解析工作流程

DNS 优化的原则

  1. 需要被代理的域名、必须在远端代理服务器上进行解析、才能得到最合适的解析结果。
  2. 在本地对需要代理的域名进行 DNS 解析,只不过是为了让 Surge/Clash 等软件能够基于 IP 分流(Surge/Clash 的 TUN/TAP 会直接返回 Fake IP、本地 DNS 解析的结果根本不会暴露给外部)罢了。

Fake-IP(增强)模式

  1. 客户端进行通讯时会先进行 DNS 查询目标 IP 地址,拿到查询结果后再尝试进行连接。
  2. Fake-IP 模式在客户端发起 DNS 请求时会立即返回一个保留地址(198.18.0.1/16),同时向上游 DNS 服务器查询结果,如果判定返回结果为污染或者命中代理规则,则直接发送域名至代理服务器进行远端解析。
  3. 此时客户端立即向 Fake-IP 发起的请求会被快速响应,节约了一次本地向 DNS 服务器查询的时间。
  4. 因为采用 fake-ip 模式,DNS 是在远端 airport 托管服务器进行解析,openclash 的 DNS 只配置 nameserver 组进行查询规则匹配即可。
    image.png

准备

  1. Openclash 插件核心更新到最新版
  2. Adguar Home 插件核心更新到最新版

正文

Openclash + MoDNS + Adguard 设置

  1. Openwrt 网络设置 -> 防火墙
    image.png

  2. Openwrt 网络设置 -> 接口 -> 选择 LAN 口修改
    image.png
    image.png
    image.png
    image.png

  3. Openwrt 修改 DHCP/DNS 的常规设置
    image.png
    image.png
    image.png
    image.png

  4. 修改 MosDNS
    image.png
    image.png

  5. Openclash 插件设置
    image.png
    image.png
    image.png
    image.png
    image.png
    image.png

  6. Adguard Home 设置
    image.png
    image.png

  7. 关闭浏览器安全 DNS 功能

Openclash 开发者自定义配置

目的:实现 国内流量完全不走 Clash 核心
在使用此配置组合时,发现即便是 DNS 解析国内域名返回的时非 FakeIP,但流量依旧走 OpenClash 内核
image.png
如上图,baidu 也通过 openclash 访问
因此在网上搜索,参考了这个博客:https://songchenwen.com/tproxy-split-by-dns
虽然 DNS 分流方式和论坛中的方式略有差异,但思路可以借鉴。
其中关键的配置调整如下:
首先:插件设置 - 模式设置 - 运行模式 必须 切换到 Fake-IP(增强)模式,其他方式即便修改了防火墙规则,也无法使国内流量避开 OpenClash 流量转发
然后:在 插件设置 - 开发者选项 中替换为附件中的脚本。
脚本主要的逻辑:删除 Openclash 创建的规则,删除成功后,即可实现只对 Fakeip 的流量通过 OpenClash 转发

OpenClash NFTables 默认规则如下,红框为对 TCP 流量的默认转发规则
image.png

由于我的 OpenWRT 为22.03.5 版本,防火墙默认实现改为了 NFTables,
我按照博客中实现的思路 使用 NFTables 命令删除了 OpenClash 创建的规则
注意:由于删除了默认转发规则,部分直连 IP 且需要代理的应用会上网海淘失败,因此需要对个别不需要 DNS 解析直接上网海淘的应用特殊处理,如:****电报。

由于我的 OpenWRT 版本使用的是非 Iptables 防火墙,Iptables 命令我没有做测试,仅做参考(有朋友已经测试通过了),
如果导致无法正常代理 science,删除自定义规则重新启动 OpenClash 即可恢复。

按如上步骤删除规则并配置好,通过 MosDns 解析的国内 IP 流量将不会通过 OpenClash 转发,体现在 Openclash 的控制面板中查看不到国内的流量,理论上性能会有所提升,同时路由器也可以正常开启使用 Ipv6。

具体你可以看一下 OpenClash 的启动日志,如果是 NFTables 会有相应提示,否则应该是 Iptables
image.png

Modns 安装

opkg update
opkg install curl

sh -c "$(curl -ksS https://raw.githubusercontent.com/sbwml/luci-app-mosdns/v5/install.sh)"

问题 1:AdGuardHome 未运行未重定向这时候在后台 ssh 执行

用 ssh 登录 openwrt 后,输入下面的代码回车即可,无需重启 openwrt

chmod 755 /etc/init.d/AdGuardHome service AdGuardHome restart

问题 2:AdGuardHome 运行中未重定向 核心版本:v0.102.0 没有配置文件 no core 没有核心

这时候登录 http://192.168.2.1:3000/install.html进行配置既可。,注意ip改成你自己的ip。 网页端口改 所有 3000 dns 服务 所有 55 你也可以自己改 默认的 53 端口已经被占用

配置成功后会有如下提示:

配置您的设备 为保证 AdGuard Home 可以开始正常工作,您需要在设备上对其进行配置。AdGuard Home DNS 服务器正在监听以下地址: 127.0.0.1:55 192.168.0.50:55 192.168.2.1:55 [::1]:55 [fdad:ca6e:cd0b::1]:55 恭喜 AdGuardHome 运行中已重定向

这时候在 openwrt 后台查看 AdGuardHome 已经正常运行了。

回到 openwrt 下的 AdGuardHome 管理界面,刷新后重新尝试更新核心文件后启动 AdGuardHome 服务即可。

转载自恩山,结合了本人在使用过程中,做了部分调整,以做记录

系列目录<< Openwrt SmartDNS 及相关配置Openwrt 旁路由设置的三种方式 >>