Роутинг для отдельных приложений Windows

С помощью предложенного решения можно для явно выбранных вами приложений Windows использовать свой путь сетевого трафика с помощью DSCP-меток.

Эти метки согласно стандартам служат для совсем иных целей, поэтому считаю своим долгом упомянуть это явно. Несмотря на то, что по умолчанию Windows не ставит на сетевые пакеты DSCP-метки могут быть случаи, когда QoS вам окажется дороже предложенной возможности. Решение лучше не применять на относительно «узких» каналах связи, таких как 3G или ADSL, где ощущается потребность в приоритезации трафика. Кроме того, желательно проводное подключение между роутером и Windows PC, т.к. беспроводные адаптеры используют DSCP-метки для WMM и необходимых настроек у адаптера скорее всего просто не будет.

Требования

  • Windows начиная с XP или Server 2003 и выше в качестве клиента,
  • Сетевой адаптер клиента с поддержкой 802.1Q (почти любой современный проводной),
  • Прошивка 3.5 и выше. Должны быть отключена приоритезация трафика и IntelliQoS, чтобы прошивка не использовала DSCP-метки,
  • Развёрнутая среда Entware,
  • Рабочее VPN-соединение или EoIP/GRE-туннель поверх провайдерского, по которому будет идти трафик от выбранных приложений.

Настройки в Windows

«Окраска» трафика приложений в Windows DSCP-метками входит в штатный функционал и не требует установки дополнительных утилит.

Необходимо убедиться в том, что на сетевом адаптере включена поддержка 802.1Q. В разделе Дополнительно параметр называется Приоритет & VLAN (Packet Priority & VLAN) или похоже.

В редакторе реестра (regedit.exe) откройте раздел HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Tcpip\Parameters и создайте DWORD-параметр с именем DisableUserTOSSetting и значением 0. Затем откройте раздел HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Tcpip\Qos, если такового нет — создайте. Здесь создайте параметр типа String с именем Do not use NLA и значением 1.

Теперь в редакторе групповых политик (gpedit.msc) перейдите в раздел Политика “Локальный компьютер” → Конфигурация компьютера → Конфигурация Windows → QoS на основе политики” (“Computer configuration → Windows Settings → Policy-based QoS” в англоязычной версии), кликните на разделе правой кнопкой и выберите пункт Создать новую политику. В появившемся мастере присвойте политике логичное имя и укажите значение DSCP, отличное от нуля. В примере ниже используется 63. На следующем шаге выберите вариант Применять политику… только к приложениям с именем исполяемого файла и укажите полный путь или только имя исполняемого файла для выбранной программы, например, chrome.exe. На последующем шаге мастера можно оставить значения по умолчанию Любой исходный IP-адрес/Любой конечный IP-адрес, на последнем в пункте Протокол, к которому применяется политика QoS укажите TCP и UDP. Завершите работу мастера и перегрузите клиентский компьютер, чтобы настройки вступили в силу.

Настройка роутера

В примере трафик с выбранного Windows приложения направляется в OpenVPN-туннель, имеющий имя интерфейса ovpn_br0. Для сопоставления между установленным VPN-соединением и именем интерфейса посмотрите вывод команды ip addr и найдите интерфейс, имеющий такой же IP-адрес как в веб-интерфейсе кинетика.

Установите необходимые пакеты:

opkg install iptables

Добавьте скрипты, которые периодически будет вызывать прошивка. Первый, /opt/etc/ndm/fs.d/100-create_routing_table.sh:

#!/bin/sh

[ "$1" != "start" ] && exit 0

### Load additional module
insmod /lib/modules/$(uname -r)/xt_dscp.ko

### Create routing table for marked packets
ip rule add fwmark 1 table 1001

exit 0

Второй, /opt/etc/ndm/netfilter.d/100-fwmarks.sh:

#!/bin/sh

[ "$type" == "ip6tables" ] && exit 0
[ "$table" != "mangle" ] && exit 0

if [ -z "$(iptables-save | grep 'dscp')" ]; then
    iptables -w -A PREROUTING -i br0 -t mangle -m dscp --dscp 63 -j MARK --set-mark 1
    ip route add default dev ovpn_br0 table 1001
fi
exit 0

и не забудьте сделать их исполняемыми:

chmod +x /opt/etc/ndm/fs.d/100-create_routing_table.sh
chmod +x /opt/etc/ndm/netfilter.d/100-fwmarks.sh

Если всё сделали правильно, после перезагрузки роутера будет:

  • поднято VPN-соединение,
  • создана отдельная таблица роутинга, которая будет им пользоваться,
  • пакеты от Windows-приложения с DSCP-меткой, равной 63 будут помещаться в эту таблицу.

Использование

В примере выше маркирование трафика браузера chrome.exe демонстрируется для наглядности: открыв в двух разных браузерах сервис oip.cc или подобный, можно наглядно убедиться в том, что трафик от разных браузеров идёт разными путями. Вместо браузера может быть приложение с гео-ограничениями или приложение, использующее корпоративные ресурсы по VPN. Можно расставлять разные метки разным приложениям или использовать одну и ту же для нескольких.

Диагностика проблем

Сперва убедитесь, что от клиента на роутер приходят пакеты с DSCP-меткой, вывод tcpdump во время работы приложения должен быть ненулевой:

opkg install tcpdump
tcpdump -i br0 -vvv "(ip[1] & 0xfc) >> 2 == 63"

Далее убедитесь в существовании отдельной таблицы роутинга меченых пакетов:

ip rule list
…
9:      from all fwmark 0x1 lookup 1001
…

В том, что в ней есть правило направления трафика через VPN-соединение:

ip route list table 1001
…
default dev ovpn_br0 scope link

И в том, что действует правило netfilter для пометки пакетов:

iptables-save | grep dscp

Удачи в начинаниях!

Использованные источники

  1. Управление QoS на платформе Windows,
  2. How to Set the DSCP Flag in Windows and Linux,
  3. Using Linux to verify DSCP.