MikroTik RouterOS利用DNS配合防火墙拦截广告

近期入手了Mikrotik的路由器,这个牌子的路由器比较小众,搭载了RouterOS系统,但是可配置性相当高,这几天摸索下来略有小成,一些配置技巧特分享在博客,以作备忘。

一些关于PPPoE拨号配置等基础操作网上教程较多,后期如有时间我会考虑一起记录下来,今天介绍的主要是如何利用DNS静态列表配合防火墙拦截特定广告或者跟踪器URL。

配置前的准备工作,比如winbox的下载和连接我这里不详述,建议将RouterOS更新到最新,当然升级也比较方便可以直接在线升级。

1、配置静态DNS (WinBox > IP > DNS > Static)

首先打开DNS Settings,根据个人喜好配置Servers为上游递归DNS服务器,为取得最佳CDN查询效果,建议使用运营商提供的DNS服务器,取ping值最小的为佳,当然如果运营商的DNS存在劫持的话也可以选择公共DNS服务器,填写完毕后点击Apply使配置生效,如下图所示:

Mikrotik RouterOS 配置DNS服务器

然后点击Static,打开DNS Static,点击+加号打开New DNS Static Entry如下图所示:

Mikrotik RouterOS 配置静态DNS记录

参考上图,假设我们要屏蔽的广告或者跟踪器域名是ads.example.com,那么Name字段填写这个域名(注意这里只能是域名,不能填写带http://或者https://的URL),Address字段填写一个特殊的IP地址,我们这里选用240.0.0.1,这个IP地址最好不能是公共互联网络上的公网IP,当然也不能是内网私有IP,否则可能会导致不兼容问题,240.0.0.1是个保留地址符合要求。完成配置后点击OK!

测试配置结果,假设路由器IP是192.168.88.1,那么使用命令nslookup ads.example.com 192.168.88.1,如果返回240.0.0.1则表明配置生效!

到这里我们假设的广告域名ads.example.com已经无法解析,如果我们上网客户端使用的路由器作为DNS服务器,那么所有和此域名相关的URL已经无法访问,到这里就结束了吗?不!必须配置防火墙,因为我们将广告或者拦截器域名解析到一个黑洞IP,所有发往这个IP的数据包不会得到任何应答,因而会响应超时,不过TCP有个特性,会不断尝试重新发包如果我们不reset的话,对于浏览器来说,页面显示会卡住,也消耗了客户端的计算资源,所以还需要配置防火墙,reset或者drop所有发往240.0.0.1的数据包。

2、配置防火墙(WinBox > IP > Firewall > Filter Rules)

首先打开Firewall界面,切换到Filter Rules选项卡,点击+加号添加Firewall Rule,如下图所示:

Mikrotik RouterOS 配置防火墙规则

如上图添加一条forward的Reject记录,拦截240.0.0.1的TCP数据包,处理方式是TCP Reset,这个在Action选项卡设置,如下图所示,编辑完成后点击OK添加。

Mikrotik RouterOS 配置防火墙规则

除了拦截TCP数据包外,我们还需要对UDP协议以及其他流量类型进行处理,具体的配置大同小异,以下仅列出必要的配置内容:

拦截UDP:

WinBox > IP > Firewall > Filter Rules > Add [+]
  General
    Chain: forward
    Dst. Address: 240.0.0.1
    Protocol: 17 (udp)
    Connection State: new
  Action
    Action: reject
    Reject With: icmp network unreachable
  Comment: Adblock udp unreachable

拦截其他类型流量:

WinBox > IP > Firewall > Filter Rules > Add [+]
  General
    Chain: forward
    Dst. Address: 240.0.0.1
  Action
    Action: drop
  Comment: Adblock drop

3、配置DHCP Server(WinBox > IP > DHCP Server > Networks > Edit Primary Network)

参考下图打开DHCP Server的网络配置界面,配置默认分配给客户端的DNS服务器为Mikrotik路由IP,我们这里是192.168.88.1,大家视情况修改,完成编辑后即可点击OK。

Mikrotik RouterOS 配置DHCP Server

4、进阶内容

4.1 利用正则表达式匹配域名

大家可能注意到在第1步的设置静态解析New DNS Static Entry界面有个Regexp文本框域,通过这个我们可以使用正则表达式匹配查询域名,这样会更加灵活,比如规则^ads[A-Za-z0-9-]*\.example\.com$

Mikrotik RouterOS 配置静态DNS正则匹配

如果填写了Regexp就不再需要填写Name,此规则将匹配所有以ads开头和.example.com结尾的域名,包括但不限于以下几种:

ads.example.com
adsabc.example.com

正则表达式比较强大,具体要看各位发挥了。

4.2 重新定向内网所有DNS查询

有时候可能会出现客户端采用自定义DNS服务器的方式绕过我们DHCP分配的DNS服务器,这样拦截规则也无法生效,之前我也写过一篇文章介绍这一场景,如何强制内网客户端的DNS查询流量重新定向到我们的路由器呢?

注意一般DNS查询分为UDP协议(常用)和TCP协议,这两种都使用了53端口,所以我们需要分别设置,以下仅给出配置信息供参考:

WinBox > IP > Firewall > NAT > Add [+]
  General
    Chain: dstnat
    Dst. Address: [!] <your Mikrotik IP>
    Protocol: 6 (tcp)
    Dst. Port: 53
    In. Interface: <your LAN bridge/interface>
  Action
    Action: redirect
    To Ports: 53
  Comment: DNS Redirect (TCP)
WinBox > IP > Firewall > NAT > Add [+]
  General
    Chain: dstnat
    Dst. Address: [!] <your Mikrotik IP>
    Protocol: 17 (udp)
    Dst. Port: 53
    In. Interface: <your LAN bridge/interface>
  Action
    Action: redirect
    To Ports: 53
  Comment: DNS Redirect (UDP)

以上<your Mikrotik IP>和<your LAN bridge/interface>请自行替换为你的路由器IP和局域网网桥名称。

参考文献

DNS based adblock using Mikrotik RouterOS

《MikroTik RouterOS利用DNS配合防火墙拦截广告》有一个想法

发表评论

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

*

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据