Layer7

MikroTik RouterOS 中的 Layer7 协议检测会在网络流量流中搜索模式,通过收集初始数据包数据来识别特定协议。它需要对双向流量进行细致配置,且非常消耗资源,官方也警告不要过度使用。示例配置演示了在管理内存占用的同时匹配 RDP 和 Telnet 协议。

Layer7

Layer7-protocol 是一种在 ICMP/TCP/UDP 流中搜索模式的方法。

警告

L7 匹配器非常消耗资源。请仅将该功能用于非常特定的流量。不建议将 L7 匹配器用于通用流量,例如拦截网页。这几乎永远无法正确工作,而且设备为了捕获所有流量会耗尽自身资源。请改用其他功能按 URL 拦截网页。 L7 匹配器会收集一条连接的前 10 个数据包或前 2KB 数据,并在收集到的数据中搜索模式。如果在收集到的数据中找不到该模式,匹配器就停止进一步检测。已分配的内存会被释放,该协议被视为 unknown。你应当考虑到,连接数量很多时会显著增加内存和 CPU 占用。为避免这种情况,请添加常规的防火墙匹配器,以减少反复传给 layer-7 过滤器的数据量。

还有一个额外要求:layer7 匹配器必须能同时看到流量的两个方向(入站和出站)。为满足该要求,l7 规则应设置在 forward 链中。如果规则设置在 input/prerouting 链中,则必须在 output/postrouting 链中设置同样的规则,否则收集到的数据可能不完整,导致模式匹配出错。

危险

Layer 7 匹配器不区分大小写! 与 RouterOS 兼容的 L7 模式示例可在 l7-filter project page 上找到。

警告

在某些情况下,当 layer 7 正则表达式无法执行时,RouterOS 会记录 topic=firewall, warning,并在消息中附带说明问题的错误信息!

示例

简单的 L7 使用示例

首先,在 protocols 菜单中添加 Regexp 字符串,以定义你要查找的字符串。在本例中,我们将使用一个模式来匹配 RDP 数据包。

/ip/firewall/layer7-protocol
add name=rdp regexp="rdpdr.*cliprdr.*rdpsnd"

然后,在防火墙中使用已定义的协议。

/ip/firewall/filter

# add few known protocols to reduce mem usage
add action=accept chain=forward comment="" disabled=no port=80 protocol=tcp
add action=accept chain=forward comment="" disabled=no port=443 protocol=tcp

# add l7 matcher
add action=accept chain=forward comment="" disabled=no layer7-protocol=\
    rdp protocol=tcp

如你所见,在 l7 规则之前我们添加了几条常规规则,用于匹配已知流量,从而减少内存占用。

input 链中的 L7

在本例中,我们将尝试匹配连接到路由器的 telnet 协议。

/ip/firewall/layer7-protocol/add comment="" name=telnet regexp="^\\xff[\\xfb-\\xfe].\\xff[\\xfb-\\xfe].\\xff[\\xfb-\\xfe]"

请注意,我们需要两个方向,因此还需要在能看到出站数据包的 output 链中添加 l7 规则。

/ip/firewall/filter

add action=accept chain=input comment="" disabled=no layer7-protocol=telnet \
    protocol=tcp

add action=passthrough chain=output comment="" disabled=no layer7-protocol=telnet \
    protocol=tcp

YouTube 匹配器

警告

当用户已登录时,YouTube 会使用 HTTPS,这意味着 L7 无法匹配这类流量。只有未加密的 HTTP 才能被匹配。

/ip/firewall/layer7-protocol
add name=youtube regexp="(GET \\/videoplayback\\\?|GET \\/crossdomain\\.xml)"