提醒:本页面将不再更新、维护或者支持,文章、评论所叙述内容存在时效性,涉及技术细节或者软件使用方面不保证能够完全有效可操作,请谨慎参考!

近期入手了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