使用 DNS 劫持 (最简单、最常用)
这是最简单、最快捷的方法,尤其适合家庭网络或小型办公室,它的原理是:当设备试图访问一个被禁止的网站时,我们强制它的 DNS 查询请求返回一个错误的、无法访问的 IP 地址(0.0.0),从而阻止它连接到正确的服务器。

优点:
- 配置简单:只需要几条命令。
- 性能开销小:只涉及 DNS 层面,不检查数据包内容。
- 适用性广:可以阻止所有使用该域名的网站,包括其子域名(如
www.example.com,sub.example.com)。
缺点:
- 可被绕过:如果用户手动指定了正确的 IP 地址(
http://93.184.216.34),则此方法无效。 - 无法阻止 IP 地址访问:如果直接通过 IP 访问,则无法阻止。
配置步骤 (方法一)
假设你的局域网网关是 168.88.1,你想禁止 facebook.com 和 twitter.com。
-
进入 RouterOS 命令行 使用 WinBox、SSH 或串口连接到你的 RouterOS 设备。
(图片来源网络,侵删) -
创建一个地址列表 这个列表用来存放我们要禁止的域名。
/ip firewall address-list add list=blocked_sites address="facebook.com" add list=blocked_sites address="twitter.com"
-
创建一个 DNS 劫持规则 这条规则会检查发往 DNS 服务器的请求,如果请求的域名在我们的
blocked_sites列表中,就将其目标地址改为0.0.0。/ip dns set servers=0.0.0.0 # 这一步是关键,将默认DNS服务器指向自己,这样我们才能拦截DNS请求
/ip firewall nat add chain=dstnat protocol=udp dst-port=53 action=dst-nat to-addresses=0.0.0.0 src-address-list=blocked_sites
chain=dstnat: 目标 NAT 链,用于修改目标地址。protocol=udp: DNS 通常使用 UDP 协议,端口 53。action=dst-nat: 目标地址转换。to-addresses=0.0.0.0: 将目标地址改为0.0.0。src-address-list=blocked_sites: 注意:这里的src-address-list是一个常见的误解,我们需要匹配的是 DNS 查询的域名,而不是源 IP,上面的命令是错误的,无法正常工作。
修正后的正确方法 (使用
ip firewall mangle和ip dns): RouterOS 的ip firewall nat无法直接检查 DNS 请求的域名,我们需要使用ip dns的功能来实现。正确的配置应该是:
(图片来源网络,侵删)# 1. 创建地址列表 /ip firewall address-list add list=blocked_sites address="facebook.com" add list=blocked_sites address="twitter.com" # 2. 配置DNS服务器,并添加静态条目 /ip dns set allow-remote-requests=yes # 允许局域网设备查询本机DNS # 为被禁止的域名添加一个静态解析,指向一个不存在的地址 /ip dns static add name=facebook.com address=0.0.0.0 add name=twitter.com address=0.0.0.0
这个方法更直接,当局域网内的设备查询
facebook.com时,RouterOS 的 DNS 服务器会直接返回0.0.0,从而阻止连接。
使用 Layer7 (L7) 协议过滤 (更精确)
这种方法通过检查数据包的“内容”(即应用层协议)来识别并阻止特定的流量,它可以识别出 Facebook、Twitter 等应用,即使它们使用不同的域名或 IP 地址。
优点:
- 精确度高:能准确识别应用,即使域名或 IP 改变也能阻止。
- 阻止整个应用:可以阻止一个应用的所有流量,包括其更新、后台服务等。
- 可绕过 DNS 劫持:即使设备手动配置了正确的 DNS,只要它还在使用该应用,就会被阻止。
缺点:
- 性能开销较大:需要深度包检测,对 RouterOS 的 CPU 和内存有一定消耗。
- 需要维护规则库:需要定期更新 L7 协议包,因为应用会更新其通信方式。
- 配置相对复杂。
注意:较新版本的 RouterOS (v7+) 中,L7 过滤功能已部分集成到 firewall layer7-protocol 和 firewall mangle 规则中,但功能可能不如旧的 layer7 脚本强大,这里以经典方法为例。
配置步骤 (方法二)
-
安装 L7 协议脚本 你需要从 RouterOS 的官方脚本库中下载 L7 脚本,通常使用 WinBox 的 "New Terminal" 下载。
/system script add name=l7 policy=ftp,reboot,read,write,policy,test,winbox,password
然后在 WinBox 中找到 "System" -> "Scripts",双击
l7脚本,粘贴以下内容并运行::global l7path "l7"; :global l7url "https://download.mikrotik.com/routeros/l7/l7-protocols.tar.gz"; /tool fetch url=$l7url dst-path=$l7path; /tar extract file=$l7path/l7-protocols.tar.gz; /file remove $l7path/l7-protocols.tar.gz; /file move l7-protocols/* l7; /file remove l7-protocols;
这会下载并解压 L7 协议定义文件到
l7文件夹。 -
创建 L7 协议规则
/layer7-protocol add name=facebook regexp="facebook" add name=twitter regexp="twitter"
regexp是一个正则表达式,用于匹配流量特征,你可能需要根据实际情况调整或使用更复杂的规则。
-
创建 Mangle 规则来标记流量 我们需要将匹配 L7 协议的流量打上一个标记,以便后续的防火墙规则可以识别。
/ip firewall mangle add chain=prerouting protocol=tcp layer7-protocol=facebook action=mark-packet new-packet-mark=facebook_traffic passthrough=yes add chain=prerouting protocol=tcp layer7-protocol=twitter action=mark-packet new-packet-mark=twitter_traffic passthrough=yes
chain=prerouting: 在数据包进入路由器时进行检查。layer7-protocol=facebook: 使用我们刚才创建的 L7 规则。action=mark-packet: 给匹配的数据包打上标记。new-packet-mark: 定义一个标记名,如facebook_traffic。passthrough=yes: 继续处理该数据包,而不是丢弃。
-
创建防火墙规则丢弃被标记的流量 我们创建一个简单的防火墙规则来丢弃带有特定标记的数据包。
/ip firewall filter add chain=forward packet-mark=facebook_traffic action=drop comment="Block Facebook" add chain=forward packet-mark=twitter_traffic action=drop comment="Block Twitter"
chain=forward: 处理来自局域网、发往互联网或反之的流量。packet-mark=facebook_traffic: 匹配我们刚才打上的标记。action=drop: 丢弃数据包。
使用 URL 过滤 (WebProxy) (最灵活)
这种方法通过 RouterOS 的 WebProxy 功能,像企业级防火墙一样工作,它会检查 HTTP/HTTPS 流量中的 URL,并根据黑名单/白名单进行过滤。
优点:
- 非常灵活:可以精确到 URL 路径。
- 支持 HTTPS:可以解密和检查 HTTPS 流量(需要配置 SSL 证书)。
- 可以提供认证:要求用户登录才能上网。
缺点:
- 配置最复杂:需要启用 WebProxy 服务。
- 仅限 HTTP/HTTPS:对其他协议(如游戏、邮件)无效。
- 对性能要求高:需要处理所有 Web 流量。
配置步骤 (方法三)
-
启用 WebProxy 服务
/ip service set www address=0.0.0.0 # 确保WebProxy服务对所有接口开放
-
配置 WebProxy
/proxy set enabled=yes src-address=0.0.0.0/0 # 允许所有客户端连接
-
创建 URL 黑名单
/proxy url add url="*.facebook.com" action=deny add url="*.twitter.com" action=deny
action=deny: 拒绝访问匹配的 URL。url="*.facebook.com": 是通配符,可以匹配www.facebook.com,m.facebook.com等。
-
将客户端流量重定向到 WebProxy 客户端需要将网关的 IP 地址设置为它们的代理服务器,或者使用透明代理(Transparent Proxy),透明代理的配置较为复杂,通常需要
dst-nat规则将所有 80/443 端口的流量重定向到代理的 8080 端口。
总结与推荐
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| DNS 劫持 | 配置简单,性能开销小 | 可被 IP 绕过,无法阻止应用 | 家庭用户,快速阻止特定网站 |
| L7 协议过滤 | 精确,阻止整个应用,难以绕过 | 性能开销大,需维护规则库 | 小型企业,需要精确控制应用 |
| URL 过滤 | 非常灵活,支持 HTTPS 认证 | 配置复杂,仅限 Web 流量 | 需要精细控制的企业环境,内容过滤 |
对于绝大多数用户,我强烈推荐从【方法一:DNS 劫持】开始。 它简单有效,能满足基本需求,如果发现用户可以通过 IP 绕过,或者需要阻止整个应用(如 Facebook),再升级到【方法二:L7 协议过滤】。
如何恢复或删除规则?
-
DNS 劫持:
/ip dns static remove [find name="facebook.com"] # 删除静态DNS条目 /ip dns set servers=192.168.88.1 # 恢复默认DNS服务器地址
-
L7 协议过滤:
/ip firewall filter remove [find comment="Block Facebook"] # 删除防火墙规则 /ip firewall mangle remove [find new-packet-mark=facebook_traffic] # 删除mangle规则 /layer7-protocol remove [find name=facebook] # 删除L7协议
-
URL 过滤:
/proxy url remove [find url="*.facebook.com"] # 删除URL规则
希望这份详细的指南能帮助你成功配置 RouterOS!
