因为某些原因需要解决 DNS 污染问题,本来打算用 Pdnsd + Dnsmasq 组合的,
结果发现 TCP 请求效率太低加上家里网络与那些国外的 DNS 丢包实在是严重,
所以打算用 Pcap_DNSProxy 代替 Pdnsd 。
Pcap_DNSProxy 的安装与配置
Pcap_DNSProxy
是一个基于 WinPcap/LibPcap 用于过滤 DNS 投毒污染的工具,
提供支持正则表达式的 Hosts 提供更便捷和强大的修改 Hosts 的方法,
以及对 DNSCurve/DNSCrypt 协议、并行和 TCP 协议请求的支持。
多服务器并行请求功能,更可提高在恶劣网络环境下域名解析的可靠性。
下载安装
下载完成后将 ipk 文件传入 OpenWrt 中然后使用 opkg 安装:
1 | opkg install pcap-dnsproxy_0.4.6.1-1_ar71xx.ipk |
如果安装失败请根据提示安装相应依赖:
1 | opkg update |
对于配置,可以直接使用默认的其实就是懒,
如果想调整,可以去看项目文档,
写的很详细。不过请确保监听端口为非 53 端口。
启动程序
修改 /etc/config/pcap-dnsproxy
文件的 enabled 值为 1 后
1 | /etc/init.d/pcap-dnsproxy enable |
Dnsmasq 配置
Pcap-DNSProxy 本身就是一个完整的解决 DNS 污染的工具,
不过它的 OpenWrt 版不建议用于对国内域名解析,
所以需要使用 Dnsmasq 来解析国内 IP 。
Dnsmasq 属于 OpenWrt 自带软件,
所以我们只需要修改它的配置文件,让它将国内域名解析指向国内的 DNS ,
国外的其余的指向 Pcap_DNSProxy 的监听端口就好了。
根据自己的需求和实际修改 Dnsmasq 的配置文件/etc/dnsmasq.conf
如下:
1 | no-resolv /* 此处防止获取到ISP DNS从而干扰解析 */ |
因为 Dnsmasq 可以根据你的配置重定向指定域名到指定 DNS 服务器,
所以我们可以使用 dnsmasq-china-list
项目来将国内域名指向国内的 DNS 服务器。
根据上面的配置,建立 /etc/dnsmasq.d/
文件夹存放配置
1 | wget --no-check-certificate https://raw.githubusercontent.com/felixonmars/dnsmasq-china-list/master/accelerated-domains.china.conf |
PS: 请重新安装 wget 获取 https 支持。
然后重启 Dnsmasq 就 OK 了。
维护
Dnsmasq 的分流列表是需要更新的,这时候我们就需要 Cron 来帮助自动更新。
先在 /usr/bin
下新建 updatelist.sh
文件
1 | rm -rf /etc/dnsmasq.d/accelerated-domains.china.conf |
使用 chmod +x updatelist.sh
将其改成可执行。
然后进入 OpenWrt 的 Luci 页面,打开 系统 -> 计划任务 输入:
1 | 0 1 * * 3 updatelist.sh /* 每周三 1:00 更新 Dnsmasq 分流列表 */ |
端口监听
有的时候 Pcap 会崩溃导致 DNS 解析失败,所以需要有一个 Cron 来对它进行监测。
按更新 Dnsmasq 的方法建立 pcap.sh
文件
1 | #!/bin/sh |
并在计划任务添加:
1 | */1 * * * * pcap.sh |
这个脚本会每隔一分钟检查 Pcap 的监听端口是否存在,如果不存在就重启 Pcap 进程。