介绍
Mangle是一种 "标记",它用特殊的记号来标记数据包以便将来处理。RouterOS中的许多其他设施都使用了这些标记,例如队列树、NAT、路由。它们根据标记来识别数据包,并对其进行相应的处理。mangle标记只存在于路由器内部,不会在网络上传输。
此外,mangle设施用来修改IP头中的一些字段,如TOS(DSCP)和TTL字段。
防火墙mangle规则由五个预定义的链组成,不能删除。
PREROUTING 链。该链中的规则用于刚到达网络接口的数据包。
INPUT 链。这条链中的规则用于数据包被交给本地进程之前。
OUTPUT 链。这里的规则用于刚被进程产生的数据包。
FORWARD 链。这里的规则用于任何通过当前主机传输的数据包。
POSTROUTING 链。这个链中的规则用于刚离开网络接口的数据包。
属性
| 属性 | 说明 |
|---|---|
| action (action name; Default: accept) | 如果数据包被该规则匹配,要采取的行动: - accept - 接受数据包。数据包不会被传递到下一个防火墙规则。 - add-dst-to-address-list - 将目标地址添加到参数 "address-list "指定的地址列表中。 - add-src-to-address-list - 将源地址添加到由 address-list参数指定的地址列表中。- change-dscp - 改变由new-dscp参数指定的差异化服务代码点(DSCP)字段值 - change-mss - 将数据包的最大段值改为new-mss参数指定的值。 - change-ttl - 将数据包的生存时间值改为new-ttl参数指定的值。 - clear-df - 清除 "Do Not Fragment "标志 - fasttrack-connection - 显示fasttrack计数器,对统计有用 - jump - 跳到由 jump-target 参数值指定的用户定义链上- log - 在系统日志中添加一条信息,包含以下数据:in-interface, out-interface, src-mac, protocol, src-ip:port->dst-ip:port和数据包的长度。在一个数据包被匹配后,它被传递到列表中的下一个规则,类似于 "直通"。 - mark-connection - 将new-connection-mark参数指定的标记放在符合该规则的整个连接上。 - mark-packet - 在符合规则的数据包上放置new-packet-mark参数指定的标记。 - mark-routing - 在数据包上放置new-routing-mark参数指定的标记。这种标记只用于策略路由的目的 - passthrough - 如果数据包被规则匹配,增加计数器并转到下一个规则(对统计有用)。 - return - 将控制权传回发生跳转的链上 - route - 忽略正常的路由决定,强制数据包到一个特定的网关IP(仅适用于预路由链)。 - set-priority - 在通过能够传输优先级的链路(VLAN或支持WMM的无线接口)发送的数据包上设置new-priority参数所指定的优先级。阅读全文 - sniff-pc - 发送数据包到远程RouterOS CALEA服务器。 - sniff-tzsp - 发送数据包到远程TZSP兼容系统(如Wireshark)。用 sniff-target 和 sniff-target-port 参数设置远程目标(Wireshark推荐端口37008)。- strip-ipv4-options - 从 IP 头中剥离 IPv4 选项字段,该操作实际上并没有移除 IPv4 选项,而是将所有选项八位数替换为 NOP,进一步匹配 ipv4-options=any 的数据包仍然会匹配。 |
| address-list (string; Default: ) | 要使用的地址列表名称。如果动作是 "add-dst-to-address-list "或 "add-src-to-address-list "则适用。 |
| address-list-timeout (none-dynamic | none-static | time; Default: none-dynamic) | 地址将从address-list参数指定的地址列表中删除的时间间隔。与 add-dst-to-address-list 或 add-src-to-address-list 动作一起使用。- 非动态值( 00:00:00)将在地址列表中保留该地址,直到重新启动。- 非静态值将使地址永远留在地址列表中,并包括在配置导出/备份中。 |
| chain (name; Default: ) | 指定规则添加到哪个链中。如果输入的内容与已经定义的链名称不一致,将创建一个新的链。 |
| comment (string; Default: ) | 规则的描述。 |
| connection-bytes (integer-integer; Default: ) | 只有通过特定的连接传输了一定数量的字节时才会匹配数据包。0 - 表示无穷大,例如 connection-bytes=2000000-0 表示如果通过相关连接传输的数据超过2MB(上传和下载),该规则就会匹配。 |
| connection-limit (integer,netmask; Default: ) | 达到给定值后,匹配每个地址或地址块的连接。 |
| connection-mark (no-mark | string; Default: ) | 匹配通过mangle设施标记为特定连接标记的数据包。如果设置了 无标记,该规则将匹配任何无标记的连接。 |
| connection-nat-state (srcnat | dstnat; Default: ) | 可以匹配srcnatted、dstnatted或两者的联合。注意connection-state=related连接 connection-nat-state是由第一个数据包的方向决定的,如果连接跟踪要使用dst-nat将这个连接传递到与主连接相同的主机上,它将处于connection-nat-state=dstnat,即使根本没有dst-nat规则。 |
| connection-rate (Integer 0..4294967295; Default: ) | 连接速率是一个防火墙匹配器,允许根据目前的连接速度捕获流量。 |
| connection-state (established | invalid | new | related; Default: ) | 解释特定数据包的连接跟踪分析数据: - established - 属于现有连接的数据包 - invalid - 在连接跟踪里没有确定状态的数据包(通常是 - 严重失序的数据包,序列号/ack号错误的数据包,或者在路由器上资源过度使用的情况下),无效的数据包将不参与NAT(只有connection-state=new 的数据包),并且在路由时仍然包含原始源IP地址。建议在防火墙过滤器转发和输入链中丢弃所有connection-state=invalid 的数据包。 - new - 数据包开始了一个新的连接,或者与一个没有在两个方向上看到过数据包的连接相关。 - related - 与现有连接有关的数据包,但不是现有连接的一部分,如ICMP错误或开始FTP数据连接的数据包 - untracked - 数据包设置为绕过防火墙RAW表中的连接跟踪。 |
| connection-type (ftp | h323 | irc | pptp | quake3 | sip | tftp; Default: ) | 根据连接跟踪助手的信息,匹配来自相关连接的数据包。相关的连接帮助器必须在下面启用。/ip firewall service-port |
| content (string; Default: ) | 匹配包含指定文本的数据包。 |
| dscp (integer: 0..63; Default: ) | 匹配DSCP IP报头 |
| dst-address (IP/netmask | IP range; Default: ) | 匹配目的地等于指定IP或属于指定IP范围的数据包。 |
| dst-address-list (name; Default: ) | 根据用户定义的地址列表匹配数据包的目的地址。 |
| dst-address-type (unicast | local | broadcast | multicast; Default: ) | 匹配目的地址类型: - unicast - 用于点对点传输的IP地址 - local - 如果dst-address分配给路由器的一个接口 - broadcast - 数据包发送到子网的所有设备上 - multicast - 数据包转发到一个定义的设备组中 |
| dst-limit (integer[/time],integer,dst-address | dst-port | src-address[/time]; Default: ) | 匹配数据包直到超过给定的PPS限制。与限制匹配器相反,每个目的IP地址/目的端口都有自己的限制。参数按下列格式书写:count[/time],burst,mode[/expire].- count - 以每一 time间隔的数据包为单位的最大平均数据包速率- time - 指定测量数据包速率的时间间隔(可选) - burst - 不计入包率的数据包数量 - mode - 用于限制数据包速率的分类器 - expire - 指定间隔时间,之后记录的IP地址/端口将被删除(可选) |
| dst-port (integer[-integer]: 0...65535; Default: ) | 目标端口号或端口号范围列表 |
| fragment (yes|no; Default: ) | 匹配碎片化的数据包。第一个(开始)片段不计入。如果启用连接跟踪功能,就不会有碎片,因为系统会自动组装每个数据包。 |
| hotspot (auth | from-client | http | local-dst | to-client; Default: ) | 把HotSpot客户端收到的数据包和各种HotSpot进行匹配。 - auth - 匹配经过认证的HotSpot客户端数据包 - from-client - 匹配来自HotSpot客户端的数据包 - http - 匹配发送到HotSpot服务器的HTTP请求 - local-dst - 匹配以HotSpot服务器为目的地的数据包 - to-client - 匹配发送至HotSpot客户端的数据包 |
| icmp-options (integer:integer; Default: ) | 匹配ICMP "type:code" 字段 |
| in-bridge-port (name; Default: ) | 如果输入的接口是网桥,则数据包进入路由器的实际接口。 |
| in-interface (name; Default: ) | 数据包进入路由器的接口。 |
| ingress-priority (integer: 0..63; Default: ) | 匹配数据包的入站优先级。优先级可以从VLAN、WMM或MPLS EXP位得出。阅读全文 |
| ipsec-policy (in | out, ipsec | none; Default: ) | 匹配IpSec的策略。 按下列格式书写。方向,策略。方向用于选择是否匹配用于解封装或封装的策略。 - in - 在PREROUTING、INPUT和FORWARD链中有效 - out - 在POSTROUTING、OUTPUT和FORWARD链中有效。 - ipsec - 如果数据包被IpSec处理,则匹配。 - none - 匹配不受IpSec处理的数据包(例如,IpSec传输数据包)。 例如,如果路由器收到一个IPsec封装的Gre包,那么规则 ipsec-policy=in,ipsec 将匹配Gre包,但是规则 ipsec-policy=in,none 将匹配ESP包。 |
| ipv4-options (any | loose-source-routing | no-record-route | no-router-alert | no-source-routing | no-timestamp | none | record-route | router-alert | strict-source-routing | timestamp; Default: ) | 匹配IPv4头的选项: - any - 匹配至少有一个IPv4选项的数据包。 - loose-source-routing - 匹配带有松散源路由选项的数据包。该选项用于根据源提供的信息对互联网数据报进行路由。 - no-record-route - 匹配没有记录路由选项的数据包。这个选项用于根据源提供的信息对互联网数据报进行路由。 - no-router-alert - 匹配没有路由器改变选项的数据包 - no-source-routing - 匹配没有源路由选项的数据包 - no-timestamp - 匹配没有时间戳选项的数据包 - record-route - 匹配带有record route选项的数据包 - router-alert - 匹配带有router alter选项的数据包 - strict-source-routing - 匹配有严格源路由选项的数据包 - timestamp - 匹配有时间戳的数据包 |
| jump-target (name; Default: ) | 要跳到的目标链名称。只适用于 action=jump。 |
| layer7-protocol (name; Default: ) | 在 layer7 protocol menu中定义的7层过滤器名称。 |
| limit (integer,time,integer; Default: ) | 匹配数据包,直到超过指定的PPS限制。参数以下列格式写入。count[/time],burst.- count - 以每一 time间隔的数据包测量的最大平均数据包速率- time - 指定测量数据包速率的时间间隔(可选,如果不指定将使用1s)。 - burst - 不计入包率的数据包数量 |
| log (yes | no; Default: no) | 在系统日志中添加一条信息,包含以下数据:in-interface, out-interface, src-mac, protocol, src-ip:port->dst-ip:port, 和包长度。 |
| log-prefix (string; Default: ) | 在每条日志信息的开头添加指定的文本。如果配置了 action=log 或 log=yes 则适用。 |
| new-dscp (integer: 0..63; Default: ) | 为数据包设置新的DSCP值 |
| new-mss (integer; Default: ) | 为数据包设置一个新的MSS。 Clampt-to-pmtu功能在IP头中设置(DF)位,动态地发现路径的PMTU。主机在该路径上发送的所有数据报都设置了DF位,直到收到ICMP编码为 "需要分片并设置DF"的目的地不可达信息。 一旦收到这样的消息,源主机就会减少其假定的路径PMTU。 |
| new-packet-mark (string; Default: ) | 设置一个新的包标记值 |
| new-priority (integer | from-dscp | from-dscp-high-3-bits | from-ingress; Default: ) | 为数据包设置新优先级。可以是VLAN、WMM、DSCP或MPLS EXP的优先级 阅读全文。这个属性也可以设置一个内部优先级。 |
| new-routing-mark (string; Default: ) | 设置一个新的路由标记值(在RouterOS v7中,路由标记必须作为一个新的 路由表 之前创建) |
| new-ttl (decrement | increment | set:integer; Default: ) | 设置一个新的生存时间值。 |
| nth (integer,integer; Default: ) | 匹配每n个数据包。nth=2,1 规则将匹配每两个包的第一个数据包,因此,50%的流量会被规则匹配。 |
| out-bridge-port (name; Default: ) | 如果出站接口是网桥,则为数据包离开路由器的实际接口。 |
| out-interface (; Default: ) | 数据包离开路由器的接口。 |
| packet-mark (no-mark | string; Default: ) | 匹配通过mangle标记为特定数据包标记的数据。如果设置了 无标记,该规则将匹配任何无标记的数据包。 |
| packet-size (integer[-integer]:0...65535; Default: ) | 匹配指定大小或大小范围的数据包,单位为字节数。 |
| passthrough (yes | no; Default: yes) | 是否让数据包进一步进入防火墙(如动作passthrough)(属性只对某些动作有效)。 |
| per-connection-classifier (ValuesToHash:Denominator/Remainder; 默认值: ) | PCC匹配器允许将流量分为相等的流,并能够将具有特定选项集的数据包保留在一个特定的流中。 |
| port (integer[-integer]: 0...65535; Default: ) | 如果任何(源或目的)端口与指定的端口或端口范围列表匹配,则进行匹配。只有当 protocol 是TCP或UDP时才适用。 |
| protocol (name or protocol ID; Default: tcp) | 匹配由协议名称或编号指定的特定IP协议 |
| psd (integer,time,integer,integer; Default: ) | 尝试检测TCP和UDP扫描。参数的格式如下:"WeightThreshold, DelayThreshold, LowPortWeight, HighPortWeight": - WeightThreshold - 来自同一主机不同目的端口的最新TCP/UDP数据包的总权重,被视为端口扫描序列。 - DelayThreshold - 来自同一主机不同目的端口的数据包延迟,视为可能的端口扫描子序列。 - LowPortWeight - 具有特权(<1024)目的端口的数据包权重 - HighPortWeight - 具有非特权目的端口的数据包权重 |
| random (integer: 1...99; Default: ) | 以一定概率随机匹配数据包。 |
| routing-mark (string; Default: ) | 匹配由mangle标记的有特定路由标记的数据包。 |
| route-dst (IP, Default:) | 匹配具有特定网关的数据包。 |
| priority (integer: 0..63; Default: ) | 在设置新的优先级后匹配数据包的优先级。优先级可以来自VLAN、WMM、DSCP、MPLS EXP位,或者来自使用set-priority动作设置的内部优先级。 |
| src-address (IP/Netmask, IP range; Default: ) | 匹配来源等于指定IP或属于指定IP范围的数据包。 |
| src-address-list (name; Default: ) | 根据用户定义的地址列表匹配数据包的源地址。 |
| src-address-type (unicast | local | broadcast | multicast; Default: ) | 匹配源地址类型: - 单播 - 用于点对点传输的IP地址 - 本地 - 如果一个地址分配给路由器的一个接口 - 广播 - 数据包发送到子网的所有设备上 - 多播 - 数据包转发到一个定义的设备组中 |
| src-port (integer[-integer]: 0..65535; Default: ) | 源端口和源端口范围列表。仅在协议为TCP或UDP时适用。 |
| src-mac-address (MAC address; Default: ) | 匹配数据包的源MAC地址 |
| tcp-flags (ack | cwr | ece | fin | psh | rst | syn | urg; Default: ) | 匹配指定的TCP标志 - ack - 确认数据 - cwr - 拥塞窗口减少 - ece - ECN-echo标志(明确的拥塞通知)。 - fin - 关闭连接 - psh - 推送功能 - rst - 撤销连接 - syn - 新连接 - urg - 紧急数据 |
| tcp-mss (integer[-integer]: 0...65535; Default: ) | 匹配IP包的TCP MSS值。 |
| time (time-time,sat | fri | thu | wed | tue | mon | sun; Default: ) | 允许根据数据包的到达时间和日期创建一个过滤器,或者对于本地生成的数据包,创建离开时间和日期。 |
| tls-host (string; Default: ) | 允许根据TLS主机名来匹配流量。接受 GLOB语法 的通配符。注意,如果TLS握手帧被分割成多个TCP段(数据包),匹配器将无法匹配主机名。 |
| ttl (equal | greater-than | less-than | not-equal : integer(0..255); Default: ) | 匹配数据包的TTL值。 |
统计信息
显示额外的只读属性:
| 属性 | 说明 |
|---|---|
| bytes (integer) | 规则匹配的字节总数 |
| packets (integer) | 规则匹配的数据包总量 |
打印统计信息:
[admin@MikroTik] > ip firewall mangle print stats all
Flags: X - disabled, I - invalid, D - dynamic
# CHAIN ACTION BYTES PACKETS
0 D ;;; special dummy rule to show fasttrack counters
prerouting passthrough 18 176 176 30 562
1 D ;;; special dummy rule to show fasttrack counters
forward passthrough 18 176 176 30 562
2 D ;;; special dummy rule to show fasttrack counters
postrouting passthrough 18 176 176 30 562
3 forward change-mss 18 512 356
配置实例
改变MSS
众所周知,由于封装开销,VPN 链路的数据包尺寸较小。如果一个大数据包的MSS超过了VPN链路的MSS,那么通过这种连接发送之前,应该对其进行分片。然而,如果该数据包设置了 Don’t Fragment 标志,则不能进行分片,应将其丢弃。在有破损的路径MTU发现(PMTUD)的链接上,可能导致一些问题,包括FTP和HTTP数据传输和电子邮件服务的问题。
在PMTUD中断的链路上,减少通过VPN链路的数据包的MSS就可以解决问题。下面的例子演示了如何通过mangle减少MSS值:
/ip firewall mangle add out-interface=pppoe-out protocol=tcp tcp-flags=syn action=change-mss new-mss=1300 chain=forward tcp-mss=1301-65535