在 MikroTik 路由器的防火墙规则中, mark-connection 和 mark-packet 是两种常用的标记方法。它们的主要区别和应用场景如下
标记功能的区别
mark-connection
用于标记同一连接中的所有数据包。适合需要对整个连接进行统一处理的场景, 比如区分上传和下载流量
- 优点: 只需对新连接标记一次, 后续所有属于该连接的数据包都会继承标记, 效率较高
- 使用场景: 识别双向流量 (上传和下载), 多线路策略路由等
mark-packet
用于标记单个数据包。适合对每个数据包进行独立判断的场景
- 优点: 可以精确标记每个数据包, 适合更细粒度的控制
- 使用场景: 区分小数据包、TCP 标志 (如 SYN 包) 优先处理等
性能分析
mark-connection
/ip firewall mangle
add chain=prerouting action=mark-connection new-connection-mark=HTTP protocol=tcp dst-port=80 in-interface=bridge-local
add chain=prerouting action=mark-packet new-packet-mark=HTTP in-interface=bridge-local connection-mark=HTTP
上述规则中, 第一条规则只需判断新连接是否符合条件并进行标记。第二条规则则直接根据连接标记对数据包进行处理, 无需重复判断协议和端口等条件。
- 优势: 在数据包处理过程中, 减少了重复判断的性能开销
mark-packet
/ip firewall mangle
add chain=prerouting action=mark-packet new-packet-mark=HTTP protocol=tcp dst-port=80 in-interface=bridge-local
add chain=prerouting action=mark-packet new-packet-mark=HTTP protocol=tcp dst-port=80 in-interface=pppoe-out1
上述规则对经过的每个数据包都需要判断以下条件
- 是否为 TCP 协议?
- 目标端口是否为 80?
- 进入的网络端口是否符合条件?
由于每个数据包都需要逐一匹配规则, 性能开销较大
QoS 场景中的选择
在 QoS 场景中使用 mark-connection 还是 mark-packet ?
- 在 QoS 场景中, 上传和下载需要分开处理, 因此一般会使用 mark-packet 来标记单向数据包
- 标记小数据包或优先处理 TCP SYN 包等场景, 使用 mark-packet
- 标记双向流量时, mark-connection 和 mark-packet 都可以, 但 mark-connection 更优
多线路带宽叠加和策略路由
在多线路叠加和策略路由中, 需要确保同一连接的所有数据包通过同一出口。此时, mark-connection 是更好的选择, 因为它可以确保整个连接的流量保持一致性
示例规则, 先标记数据再标记路由
/ip firewall mangle
add chain=prerouting action=mark-connection new-connection-mark=pppoe_out1_conn protocol=tcp dst-port=80 connection-state=new
add chain=prerouting action=mark-routing new-routing-mark=to_pppoe_out1 connection-mark=pppoe_out1_conn
我实际使用的规则
/ip firewall mangle
add chain=prerouting action=mark-connection in-interface=WAN-1000M-CU-vrrp4-pppoe new-connection-mark=WAN-1000M-CU-vrrp4-pppoe_conn passthrough=yes comment=WAN-1000M-CU-vrrp4-pppoe
add chain=prerouting action=mark-routing in-interface=LAN1 new-routing-mark=to_WAN-1000M-CU-vrrp4-pppoe connection-mark=WAN-1000M-CU-vrrp4-pppoe_conn passthrough=yes
总结
- mark-connection: 适用于需要对整个连接进行统一处理的场景, 效率更高, 推荐用于双向流量标记和策略路由
- mark-packet: 适用于需要对每个数据包进行独立标记的场景, 适合更细粒度的流量控制
原文