ИЗМЕНЕНИЕ: прежде чем я закончил, @lapsio отредактировал свой пост, предложив то же самое, но менее подробно. Оставляю это здесь для ленивых.
Одновременно можно назначить только одну метку соединения, поэтому назначение новой метки соединения означает перезапись (потерю) предыдущей. Чтобы использовать метки соединения для состояния и одновременно управлять метками маршрутизации для целей маршрутизации и метками пакетов для QoS, нужно использовать составные метки маршрутизации.
Допустим, вам нужно назначить две разные метки маршрутизации и три разные метки пакетов для QoS, и все комбинации этих двух категорий возможны. Сначала вы используете один набор правил mangle с критериями маршрутизации, чтобы назначить промежуточные метки соединения — cm_r1 и cm_r2. Затем вы используете два похожих набора правил mangle, каждый из которых относится к одной из назначенных выше меток соединения и использует те же критерии для QoS, чтобы назначить окончательные составные метки соединения — cm_r1_q1, cm_r1_q2, cm_r1_q3, cm_r2_q1, cm_r2_q2, cm_r2_q3.
Или можно использовать пользовательские цепочки для той же цели и назначать окончательные составные метки соединения сразу:
/ip firewall mangle
### цепочка=prerouting:
# пропустить назначение меток маршрутизации и пакетов, если пакет принадлежит уже помеченному соединению:
add chain=prerouting action=jump jump-target=assign-r-q-marks connection-mark=!no-mark
# сюда попадают только пакеты, принадлежащие ещё не помеченным соединениям, то есть начальные пакеты каждого соединения,
# потому что в chain=assign-r-q-marks всегда выносится окончательное решение, и управление оттуда не возвращается
add chain=prerouting action=jump jump-target=r1-conns ...критерии выбора политики маршрутизации #1 здесь...
# сюда должны попадать только начальные пакеты, соответствующие критериям политики маршрутизации #2
add chain=prerouting action=mark-connection new-connection-mark=cm_r2_q1 passthrough=yes ...критерии выбора QoS политики #1 здесь...
add chain=prerouting action=mark-connection new-connection-mark=cm_r2_q2 passthrough=yes connection-mark=no-mark ...критерии выбора QoS политики #2 здесь...
# сюда должны попадать только начальные пакеты, соответствующие критериям маршрутизации #2 и QoS политики #3
add chain=prerouting action=mark-connection new-connection-mark=cm_r2_q3 passthrough=yes connection-mark=no-mark
add chain=prerouting action=jump jump-target=assign-r-q-marks
### цепочка=r1_conns:
add chain=r1_conns action=mark-connection new-connection-mark=cm_r1_q1 passthrough=yes ...критерии выбора QoS политики #1 здесь...
add chain=r1_conns action=mark-connection new-connection-mark=cm_r1_q2 passthrough=yes connection-mark=no-mark ...критерии выбора QoS политики #2 здесь...
# сюда должны попадать только начальные пакеты, соответствующие критериям маршрутизации #1 и QoS политики #3
add chain=r1_conns action=mark-connection new-connection-mark=cm_r1_q3 passthrough=yes connection-mark=no-mark
add chain=r1_conns action=jump jump-target=assign-r-q-marks
### цепочка=assign-r-q-marks:
### сначала назначаем метки маршрутизации:
add chain=assign-r-q-marks action=mark-routing new-routing-mark=r1 connection-mark=cm_r1_q1,cm_r1_q2,cm_r1_q3 passthrough=yes
add chain=assign-r-q-marks action=mark-routing new-routing-mark=r2 passthrough=yes
### затем назначаем метки пакетов (QoS):
add chain=assign-r-q-marks action=mark-packet new-packet-mark=q1 connection-mark=cm_r1_q1,cm_r2_q1 passthrough=no
add chain=assign-r-q-marks action=mark-packet new-packet-mark=q2 connection-mark=cm_r1_q2,cm_r2_q2 passthrough=no
add chain=assign-r-q-marks action=mark-packet new-packet-mark=q3 passthrough=no