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
使配置生效,如下图所示:
然后点击
Static
,打开
DNS Static
,点击+加号打开
New DNS Static Entry
如下图所示:
参考上图,假设我们要屏蔽的广告或者跟踪器域名是
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
,如下图所示:
如上图添加一条forward的Reject记录,拦截240.0.0.1的TCP数据包,处理方式是TCP Reset,这个在Action选项卡设置,如下图所示,编辑完成后点击OK添加。
除了拦截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。
4、进阶内容
4.1 利用正则表达式匹配域名
大家可能注意到在第1步的设置静态解析
New DNS Static Entry
界面有个
Regexp
文本框域,通过这个我们可以使用正则表达式匹配查询域名,这样会更加灵活,比如规则
^ads[A-Za-z0-9-]*\.example\.com$
:
如果填写了
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和局域网网桥名称。
参考文献
广告还是值得你去看一看,反正你都能买得起。
为什么我的ROS路由设置的 IP-DNS 本地的cache一直是空的?高手能不能给分析一下?DHCP-network中的DNS没有单独设置,如果设置成本路由的IP,电脑端自动获取的DNS是路由的IP,但是不能解析。IP-DNS里已添加公开DNS。
抱歉,关于此路由器的设置我也是入门而已,暂时不能提供相应解决方案