Как реализовать поведение маршрутизации для каждого приложения в Windows? - PullRequest
1 голос
/ 03 июня 2019

Я использую VPN на рабочем столе Windows 10 (с использованием OpenVPN), и VPN является шлюзом по умолчанию, так что весь трафик по умолчанию проходит через VPN-туннель.

Однако я бы хотел исключить некоторыеприложения из VPN, так что их трафик направляется напрямую через физический интерфейс, передавая VPN (так называемое «раздельное туннелирование»)

Я предполагаю, что это решение будет включать API-интерфейс WFP (Windows Filtering Platform)и, возможно, эквивалент Windows

setsockopt(sock, SOL_SOCKET, SO_BINDTODEVICE, device, sizeof(device))

У меня это работает в Linux в настоящее время через "cgroups" и маршрутизацию на основе политик / несколько таблиц маршрутизации.

Но я понимаю, что Windowsне имеет ни маршрутизации на основе политик, ни нескольких таблиц маршрутизации.Но я все еще могу придумать способ достижения этого в Windows, но я не могу найти API-интерфейсы, чтобы это произошло

Один из способов - подключить создание сокетов для конкретного приложения, а затем использовать Windows-эквивалент SO_BINDTO_DEVICE опция сокета (setsockopt()) для принудительной привязки сокета к физическому интерфейсу, а не к драйверу крана.

Но, опять же, я не могу найти соответствующие API, чтобы это произошло.

Итак, у меня есть несколько вопросов:

(1) Возможно ли то, что я хочу сделать, в рамках указанных API WFP (Windows Filtering Platform) или Windows API в целом?если да, то какие API вы посоветуете мне посмотреть?

(2) Или я должен написать «драйвер вызова WFP»?Если да, то не могли бы вы указать мне некоторые ресурсы для этого, и, возможно, хорошую отправную точку для моей конкретной проблемы?:)

(3) Могу ли я что-то пропустить?более простой подход для достижения того, чего я хочу?Я знаю, что это возможно в Windows, так как я вижу эту функцию в некоторых VPN, но я хотел бы повторить ее в своем личном VPN:)

...