使用 Dnsmasq 屏蔽广告

2019-06-09 17:55:33

最近 NGA App 升级了,升级的重要功能就是在帖子列表页也加上了广告,让人无法忍受。今天就来治理一下。

因为App不像浏览器一样,可以使用内容拦截器(比如uBlock Origin)进行广告拦截。所以只能换个思路,在域名解析的时候将广告域名屏蔽。因为只是轻量级的屏蔽,所以 dnsmasq 这个工具就可以发挥作用了。

与一般的路由器安装不一样,根据我家里的环境,我使用 VMWare Exsi 虚拟一台 CentOS 7 系统的机器来安装 Dnsmasq。虚拟机创建后,在路由器将其 IP 固定为 192.168.0.150(可根据环境不同自定义)。然后SSH 到主机上,开始安装和配置。

一、安装 Dnsmasq 与初步配置

Dnsmasq 已经在 YUM 源中,所以只需要执行一下语句即可安装:

sudo yum install dnsmasq -y

安装好后,修改 dnsmasq 的配置文件:

sudo vi /etc/dnsmasq.conf

该配置文件绝大部分是已经注释掉的,如果有没有注释的(比如在 CentOS 7 中,该文件最末尾 conf-dir 选项未注释),在未注释的行首添加 # 符号注释掉即可。我们手写如下配置:

resolv-file=/etc/resolv.dnsmasq.conf
strict-order
no-hosts

以上语句指定了:

  1. dnsmasq 的上游 DNS 服务器地址在 /etc/resolv.dnsmasq.conf 中定义;
  2. resolv.dnsmasq.conf 中的上游DNS服务器按照顺序使用;
  3. 不使用 /etc/hosts 文件中的自定义解析

然后我们编辑 resolv.dnsmasq.conf 文件:

sudo vi  /etc/resolv.dnsmasq.conf 

内容为:

114.114.114.114
119.19.29.29
8.8.8.8

已上语句指定了:

  1. 先使用 114 DNS
  2. 再使用腾讯 DNS
  3. 最后使用谷歌 DNS

此时,基本的 Dnsmasq 就配置好了。可以使用如下语句启动:

systemctl start dnsmasq.service

如果需要开机启动,则运行:

systemctl enable dnsmasq.service

二、配置去广告规则

根据域名去广告的基本原理就是将广告域名解析到一个不存在的地址。Github 上有一个项目专门做这个工作。

https://github.com/notracking/hosts-blocklists

将这个项目里面提供的两个文件下载到 /etc/dnsmasq.d/ 目录中:

cd /etc/dnsmasq.d/
wget -c https://raw.githubusercontent.com/notracking/hosts-blocklists/master/hostnames.txt
wget -c https://raw.githubusercontent.com/notracking/hosts-blocklists/master/domains.txt

然后修改 dnsmasq 配置文件:

vi /etc/dnsmasq.confi

将以下两行加入:

conf-file=/etc/dnsmasq.d/domains.txt
addn-hosts=/etc/dnsmasq.d/hostnames.txt

现在你的完整 dnsmasq.conf 文件应该为:

resolv-file=/etc/resolv.dnsmasq.conf
strict-order
no-hosts
conf-file=/etc/dnsmasq.d/domains.txt
addn-hosts=/etc/dnsmasq.d/hostnames.txt

此时我们重启 dnsmasq 服务即可实现去广告:

systemctl stop dnsmasq.service
systemctl start dnsmasq.service

三、如何进行故障排查?

在 dnsmasq.conf 中加入:

log-queries
log-facility=/var/log/dnsmasq.log

然后重启 dnsmasq 服务,执行以下命令可查看日志:

tail -f /var/log/dnsmasq.log

配置成功后可以将日志功能关闭,避免占用太多磁盘空间。

四、其他机器不能访问到 dnsmasq 服务?

先使用以下命令检查 dnsmasq 服务状态:

systermctl status dnsmasq.service

如果已开启,再使用以下命令检查是否真的在运行:

netstat -tunlp |grep 53

如果没问题,则可能是防火墙禁用了53端口。CentOS 7 默认起用了 firewall 程序,只放行了 22 端口。使用以下命令放行 53 端口的请求:

firewall-cmd --zone=public --add-port=53/tcp --permanent
firewall-cmd --zone=public --add-port=53/udp --permanent 
firewall-cmd --reload 

如果是使用的是 iptables,也可以添加iptables放行规则:

iptables -A INPUT -p tcp --dport 53 -j ACCEPT
iptables -A INPUT -p upd --dport 53 -j ACCEPT

五、如何自动更新去广告规则

去广告规则文件每日自动更新,所以我们也可以设置 cronjob 定时从 github 拉取最新的文件,完成后重启 dnsmasq 服务。新建一个 dnsmas.sh:

vi dnsmasq.sh

然后编写如下脚本:

#!/bin/bash
# download dnsmasq block lists from github  and reboot dnsmasq
# https://bitzhi.com/2019/06/using-dnsmasq-as-home-dns-to-block-advertisements-and-anti-hijacking/ 

rm /etc/dnsmasq.d/hostnames.txt
wget -O /etc/dnsmasq.d/hostnames.txt -c https://raw.githubusercontent.com/notracking/hosts-blocklists/master/hostnames.txt
rm /etc/dnsmasq.d/domains.txt
wget -O /etc/dnsmasq.d/domains.txt -c https://raw.githubusercontent.com/notracking/hosts-blocklists/master/domains.txt
systemctl stop dnsmasq.service
systemctl start dnsmasq.service

给脚本增加执行权限:

chmod a+x dnsmasq.sh

添加定时任务:

crontab -e

输入:

0 3 * * * /root/dnsmasq.sh

然后保存(:wq)。以上 cronjob 表示在每天凌晨三点执行此脚本,我这里脚本保存在 /root/dnsmasq.sh,如果是其他位置,可以自行更改为其他位置。

另外,从 github 更新脚本可能比较慢甚至中断,所以有条件的可以在比较快的 vps 上建立镜像,定时同步。

发表评论

电子邮件地址不会被公开。 必填项已用*标注