2026-09-16
dscp

Как пометить DSCP трафик конкретного приложения в Windows и отправить его в VPN через mangle на Mikrotik

Иногда нужно, чтобы определённое приложение (например, 1С, видеозвонки или облачный клиент) ходило не через обычный интернет, а через VPN-туннель. Просто запустить приложение «в туннеле» сложно — в Windows нет встроенного способа привязать запуск exe к маршруту. Решение — связка из двух шагов:

  1. Windows: пометить пакеты нужного приложения меткой DSCP (QoS-меткой).
  2. Mikrotik: по DSCP-метке через mangle пометить подключения и отправить их в VPN-туннель.

DSCP — поле в IP-заголовке (6 бит). Windows умеет ставить его средствами QoS Policy. Mikrotik умеет его читать и маршрутизировать по нему. Ниже — полная рабочая схема.


Часть 1. Windows: ставим DSCP-метку на конкретное приложение

Способ A. Политика QoS через gpedit (наглядный)

Откройте gpedit.msc и перейдите:

Конфигурация компьютера → Административные шаблоны → Сеть → QoS Packet Scheduler → Политика на основе QoS

Нажмите Создать политику и заполните:

  • Имя: например VPN-1C
  • DSCP-значение: 46 (или 56/40 — см. таблицу ниже)
  • Применять к: Только приложениям с именем1cv8.exe
  • Протокол: TCP и UDP
  • Укажите порт или оставьте «Любой».

Примените политику и выполните в консоли gpupdate /force.

Важно: gpedit работает в Windows Pro/Enterprise. В Home используйте способ B.

Способ B. Через реестр или PowerShell (Windows Home)

DSCP также можно задать политикой QoS через реестр. Создайте ключ политики:

$policyName = "VPN-App-DSCP-46"
$policyPath = "HKLM:SOFTWAREPoliciesMicrosoftWindowsPsched"
$qosPath = "$policyPath$policyName"
New-Item -Path $qosPath -Force | Out-Null
New-ItemProperty -Path $policyPath -Name "Version" -Value 1 -PropertyType DWord
New-ItemProperty -Path $qosPath -Name "AppName" -Value "myapp.exe" 
New-ItemProperty -Path $qosPath -Name "DSCPValue" -Value 46 -PropertyType DWord
New-ItemProperty -Path $qosPath -Name "Protocol" -Value 6 -PropertyType DWord
New-ItemProperty -Path $qosPath -Name "Port" -Value 0 -PropertyType DWord
New-ItemProperty -Path $qosPath -Name "ThrottleRate" -Value -1 -PropertyType DWord
New-ItemProperty -Path $qosPath -Name "Version" -Value 1 -PropertyType DWord
gpupdate /force
  • AppName — имя процесса (можно несколько приложений одной политикой не получить; на каждое — отдельная политика, либо перечислите через |, например one.exe|two.exe).
  • Protocol: 6 = TCP, 17 = UDP, 0 = любой.
  • DSCPValue: значение в десятичной системе (46 = EF для видео).

Проверка метки на Windows

С PowerShell с правами администратора запустите netsh trace start, запустите приложение, затем netsh trace stop и откройте .etl в Microsoft Message Analyzer / Wireshark. В фильтре Wireshark:

ip.dsfield.dscp == 46

Если метка ставится, вы увидите пакеты с DSCP 46 от нужного процесса.

Нюанс: DSCP ставится только для исходящих с этой машины пакетов. Для защищённых туннелей (IPsec) метка уходит в шифрованную часть — это ок, если туннель терминируется на Mikrotik, а не на Windows.


Часть 2. Mikrotik: mangle — в VPN туннель по DSCP

Теперь на роутере Mikrotik (например, на границе сети) читаем DSCP входящих из LAN пакетов, помечаем их и отправляем в туннель.

Шаг 1. Помечаем соединение и пакет по DSCP

/ip firewall mangle
add chain=prerouting dst-address-list=!no_vpn in-interface=bridge-local 
    dscp=46 action=mark-connection new-connection-mark=vpn-conn 
    pass-through=yes comment="DSCP46 -> connection"
add chain=prerouting connection-mark=vpn-conn in-interface=bridge-local 
    action=mark-packet new-packet-mark=vpn-traffic 
    pass-through=no comment="marked conn -> packet"

Где:
in-interface=bridge-local — интерфейс, с которого приходит трафик от ПК (у вас может быть ether1-local и т.п.);
dscp=46 — номер метки из Windows;
dst-address-list=!no_vpn — не трогать исключения (список no_vpn создайте сами и добавьте нужные подсети).
pass-through первое правило = yes (цепочка: сначала connect-mark, потом packet-mark).

Шаг 2. Создаём правило маршрутизации (routing rule)

Ключевой момент: метка пакета ≠ маршрут. Чтобы «заставить» marked-пакет уйти в туннель, нужен router-mark + отринская таблица + routing rule:

# временно (на время проверки) можно через route table:
/ip route
add dst-address=0.0.0.0/0 gateway=<vpn_interface> routing-table=vpn-table 
    distance=1 comment="VPN default"

/routing/rule
add src-address=0.0.0.0/0 routing-table=main table=vpn-table 
    packet-mark=vpn-traffic comment="VPN traffic -> vpn-table"

Что важно:

  • Lane настройка: routing/rule указывает: пакеты с packet-mark=vpn-traffic, пришедшие с main routing table, ищут маршрут в таблице vpn-table.
  • В vpn-table только один маршрут — default через интерфейс туннеля (например wireguard1, pppoe-out соединение VPN, l2tp-out1, ovpn-out1).
  • Не добавляйте этот default в main — только в vpn-table, иначе весь трафик упадёт в туннель.

