Как пометить DSCP трафик конкретного приложения в Windows и отправить его в VPN через mangle на Mikrotik
Иногда нужно, чтобы определённое приложение (например, 1С, видеозвонки или облачный клиент) ходило не через обычный интернет, а через VPN-туннель. Просто запустить приложение «в туннеле» сложно — в Windows нет встроенного способа привязать запуск exe к маршруту. Решение — связка из двух шагов:
- Windows: пометить пакеты нужного приложения меткой DSCP (QoS-меткой).
- 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 не больше, чем на физическом канале, иначе пакеты могут фрагментироваться и терять метку.
Проверка результата
- Из Windows:
ping -S <IP> -c 5 <адрес_VPN_ресурса>не поможет — используйте само приложение илиtracert:
cmd
tracert <IP_VPN_ресурса>
Если первый хоп — IP туннельного интерфейса Mikrotik (например 10.0.0.2), значит трафик идёт в туннель. - На Mikrotik:
/tool sniffer quick ip-protocol=tcp port=<порт> interface=bridge-local, отфильтруйте по DSCP 46 — пакеты с меткой видны. :put [/ip firewall mangle print count-only]счётчики — должны расти у правил mangle при работе приложения.- На удалённом 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.