Я использую 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:)