Шаг 3. NAT — если приложение ходит в интернет через туннель

Если приложение обращается к внешним серверам (не в вашей LAN), нужно добавить masquerade для marked-трафика:

/ip firewall nat
add chain=srcnat packet-mark=vpn-traffic out-interface=<vpn_interface> 
    action=masquerade comment="NAT VPN traffic"

Если же туннель ведёт в вашу удалённую сеть (например, 10.0.0.0/8) — masquerade не нужен, достаточно route.


Готовая схема «под ключ»

Цепочка полностью:

Пакет Где решается Результат
Из myapp.exe Windows QoS DSCP=46
Приходит в LAN на Mikrotik mangle prerouting connection-mark=vpn-conn
Тот же пакет mangle prerouting (по conn) packet-mark=vpn-traffic
Маршрутизация routing/rule main → vpn-table
Исход route vpn-table gateway=<туннель>
В интернет NAT srcnat masquerade

Полный список правил (все вместе)

# Mangle
/ip firewall mangle
add chain=prerouting in-interface=bridge-local dscp=46 
    action=mark-connection new-connection-mark=vpn-conn pass-through=yes 
    comment="DSCP 46 -> connection mark"
add chain=prerouting in-interface=bridge-local connection-mark=vpn-conn 
    action=mark-packet new-packet-mark=vpn-traffic pass-through=no 
    comment="conn mark -> packet mark"

# Routing table и правило
/ip route
add dst-address=0.0.0.0/0 gateway=wireguard1 routing-table=vpn-table 
    comment="Default via VPN"

/routing/rule
add packet-mark=vpn-traffic routing-table=main table=vpn-table 
    comment="Marked traffic uses vpn-table"

# NAT
/ip firewall nat
add chain=srcnat packet-mark=vpn-traffic out-interface=wireguard1 
    action=masquerade comment="Masq for VPN traffic"

Замените wireguard1 на ваш туннель (WireGuard, OpenVPN, L2TP, PPPoE-туннель и т.д.).


Выбор DSCP-значения

Значение Class Для чего
46 EF (Expedited Forwarding) Видео, голос
34 AF41 Требовательно к задержкам
26 AF31 Обычный приоритет
0 Best Effort Весь остальной трафик

Для 1С/бизнес-приложений обычно хватает 46, если в сети не настроен QoS-протокол с конфликтующими классами, или 26/34, чтобы не задирать приоритет выше голоса/VoIP.

dscp=46 в RouterOS соответствует DSCPValue=46 в Windows при Protocol=6|17. Убедитесь, что туннель-интерфейс имеет MTU не больше, чем на физическом канале, иначе пакеты могут фрагментироваться и терять метку.


Проверка результата

  1. Из Windows: ping -S <IP> -c 5 <адрес_VPN_ресурса> не поможет — используйте само приложение или tracert:
    cmd
    tracert <IP_VPN_ресурса>

    Если первый хоп — IP туннельного интерфейса Mikrotik (например 10.0.0.2), значит трафик идёт в туннель.
  2. На Mikrotik: /tool sniffer quick ip-protocol=tcp port=<порт> interface=bridge-local, отфильтруйте по DSCP 46 — пакеты с меткой видны.
  3. :put [/ip firewall mangle print count-only] счётчики — должны расти у правил mangle при работе приложения.
  4. На удалённом VPN-сервере: tcpdump -i tun0 ip[1] == 0xb8 (46 DSCP = 0xB8 в TOS-байте с ECN-битами) — увидите помеченные пакеты.

Тонкости и подводные камни

  • Windows QoS Policy не работает для старого контекста. Если приложение стартует до применения политики, перезапустите его. Проверить можно через Get-NetQosPolicy.
  • Несколько приложений: в одной политике AppName=one.exe|two.exe работает не всегда стабильно. Надёжнее — одна политика на приложение с одинаковым DSCP. Либо единая политика на порт/подсеть, если приложение, например, 1С-сервер (1cv8.exe на конкретном порту).
  • DSCP теряется при шифровании, если туннель делает IPsec на Windows-машине. Поэтому туннель должны терминировать именно Mikrotik (WireGuard/OpenVPN на роутере), иначе метка внутри ESP не видна.
  • FastTrack рулит мимо mangle: если включён FastTrack, сначала через firewall filter отключите fasttrack для этого трафика:
    routeros
    /ip firewall raw
    add chain=prerouting in-interface=bridge-local dscp=46 action=notrack
    comment="no fasttrack for dscp46"

    Иначе пакеты уйдут по своим маршрутам, минуя connection-mark.
  • RouterOS 6 vs 7: синтаксис routing/rule верен для RouterOS 7; в 6-й версии тоже есть /routing rule, но рекомендуется проверять на вашей сборке.

Вывод

Через связку QoS Policy в Windows (DSCP) + mangle/routing rule на Mikrotik можно прицельно отправлять трафик конкретного exe-приложения в VPN-туннель, не переводя весь компьютер в VPN и не устанавливая программные VPN-клиенты. Главное — ровно три точки: DSCP на пакете → connection/packet mark в mangle → routing rule в vpn-таблицу.
Стоит отметить что 1C в качестве примера, а пометить трафик можно абсолютно любого EXE приложения, в том числе OpenCode, браузер, продукты Adobe и т.д.

Проверено на: Windows 10/11 Pro + RouterOS 7.
Дата: Сентябрь 2026.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *