Я разрабатываю клиент Windows VPN/туннелирования на C# (.NET 10, Windows Forms), который использует Wintun + tun2socks для создания общесистемного туннеля. Я хочу реализовать раздельное туннелирование, чтобы выбранные приложения (исполняемые файлы процесса) отправляли свой трафик через адаптер Wintun, в то время как другие приложения использовали обычный интерфейс.
Что я пробовал
Изменение таблицы системных маршрутов (RouteAdd/RouteDelete) до/после запуска: работает, но работает грубо и влияет на весь трафик, соответствующий маршруту.
Перехват и повторное внедрение на основе WinDivert для каждого процесса: многообещающе, но сложно создать пару сокетов для надежной обработки идентификаторов, и возникают проблемы с производительностью.
Драйвер выноски платформы фильтрации Windows (WFP): найдены ссылки, но я не хочу писать драйвер ядра, если это возможно.
Цель/вопрос
Каковы стандартные и надежные подходы Windows для маршрутизации трафика от конкретного процесса через определенный интерфейс (Wintun) из пользовательский режим C #? В частности:
Существует ли поддерживаемый API или шаблон пользовательского режима для привязки исходящих сокетов процесса к определенному интерфейсу или маршруту без драйвера ядра?
Если нет, то рекомендуемый подход:
изменить IP-маршруты (грубо) или
использовать WinDivert в пользовательском режиме (и каковы предостережения) или
Практические соображения: производительность, надежность, требуемые повышенные привилегии, подводные камни, которые нарушают работу приложений (игры/VoIP).
Пожалуйста, включите ссылки или короткие примеры библиотек/API для изучения на C# (.NET). Я стараюсь, если возможно, избегать написания драйвера ядра; если драйвер необходим, полезно четкое обоснование.
Среда:
Я разрабатываю клиент Windows VPN/туннелирования на C# (.NET 10, Windows Forms), который использует Wintun + tun2socks для создания общесистемного туннеля. Я хочу реализовать раздельное туннелирование, чтобы выбранные приложения (исполняемые файлы процесса) отправляли свой трафик через адаптер Wintun, в то время как другие приложения использовали обычный интерфейс. Что я пробовал [list] [*]Изменение таблицы системных маршрутов (RouteAdd/RouteDelete) до/после запуска: работает, но работает грубо и влияет на весь трафик, соответствующий маршруту. [*]Перехват и повторное внедрение на основе WinDivert для каждого процесса: многообещающе, но сложно создать пару сокетов для надежной обработки идентификаторов, и возникают проблемы с производительностью. [*]Драйвер выноски платформы фильтрации Windows (WFP): найдены ссылки, но я не хочу писать драйвер ядра, если это возможно. [/list] Цель/вопрос Каковы стандартные и надежные подходы Windows для маршрутизации трафика от конкретного процесса через определенный интерфейс (Wintun) из пользовательский режим C #? В частности: [list] [*]Существует ли поддерживаемый API или шаблон пользовательского режима для привязки исходящих сокетов процесса к определенному интерфейсу или маршруту без драйвера ядра? [*]Если нет, то рекомендуемый подход: [list] изменить IP-маршруты (грубо) или [*]использовать WinDivert в пользовательском режиме (и каковы предостережения) или [*]реализовать драйвер WFP (насколько распространено/необходимо)? [/list]
[*]Практические соображения: производительность, надежность, требуемые повышенные привилегии, подводные камни, которые нарушают работу приложений (игры/VoIP). [/list] Пожалуйста, включите ссылки или короткие примеры библиотек/API для изучения на C# (.NET). Я стараюсь, если возможно, избегать написания драйвера ядра; если драйвер необходим, полезно четкое обоснование. Среда: [list] [*]Windows 11 [*].NET 10 [*]Wintun + tun2socks (процесс пользовательского режима) [*]Цель: разделенный туннель для каждого процесса как для TCP, так и для UDP (игры) [/list] Спасибо!