Connection rate
Connection Rate 是 MikroTik RouterOS 的一个防火墙功能,它基于连接速度监视和过滤流量,使用 'connection-bytes' 和 'connection-rate' 来检测高速连接以便划分优先级或进行限速。
Connection rate
Connection Rate 是一个防火墙匹配器,它允许基于连接的当前速度来捕获流量。
理论
连接跟踪表中的每个条目代表双向通信。每当一个数据包与某个特定条目关联时,该数据包的大小值(包括 IP 头)就会被加到该条目的 "connection-bytes" 值中。(换句话说,"connection-bytes" 同时包含上传和下载)。
Connection Rate 基于 "connection-bytes" 的变化来计算连接速度。连接速率每秒重新计算一次,且没有任何平均值。
"connection-bytes" 和 "connection-rate" 这两个选项都只对 TCP 和 UDP 流量有效。(你需要指定协议才能激活这些选项)。在 "connection-rate" 选项中,你可以指定想要捕获的速度范围:
ConnectionRate ::= [!]From-To
From,To ::= 0..4294967295 (integer number)
规则示例
当连接速度低于 100kbps 时,以下规则将捕获通过路由器的 TCP/UDP 流量:
/ip/firewall/filter
add action=accept chain=forward connection-rate=0-100k protocol=tcp
add action=accept chain=forward connection-rate=0-100k protocol=udp
应用示例 - 流量优先级划分
Connection-rate 可以以多种方式使用,这些方式仍有待实现,但最常见的设置是检测“重连接”(即长时间保持高速率的连接,例如 P2P、HTTP、FTP 下载)并为其设置较低的优先级。通过这样做,你可以为其他所有流量划分优先级,这些流量通常包括 VoIP、HTTP 浏览和在线游戏。
本示例中描述的方法可以与其他检测和划分流量优先级的方法结合使用。由于 connection-rate 选项没有任何平均值,我们需要确定什么样的界限可以标识“重连接”。如果我们假设正常的 HTTP 浏览连接长度小于 500kB(4Mb),且 VoIP 所需速度不超过 200kbps,那么每个在前 500kB 之后仍保持超过 200kbps 速度的连接都可以被认为是“重”的。
(在你的网络中,HTTP 浏览可能有不同的 "connection-bytes",VoIP 可能有不同的 "connection-rate"——因此,在应用此示例之前,请自行进行研究)
对于本示例,让我们假设我们有一条到 ISP 的 6Mbps 上传和下载连接。
急用快速上手
/ip/firewall/mangle
add chain=forward action=mark-connection connection-mark=!heavy_traffic_conn new-connection-mark=all_conn
add chain=forward action=mark-connection connection-bytes=500000-0 connection-mark=all_conn connection-rate=200k-100M new-connection-mark=heavy_traffic_conn protocol=tcp
add chain=forward action=mark-connection connection-bytes=500000-0 connection-mark=all_conn connection-rate=200k-100M new-connection-mark=heavy_traffic_conn protocol=udp
add chain=forward action=mark-packet connection-mark=heavy_traffic_conn new-packet-mark=heavy_traffic passthrough=no
add chain=forward action=mark-packet connection-mark=all_conn new-packet-mark=other_traffic passthrough=no
/queue/tree
add name=upload parent=public max-limit=6M
add name=other_upload parent=upload limit-at=4M max-limit=6M packet-mark=other_traffic priority=1
add name=heavy_upload parent=upload limit-at=2M max-limit=6M packet-mark=heavy_traffic priority=8
add name=download parent=local max-limit=6M
add name=other_download parent=download limit-at=4M max-limit=6M packet-mark=other_traffic priority=1
add name=heavy_download parent=download limit-at=2M max-limit=6M packet-mark=heavy_traffic priority=8
说明
在 mangle 中,我们需要将所有连接分为两组,然后标记来自这两组的数据包。由于我们讨论的是客户端流量,最合逻辑的标记位置是 mangle 链 forward。
请记住,一旦“重”连接具有较低优先级且队列达到 max-limit——重连接的速度就会下降,connection-rate 也会降低。这将导致其变为较高优先级,连接能够在短时间内获得更多流量,当 connection-rate 再次升高时,又会导致其变为较低优先级。为避免这种情况,我们必须确保一旦被检测到,“重连接”将始终被标记为“重连接”。
IP Firewall mangle
此规则将确保“重”连接保持为重,并用默认连接标记标记其余的连接:
/ip/firewall/mangle
add chain=forward action=mark-connection connection-mark=!heavy_traffic_conn new-connection-mark=all_conn
这两条规则将根据我们的标准标记所有重连接:即每个在前 500kB 之后仍保持超过 200kbps 速度的连接都可以被认为是“重”的:
add chain=forward action=mark-connection connection-bytes=500000-0 \
connection-mark=all_conn connection-rate=200k-100M new-connection-mark=heavy_traffic_conn protocol=tcp
add chain=forward action=mark-connection connection-bytes=500000-0 \
connection-mark=all_conn connection-rate=200k-100M new-connection-mark=heavy_traffic_conn protocol=udp
mangle 中的最后两条规则将简单地标记来自相应连接的所有流量:
add chain=forward action=mark-packet connection-mark=heavy_traffic_conn new-packet-mark=heavy_traffic passthrough=no
add chain=forward action=mark-packet connection-mark=all_conn new-packet-mark=other_traffic passthrough=no
Queue
这是一个放置在 Interface HTB 上的简单队列树——"public" 是你的 ISP 所连接的接口,"local" 是你的客户端所在的接口。如果你有多个 "public" 或多个 "local",你将需要分别对上传和下载进行 mangle,并将队列树放置在 global-out:
/queue/tree
add name=upload parent=public max-limit=6M
add name=other_upload parent=upload limit-at=4M max-limit=6M packet-mark=other_traffic priority=1
add name=heavy_upload parent=upload limit-at=2M max-limit=6M packet-mark=heavy_traffic priority=8
add name=download parent=local max-limit=6M
add name=other_download parent=download limit-at=4M max-limit=6M packet-mark=other_traffic priority=1
add name=heavy_download parent=download limit-at=2M max-limit=6M packet-mark=heavy_traffic priority=8