在之前的文章里我介绍了ChinaDNS防DNS污染的原理和方法,但ChinaDNS已经有相当长时间没有更新,它也有一些小的缺点,例如不支持ipv6的解析等。
于是最近研究了一下ChinaDNS-NG,发现确实要强大不少。ChinaDNS-NG可以看作是ChinaDNS的重构加强版本,工作原理和ChinaDNS类似,可以使用域名黑白名单和中国区域IP列表来获取未被污染的DNS解析结果,其改进之处包括:
- 使用 epoll 和 ipset(netlink) 实现,性能更强。
- 完整支持 IPv4 和 IPv6 协议,兼容 EDNS 请求和响应。
- 手动指定国内 DNS 和可信 DNS,而非自动识别,更加可控。
- 修复原版对保留地址的处理问题,去除过时特性,只留核心功能。
- 修复原版对可信 DNS 先于国内 DNS 返回而导致判断失效的问题。
- 支持
gfwlist/chnlist
黑/白名单匹配模式,效率比 dnsmasq 更高。
ChinaDNS-NG的详细介绍和工作原理见github项目地址: zfl9/chinadns-ng: chinadns next generation, refactoring with epoll and ipset (github.com)
也已经有大佬将其移植到了OpenWrt环境(带LuCi界面): pexcn/openwrt-chinadns-ng: ChinaDNS Next Generation for OpenWrt, refactoring with epoll and ipset. (github.com)
不过我编译了该版本的ChinaDNS-NG和LuCi界面,发现还是有一些问题,不是很符合自己的需求。例如他把配置文件放在了ChinaDNS-NG软件包中,而不是放在LuCi软件包中,虽然单独使用他的ChinaDNS-NG软件包和LuCi软件包的话没有问题,但是如果你使用的OpenWrt固件中已经包含了ChinaDNS-NG软件包(例如passwall就会内置ChinaDNS-NG),那么编译时会有冲突,编译出的固件会缺少配置文件,导致ChinaDNS-NG执行文件无法运行。
另外该版本的LuCi界面还是比较简陋,只能满足基本的设置,部分操作还是需要使用命令行,另外也有一些BUG。
研究了一下LuCi界面的编写,发现似乎不是很难,于是考虑自己对ChinaDNS-NG的LuCi界面进行一下改造,也是为了学习一下LuCi的开发。经过几天的学习和尝试,在解决了一堆问题之后,终于成功完成。
改造后的对ChinaDNS-NG的LuCi界面如下:



相对于pexcn大佬仓库中的版本,改进如下:
- 调整了文件结构,相关文件都放到luci-app-chinadns-ng包里面,chinadns-ng包只有可执行文件,方便已安装chinadns-ng的情况下使用(比如passwall内置了chinadns-ng)
- 修改了界面,类似lean系列luci界面
- 使用ucitrack来管理进程,保存设置后会自动重启进程
- WEB界面上可以直接修改自定义黑白名单
- WEB界面上可以直接更新chnroute和路由表,也可以一键开启自动更新
- 解决了停用应用后ipset中chnroute和chnroute6未清除的问题
在写这个LuCi界面的时候确实学到了不少东西,对OpenWrt的一些运作方式也有了更深入的理解。
源代码和编译的ipk包已经上传到我的github仓库: NagaseKouichi/openwrt-chinadns-ng: ChinaDNS Next Generation for OpenWrt, refactoring with epoll and ipset. (github.com)
ipk软件包使用方法:
下载我的仓库中的chinadns-ng_1.0-beta.23-1_x86_64.ipk、luci-app-chinadns-ng_1.1-6_all.ipk、luci-i18n-chinadns-ng-zh-cn_1.1-6_all.ipk并上传到OpenWrt,依次安装即可。
如果你的OpenWrt固件已经安装了chinadns-ng软件包(例如固件中有内置了ChinaDNS-NG的PassWall),则只需要安装luci-app-chinadns-ng_1.1-6_all.ipk、luci-i18n-chinadns-ng-zh-cn_1.1-6_all.ipk即可。
编译OpenWrt时内置到固件的方法:
只需要在make menuconfig之前执行以下命令,clone源代码:
git clone https://github.com/NagaseKouichi/openwrt-chinadns-ng.git package/chinadns-ng git clone -b luci https://github.com/NagaseKouichi/openwrt-chinadns-ng.git package/luci-app-chinadns-ng
然后运行make menuconfig,勾选luci-app-chinadns-ng再编译即可。如果package中已经包含了chinadns-ng(比如同时编译PassWall的情况),则只需要clone luci-app-chinadns-ng这个软件包的源代码。
Comments | NOTHING