January 8

Mikrotik маршрутизация трафика отдельных приложений на примере Discord

Долгое время я использовал V2Ray для маршрутизации трафика отдельных приложений, но т.к. это всё же по своей природе прокси то там бывали не приятные особенности (например играя в онлайн игры тебя выкидывало если рвался туннель, или огромная нагрузка на процессор если запускаешь Torrent клиент). Да и вообще являясь обладателем роутера Mikrotik хотелось сделать всё по человечески.

Собственно задача весь трафик пускать через провайдера, а трафик отдельных приложений через туннель до VPS.

Первое что нам потребуется это промаркировать трафик приложений это и было основной сложностью, пока я не узнал про существование DSCP меток. Это одна из функций QoS технологии которая позволяет помечать трафик отдельных приложений, дабы потом с помощью роутера использовать те или иные правила.

Естественно т.к. это QoS функционал то соответствующий компонент должен быть включен в настройках сетевой карты.

Далее всё буду рассматривать на примере Windows 10 Professional (в интернете много статей, как установка меток DSCP осуществляется через оснастку gpedit.msc, как описано ниже)

1) Открываем gpedit.msc далее Конфигурация компьютера -> Конфигурация Windows -> QoS на основе политики нажимаем ПКМ и Создать новую политику

2) На первом шаге мастера указываем Имя и номер DSCP метки (от 0 до 63). Я выбрал 32. Почему 32? - а у нее просто очень хорошее число, в бинарном виде DSCP передается как 100000, а TOS 100 - дело в том что некоторые старые устройства не понимают что такое DSCP и метку обрезают с конца до TOS и число 100000 превращается в 100 - такую метку наш роутер тоже поймет.

Так же тут вы можете ограничить скорость если это требуется

3) На следующем шаге указываем условия отбора (в нашем случае указываем имя приложения трафик которого необходимо пометить). Учтите у Discord есть ещё приложение Update.exe для которого необходимо добавить соответствующее правило.

4) На следующем шаге если требуется можем ограничить работу правило только у требуемых IP адресов

5) Ну и на последнем может указать Порты и Тип трафика (мы используем и TCP и UDP)

В дополнение вот небольшая таблица используемых DSCP (если честно до конца в этом вопросе я не разбирался т.к. это мне и не требуется)

На этом настройка правила закончна, но только учтите такие настройки работают только в доменном профиле, в случае работы без домена нужно использовать командный апплет PowerShell New-NetQoSPolicy.

По сути он делает тоже самое но только из командной строки и такие правила будут работать и без домена.

1) Открываем PowerShell и вводим команду

New-NetQosPolicy -Name "Discord_dscp" -DSCPAction 32 -NetworkProfile All -AppPathNameMatchCondition "discord.exe" -IPProtocolMatchCondition Both

Где

-Name - это имя правила

-DSCPAction -это номер метки

-NetworkProfile - это сетевые профили к которым следует применить правило

-AppPathNameMatchCondition - это имя приложения

-IPProtocolMatchCondition - это тип трафика (both это TCP и UDP)

Посмотреть существующие правила можно командой Get-NetQosPolicy

Если вам нужны дополнительные параметры, то можете почитать о их использовании в описании командлета по ссылке https://learn.microsoft.com/en-us/powershell/module/netqos/new-netqospolicy?view=windowsserver2025-ps

Так же хотелось бы добавить что Get-NetQosPolicy выводит все политики и доменные и локальные, а вот gpedit.msc только доменные (правила добавленные через командлет вы там не увидите).

Дальше я рассмотрю настройку маршрутизации трафика помеченного DSCP меткой на Mikrotik с настроенным туннелем Wireguard (настройка Wireguard рассматривалась в этой статье)

Тут всё достаточно просто (вариант решения не панацея, а лишь пример вы можете использовать свои правила маршрутизации). Уточнюсь все действия проводились на микротике с версией прошивки 7.16 (в версиях 6.49+ всё тоже самое ниже уже не подскажу)

Я для простоты настройки маршрутизации буду использовать отдельную таблицу маршрутизации

1) Создадим отдельную от основной таблицу маршрутизации Routing-> Tables -> Add заполним имя dpi_mark или на ваш выбор(эти таблицы должны быть помечены как fib (Forwarding Information Base))

2) Далее настроим маркировку трафика. Все действия по маркировке мы будем выполнять в цепочке PREROUTING таблицы mangle, при этом помним, что правила обрабатываются в порядке очереди до первого терминирующего правила.

Переходим в IP -> Firewall -> Mangle и создаем следующее правило: Chain - prerouting, я дополнительно указал входящий интерфейс In Interface List (чтоб отрабатывать только исходящие пакеты)

На вкладке Advanced указываем номер DSCP(TOS) метки трафик с которой мы будем помещать в отдельную таблицу маршрутизации (у нас это 32)

На закладке Action выбираем mark routing и в поле New Routing Mark указываем ранее созданную таблицу маршрутизации, в которую мы направляем трафик, в нашем случае dpi_mark также обязательно ставим флаг Passthrough, чтобы пакет продолжил движение по таблице.

3) Ну и далее завернем весь этот трафик в наш созданные туннель Wireguard в меню IP -> Routes -> Add

Dst. Address - 0.0.0.0/0 т.к будем перенаправлять весть трафик таблицы в туннель

Gateway - укажем название интерфейса туннеля в моем случае Wireguard1

Distance - укажем метрику подальше чтоб избежать случайных недразумений

Scope - 30 (описание ниже кому интересно)

Target Scope - 10 (описание ниже кому интересно)

Route Table - указываем созданную ранее таблицу маршрутизации

Немного теории кому интересно:

Таблица маршрутизации может быть большая и поиск по ней может быть затратным, в тоже время шлюз будет располагаться в одной из непосредственно присоединенных сетей, возможно следует ограничить поиск только по ним?

Для решения этой проблемы в Linux, а следовательно, и в RouterOS, введены понятия области маршрута - Scope, и области поиска - Target-scope. Теперь вернемся к нашей таблице маршрутизации, "нулевой" маршрут имеет область - 30 и область поиска - 10. Следовательно дальнейший поиск будет вестись только среди маршрутов с областью 10.

По умолчанию данные опции имеют следующее значение:

  • Непосредственно присоединенные сети: Scope - 10, Target Scope не имеет смысла, так как данный маршрут указывает на интерфейс выхода
  • Динамические маршруты - OSPF, RIP, MME: Scope - 20, Target Scope - 10
  • Статические маршруты: Scope - 30, Target Scope - 10

На этом настройка закончена весь трафик с меткой DSCP 32 пойдет на наш VPS сервер и дальше будет маршрутизирован по его правилам, и больше не нужны ни какие прокси типа Proxyfier и V2Ray чтоб маршрутизировать трафик отдельных приложений.

P.S. Добавлю что при изучении вопроса люди с Windows 7 (в моем случае обошлось без этих телодвижений) сталкивались с проблемой, что метка не назначалась и им помогали следующие шаги:

Подготовка для установки разрешений QoS

  • Нажмите Win+R и в открывшемся окне введите regedit. Откроется окно редактора реестра.
  • Откройте папку HKEY_LOCAL_MACHINE → SYSTEM → CurrentControlSet → Services → Tcpip → Parameters.
  • Установите для параметра DisableUserTOSSetting значение 0.Если такого параметра не существует — необходимо его создать.
  • Откройте папку реестра HKEY_LOCAL_MACHINE → SYSTEM → CurrentControlSet → Services → Tcpip → QoS.
  • Создайте строковый параметр Do not use NLA и установите его значение 1.