使用 DNS 劫持 (最简单、最常用)

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

routeros 禁止网站
(图片来源网络,侵删)

优点:

  • 配置简单:只需要几条命令。
  • 性能开销小:只涉及 DNS 层面,不检查数据包内容。
  • 适用性广:可以阻止所有使用该域名的网站,包括其子域名(如 www.example.com, sub.example.com)。

缺点:

  • 可被绕过:如果用户手动指定了正确的 IP 地址(http://93.184.216.34),则此方法无效。
  • 无法阻止 IP 地址访问:如果直接通过 IP 访问,则无法阻止。

配置步骤 (方法一)

假设你的局域网网关是 168.88.1,你想禁止 facebook.comtwitter.com

  1. 进入 RouterOS 命令行 使用 WinBox、SSH 或串口连接到你的 RouterOS 设备。

    routeros 禁止网站
    (图片来源网络,侵删)
  2. 创建一个地址列表 这个列表用来存放我们要禁止的域名。

    /ip firewall address-list
    add list=blocked_sites address="facebook.com"
    add list=blocked_sites address="twitter.com"
  3. 创建一个 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 mangleip dns): RouterOS 的 ip firewall nat 无法直接检查 DNS 请求的域名,我们需要使用 ip dns 的功能来实现。

    正确的配置应该是:

    routeros 禁止网站
    (图片来源网络,侵删)
    # 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-protocolfirewall mangle 规则中,但功能可能不如旧的 layer7 脚本强大,这里以经典方法为例。

配置步骤 (方法二)

  1. 安装 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 文件夹。

  2. 创建 L7 协议规则

    /layer7-protocol
    add name=facebook regexp="facebook"
    add name=twitter regexp="twitter"
    • regexp 是一个正则表达式,用于匹配流量特征,你可能需要根据实际情况调整或使用更复杂的规则。
  3. 创建 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: 继续处理该数据包,而不是丢弃。
  4. 创建防火墙规则丢弃被标记的流量 我们创建一个简单的防火墙规则来丢弃带有特定标记的数据包。

    /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 流量。

配置步骤 (方法三)

  1. 启用 WebProxy 服务

    /ip service
    set www address=0.0.0.0  # 确保WebProxy服务对所有接口开放
  2. 配置 WebProxy

    /proxy
    set enabled=yes src-address=0.0.0.0/0  # 允许所有客户端连接
  3. 创建 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 等。
  4. 将客户端流量重定向到 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!