Mangle

RouterOS 中的 mangle 使用特殊标记为数据包打标,以便进行高级处理,从而支持 queue tree、NAT 等功能。它会修改 IP 头部字段,并通过五个预定义链(PREROUTING、INPUT、OUTPUT、FORWARD、POSTROUTING)根据数据包标记或连接状态来应用规则。

Mangle

Mangle 是一种"标记器",它用特殊标记为数据包打标,以便后续处理。RouterOS 中的许多其他功能都会使用这些标记,例如 queue tree、NAT、路由。它们根据数据包的标记来识别数据包并据此进行处理。mangle 标记只存在于路由器内部,不会通过网络传输。

此外,mangle 功能还用于修改 IP 头部中的某些字段,例如 TOS(DSCP)和 TTL 字段。

防火墙 mangle 规则由五个无法删除的预定义链组成:

  • PREROUTING 链:此链中的规则作用于刚刚到达网络接口的数据包。
  • INPUT 链:此链中的规则作用于即将交给本地进程处理的数据包。
  • OUTPUT 链:此处的规则作用于刚由某个进程生成的数据包。
  • FORWARD 链:此处的规则作用于任何经由当前主机路由的数据包。
  • POSTROUTING 链:此链中的规则作用于即将离开网络接口的数据包。

配置示例

修改 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

标记连接

有时需要对属于某条特定连接的数据包执行某些操作(例如为队列标记来自/发往特定主机的数据包),但逐一检查每个数据包的 IP 头部开销很大。我们可以使用连接标记来略微优化配置。

/ip/firewall/mangle
add chain=forward in-interface=local src-address=192.168.88.123 connection-state=new action=mark-connection new-connection-mark=client_conn
add chain=forward connection-mark=client_conn action=mark-packet new-packet-mark=client_p

危险

警告:数据包标记最多只能有 4096 个唯一条目。超过该限制会引发错误 "bad new packet mark"。