Как привязать приложение к определенному сетевому интерфейсу
Вопрос: Как запустить программу, обеспечив при этом доступ к сети через определенный сетевой интерфейс?
Случай: Я хочу получить доступ к двум разным машинам с одинаковым IP (192.168.1.1), но доступным через два разных сетевых интерфейса (eth1 и eth2).
Пример:
Вышеприведенное является приблизительным примером того, что я хотел бы, вдохновленный привязкой оборудования, выполненной через primusrun и optirun .
Задача: Как предлагается в связанная ветка , используемые интерфейсы выбираются не программой, а ядром ( Следовательно, синтаксис предварительной привязки в приведенном выше примере).
Я нашел некоторые связанные решения, которые являются неудовлетворительными. Они основаны на связывании сетевых интерфейсов посредством внесения в черный список пользовательских сетей; то есть запуск процесса от имени пользователя, который может получить доступ только к одному конкретному сетевому интерфейсу.
Самый популярный ответ использует LD_PRELOAD хитрость, чтобы изменить сетевую привязку для программы, но современные ядра поддерживают гораздо более гибкую функцию, называемую "сетевыми пространствами имен", которая предоставляется через программу ip . Это ответ показывает, как использовать это. Из моих собственных экспериментов я сделал следующее (как root):
Также возможно в некоторой степени управлять сетевыми пространствами имен с помощью команд unshare и nsenter . Это позволяет вам также создавать отдельные пространства для PID, пользователей и точек монтирования. Для получения дополнительной информации см .:
Я принимаю ответ Грэма; это просто продолжение, чтобы объяснить изменения, которые я внес в его предложение, чтобы решить мою проблему.
Вместо того чтобы связывать физический интерфейс внутри пространства имен, я создал пару виртуальных сетевых интерфейсов с одним концом в сетевом пространстве имен и одним концом в корне. Пакеты затем направляются через эту виртуальную сеть из пространства имен в корневое пространство имен и затем в физический интерфейс. - Таким образом, я могу запускать все свои обычные передачи данных и, кроме того, запускать процессы, которые могут получить доступ только к определенному интерфейсу.
Как только интерфейсы настроены для eth0 и eth1 с соответствующими им пространствами имен eth0_ns и eth1_ns, программы могут быть выполнены на указанном интерфейсе через;
Решение I: Предварительная загрузка определенной библиотеки
App-Route-Jail: используйте ld_preload для принудительной активации интерфейсного шлюза (отличная идея, но требуются возможности root или меток) подробно о примечаниях ниже
Proxybound: используйте ld_preload для принудительной установки прокси в конкретном приложении (вместо интерфейса используется прокси)
Force-Bind: имеет много функций, но утечки привязки (не надежны)
Bind-Interface-IP: слишком простое соединение с утечкой (ненадежно)
Bind-IP: слишком простое соединение с утечкой (ненадежно)
Решение II: пользовательское пространство Linux
Классическое пользовательское пространство linux ip-netns : отличное решение, но требуется root, и интерфейс может существовать только в одном пользовательском пространстве
Firejail : Firejail может заставить приложение использовать определенную сеть, но совместимость ограничена (например, она не совместима с интерфейсами tun). firejail не требует root firejail --dns=8.8.8.8 --noprofile --net=eth0 --ip=192.168.1.1 app-command
Firejail with netns : Firejail может заставить приложение использовать определенное пространство пользователя, которое было создано отдельно, это позволит нам использовать пространства имен без корня firejail --dns=8.8.8.8 --noprofile --netns=nameOfyourNS app-command
Firejail с маскарадом и мостом : Firejail может заставить приложение использовать особый интерфейс с маскарадом iptables , это здорово и не требует root но это требует ip_forward и может означать влияние на безопасность firejail --net=br0 firefox
Решение III: Linux iptables
Iptables может быть использован для этой цели , но это требует ip_forward и может подразумевать влияние на безопасность, если оно настроено неправильно, пример 1 , пример 2 , пример , пример 4
Решения (I, II и III) примечания:
Wireguard
Если вы используете VPN (особенно wireguard) и хотите применить это решение к интерфейсу wireguard ( wireguard с пользовательским пространством ), вы можете следовать инструкции по созданию связанного пользовательского пространства, содержащего интерфейс wg ( и, следовательно, ограничен интерфейсом vpn) также это может быть объединено с firejail --netns=container чтобы иметь возможность использовать пространство пользователя без рута.
Как найти интерфейсный шлюз
Существует множество решений для поиска шлюза, здесь приведены некоторые команды, позволяющие найти используемый шлюз
У меня дома есть несколько разных устройств, которые требуют постоянного подключения к Интернету. Многие из тех же устройств выкачивают постоянную пропускную способность. Как кто-то, кто пытается сбалансировать жизнь персональных компьютеров, игр и бизнеса (главным образом) через настольный компьютер, трудно переворачивать. Необходимость приостанавливать все, что я делаю, чтобы получить постоянный пинг во время игры, так же раздражает, как неспособность надежно загружать торренты во время игры. Первые мировые проблемы, верно?
Если у вас есть два подключения к Интернету, которые могут подключаться к одному устройству, будь то два беспроводных подключения, два порта Ethernet или их комбинация, вы можете сбалансировать нагрузку между приложениями с помощью бесплатного и простого запускаемого инструмента. через командную строку.
ForceBindIP позволяет привязать любое приложение Windows к определенному сетевому интерфейсу, поэтому при запуске этого приложения оно будет использовать полосу пропускания, выделенную для этого конкретного сетевого подключения. Это означает, что вы, наконец, можете загружать огромные файлы, играя в онлайн-игры, не испытывая больших задержек.
ForceBindIP рекламируется как для NT / 2000 / XP / 2003, но отлично работает на Windows 7 для меня. Если вы используете 32-разрядную версию, приложение будет установлено в % WinDir% \ system32 . 64-разрядные операционные системы покажут установку в % WinDir% \ SysWOW64.
Чтобы использовать ForceBindIP, вам понадобится ваш локальный IP-адрес или GUID вашего сетевого интерфейса. Вот как вы можете найти свой локальный IP.
Перейдите в Центр управления сетями и общим доступом через панель управления. Сначала нажмите на красную область, а затем, когда это всплывет, синий. Вы увидите следующее.
Это ваш локальный IP. Если по какой-то причине вы хотите использовать GUID интерфейса, процесс немного сложнее. Я бы порекомендовал использовать статический локальный IP-адрес, поскольку это значительно облегчает процесс.
Теперь допустим, что я должен был подключиться к другой сети через Ethernet (что будет иметь приоритет перед этим беспроводным соединением). Однако я хочу запустить Chrome, используя мое беспроводное интернет-соединение. Не отключайтесь от беспроводной сети. Оставайтесь на связи, и тогда вы выполните следующую команду в командной строке:
После нажатия Enter, требуемый процесс будет запущен, и он будет работать через сетевой интерфейс, связанный с этим IP. Очень важно заключить все пути с пробелами в них (то есть каждое приложение в папках Program Files) в кавычки. Если вам необходимо доказать эффективность этого, вы можете запустить программу, подобную AdapterWatch, для просмотра входящих / исходящих сигналов нескольких сетевых интерфейсов.
ForceBindIP можно использовать несколькими способами, чтобы создавать умные и автоматизированные способы постоянного запуска определенных приложений через определенный сетевой интерфейс. Например, вы можете использовать такую программу, как Панель управления запуском, чтобы редактировать команды и параметры для скрытых элементов запуска. Таким образом, вы можете принудительно запускать программы через сетевой интерфейс при запуске Windows.
Вы также можете создавать ярлыки на рабочем столе, используя ForceBindIP.
Я даже дошел до того, что настроил пункты контекстного меню, чтобы можно было легко запускать любое приложение через определенный интерфейс, чему вы можете научиться здесь . Отдельное спасибо авторам StackExchange за помощь в этом!
Я пробовал ForceBindIP, но у него есть существенный недостаток - он не влияет на дочерние элементы приложения, которое я пытаюсь связать, а только на само приложение. Это также не может заставить приложение всегда запускаться через указанный интерфейс, оно должно выполняться forcebindip.exe каждый раз. Это становится проблемой для приложений, таких как League of Legends, где дерево процессов выглядит так:
Панель запуска запускает патчер, патчер запускает клиент и т. Д. Я могу влиять только на родителя всех этих процессов в дереве, поэтому настоящая игра не привязана к желаемому интерфейсу, что делает все это бессмысленным.
Есть ли более современная альтернатива ForceBindIP для Windows 7? На этом сайте есть много вопросов, похожих на этот, но они в основном старые. Может быть, теперь есть лучший способ решить эту проблему?
Моя текущая идея заключается в следующем:
Настройте локальный сервер 3proxy, связанный с желаемым интерфейсом.
Запустите игру через Proxifier или аналогичное программное обеспечение, настроенное для запуска через этот локальный прокси.
Я не уверен, что это сработает, но даже если это сработает, это кажется неоптимальным решением. Ребята, у вас есть идеи получше?
Изменить: моя идея не сработала :(
Редактировать 2: По сути, я пытаюсь добиться привязки нескольких приложений к обычному интерфейсу во время работы VPN. Причина в том, что мне нужно подключаться через VPN большую часть времени, но некоторые приложения (например, игры) не работают должным образом из-за более высокого пинга и других проблем.
Вам нужно привязать к IP каждый процесс в дереве или только LolClient.exe ? Является ли или ех? Я играю с сторонним DLL-инжектором и, возможно, я могу вам помочь, но мне нужно больше информации. LolClient.exe x86 x64 Вы пытаетесь привязать процесс к интерфейсу VPN или к обычному интерфейсу? Есть ли какая-то конкретная цель, которую вы пытаетесь достичь? По умолчанию игра не требует никаких входящих подключений для правильной работы. Вы пытаетесь обмануть или записать / воспроизвести игры? Я искал ответ на этот основной вопрос, но для хостов OSX. Мой пример использования - у меня есть LAN и WiFi одновременно. Локальная сеть находится в ограниченной корпоративной сети, Wi-Fi на моем WAP. Иногда мне нужен браузер или приложение, чтобы использовать только Wi-Fi, чтобы я мог д / л файлы заблокированы нашим брандмауэром. @VictorMarchuk Да, BindIp.dll 32-битный, поэтому он не будет работать с 64-битными процессами.Обновить
Я обнаружил, что ForceBindIp фактически передает параметры вызываемым исполняемым файлам. Он просто пропускает первый параметр . Поэтому я изменил свой сценарий для использования ForceBindIp.exe вместо пользовательского инжектора, и теперь похоже, что все проблемы с injectory исключениями исчезли и все работает.
Вот модифицированные шаги и BindIp.cmd скрипт:
Установите ForceBindIp как обычно
Поместите в BindIp.cmd любое место на вашем диске (например C:\BindIp\BindIp.cmd )
Затем выполните шаги 2-6 снизу.
Вступление
ForceBindIp не может автоматически внедрять BindIp.dll дочерние процессы и не передает параметры вызываемым исполняемым файлам . Но мне удалось обойти это, используя параметры выполнения файлов изображений в реестре , пакетный скрипт и сторонний DLL-инжектор . Подробности ниже.
теория
Для использования BindIp.dll без ForceBindIp.exe нас нужно выяснить, как они общаются ( ForceBindIp.exe нужно как-то передать dll-адрес в dll).
Я использовал IDA free и обнаружил, что ForceBindIp.exe создает переменную среды с именем, FORCEDIP которая содержит IP-адрес и BindIp.dll считывает IP-адрес из этой переменной, когда она вводится и выполняется в целевом процессе.
Чтобы обнаружить запуск целевого приложения, мы можем добавить Debugger ключ в опциях исполнения файла образа в реестре для этого исполняемого файла:
Kernel32! CreateProcess, когда вызывается без флагов создания DEBUG_PROCESS или DEBUG_ONLY_THIS_PROCESS, проверяет реестр, чтобы узнать, был ли установлен IFEO в исполняемом файле, который он запускает. Если да, тогда он просто добавляет путь отладчика к имени исполняемого файла, фактически выполняя запуск исполняемого файла под отладчиком.
«Отладчик» в нашем случае будет пакетным скриптом, который установит FORCEDIP переменную и запустит инъекцию dll-injector. Injectory затем начнется процесс, передать аргументы командной строки и впрыснуть BindIp.dll .
практика
Создайте папку где-нибудь ( C:\BindIp например) и поместите эти три файла в нее:
-
Создать ключ реестра (например LolClient.exe ) для целевого исполняемого файла в HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\
Добавьте строковое значение к этому ключу:
- Имя: Debugger
- Значение: C:\BindIp\BindIp.cmd
Предоставьте Users полные разрешения для этого ключа (скрипт должен будет изменять его при каждом запуске). Это должно выглядеть так:
Я пробовал ForceBindIP, но у него есть существенный недостаток - он не влияет на дочерние элементы приложения, которое я пытаюсь связать, а только на само приложение. Это также не может заставить приложение всегда запускаться через указанный интерфейс, оно должно выполняться forcebindip.exe каждый раз. Это становится проблемой для приложений, таких как League of Legends, где дерево процессов выглядит так:
Панель запуска запускает патчер, патчер запускает клиент и т. Д. Я могу влиять только на родителя всех этих процессов в дереве, поэтому настоящая игра не привязана к интерфейсу, который я хочу, что делает все это бессмысленным.
Существует ли более современная альтернатива ForceBindIP для Windows 7? На этом сайте есть много вопросов, похожих на этот, но они в основном старые. Может быть, теперь есть лучший способ решить эту проблему?
Моя текущая идея заключается в следующем:
Настройте локальный сервер 3proxy, привязанный к желаемому интерфейсу.
Запустите игру через Proxifier или аналогичное программное обеспечение, настроенное для запуска через этот локальный прокси.
Я не уверен, что это сработает, но даже если это сработает, это кажется неоптимальным решением. У вас, ребята, есть идеи получше?
Изменить: моя идея не сработала :(
Редактировать 2: По сути, я пытаюсь добиться привязки нескольких приложений к обычному интерфейсу во время работы VPN. Причина в том, что мне нужно подключаться через VPN большую часть времени, но некоторые приложения (например, игры) не работают должным образом из-за более высокого пинга и других проблем.
Вам нужно привязать к IP каждый процесс в дереве или только `LolClient.exe`? Является ли `LolClient.exe`` x86` или `x64` exe? Я играю с сторонним DLL-инжектором и, возможно, я могу вам помочь, но мне нужно больше информации. beatcracker 5 лет назад 0 Вы пытаетесь привязать процесс к интерфейсу VPN или к обычному интерфейсу? MariusMatutiae 5 лет назад 0 Есть ли какая-то конкретная цель, которую вы пытаетесь достичь? По умолчанию игра не требует никаких входящих подключений для правильной работы. Вы пытаетесь обмануть или записать / воспроизвести игры? Mario 5 лет назад 0 Я искал ответ на этот основной вопрос, но для хостов OSX. Мой пример использования - у меня есть LAN и WiFi одновременно. Локальная сеть находится в закрытой корпоративной сети, Wi-Fi на моем WAP. Иногда мне нужен браузер или приложение, чтобы использовать ** только ** Wi-Fi, чтобы я мог d / l файлы заблокированы нашим брандмауэром. SaxDaddy 5 лет назад 0 @beatcracker, я бы предпочел все дерево, но если у вас есть решение для одного потомка, это было бы хорошим началом. Я пытаюсь привязать процесс к обычному интерфейсу. Мне нужно использовать VPN для всех приложений, кроме выбранных (например, игр), поэтому мне нужен способ привязки приложений к обычному интерфейсу во время работы VPN. Victor Marchuk 5 лет назад 0 @beatcracker, извините, я забыл упомянуть тип процесса в последнем комментарии. Это 64-разрядная версия, но если у вас есть решение только для 32-разрядной версии, это будет лучше, чем ничего. Victor Marchuk 5 лет назад 0 @VictorMarchuk Да, `BindIp.dll` является 32-разрядным, поэтому он не будет работать с 64-разрядными процессами. beatcracker 5 лет назад 1 @VictorMarchuk Вы настраиваете VPN-подключение в Windows или используете стороннего клиента? g2mk 5 лет назад 0Update
I've found that ForceBindIp in fact is passing parameters to the called executables. It just omits first parameter. So I've modified my script to use ForceBindIp.exe instead of custom injector and now it looks like all issues with injectory exceptions are gone and everything works.
Here is modified steps and BindIp.cmd script:
Install ForceBindIp as usual
Put BindIp.cmd anywhere on your drive (e.g. C:\BindIp\BindIp.cmd )
Then follow steps 2-6 from below.
Introduction
ForceBindIp can't automatically inject BindIp.dll to child processes and doesn't pass parameters to the called executables. But I was able to circumvent this by using Image File Execution Options in registry, batch script and third-party dll injector. Details are below.
Theory
To use BindIp.dll without ForceBindIp.exe we need to find out how they communicate ( ForceBindIp.exe has to pass IP-address to dll somehow).
I've used IDA free and found that ForceBindIp.exe creates environment variable with name FORCEDIP that holds IP-address and BindIp.dll reads IP-address from this variable when it injected and executed in target process.
To detect target application launch, we can add a Debugger key in the Image File Execution Options in registry for this executable:
Kernel32!CreateProcess when called without the DEBUG_PROCESS or DEBUG_ONLY_THIS_PROCESS creation flags, checks the registry to see if IFEO has been set on the executable that it is launching. If yes, then it simply prepends the debugger path to the executable name, effectively getting the executable to launch under the debugger.
The "Debugger" in our case, will be a batch script, that will set FORCEDIP variable and launch the injectory dll-injector. Injectory then will start process, pass command-line arguments and inject BindIp.dll .
Practice
Create folder somewhere ( C:\BindIp for example) and put those three files in it:
-
Create registry key (e.g. LolClient.exe ) for target executable in HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\
Add String Value to this key:
- Name: Debugger
- Value: C:\BindIp\BindIp.cmd
Grant Users Full permissions on this key (the script will have to modify it at every launch). It should look like this:
Set required IP-address in BindIp.cmd
Repeat steps 3 and 4 for every executable you wish to bind ( rad_user_kernel.exe , LolLauncher.exe , LolPatcher.exe , etc.).
Now, every time when you launch executable that has corresponding registry entry, the BindIp.cmd script will launch instead and bind this program to desired IP-address.
Conclusion
I've tested this on my laptop running Windows 8.1 x64 and was able to successfully bind various programs (AIMP 2, BersIRC, Opera 12.4) to Ethernet or WiFi adapter using this technique. Unfortunately BindIp.dll is 32-bit, so it wouldn't work with 64-bit processes.
@VictorMarchuk Я провел больше тестов, и действительно, у 'injectory` иногда возникают проблемы с опцией `--args`. Не уверен почему. beatcracker 5 лет назад 0 Я не смог запустить его даже без `--args` с любым приложением Victor Marchuk 5 лет назад 0 @VictorMarchuk У вас есть пример? Я только что протестировал его с Opera 12.14 и командной строкой - он работал нормально. beatcracker 5 лет назад 0 @VictorMarchuk Кажется, что `ForceBindIp` на самом деле может передавать параметры, см. Мой обновленный ответ. beatcracker 5 лет назад 0I've found that HideMyAss! VPN client has Secure IP Bind feature that allows to bind applications to VPN interface:
Secure IP Bind enables you to force selected applications on your computer to only work once connected to our VPN servers. This ensures selected applications will only work behind a secure encrypted connection. If you open selected applications without being connected to our VPN, they won't be able to access the internet.
I've looked at it and it's based on a custom Layered Service Provider (LSP) dll and COM interface to control it. And it can be (ab)used without installing HideMyAss' VPN client.
Installing HideMyAss' Secure IP Bind
Copy those three files to a folder on your disk ( C:\HMA_Bind )
- ForceInterfaceCOM.dll
- ForceInterfaceLSP.dll
- InstallLSP.exe
Put Install.cmd and Uninstall.cmd to this folder
Install.cmd
Uninstall.cmd
- Run Install.cmd as Administrator. To verify, that installation succeeded, you can use Autoruns:
- To control Secure IP Bind, you have to call COM interface methods. This can be done in PowerShell. If you're on x64 OS, be sure to launch Windows PowerShell ISE (x86) or Windows PowerShell (x86) , because COM component is 32-bit.
First, you have to create new Secure IP Bind object:
And then you can call it's methods:
Uninstalling HideMyAss' Secure IP Bind
- Run Uninstall.cmd as Administrator, verify that uninstallation is succeeded with Autoruns.
Examples:
Note, that you have to create secure IP Bind COM object only once per PowerShell session. Examples below assume that you execute them in a new PowerShell session, so they always create new COM object.
Set IP to bind to, add firefox to bound applications, enable binding.
Globally enable IP binding:
Globally disable IP binding:
Remove application from list (stop binding for this application):
Notes
Because Secure IP Bind implemented as a custom Layered Service Provider (LSP) dll, those limitations apply:
LSPs have been deprecated since Windows Server 2012. Systems that include LSPs will not pass the Windows logo checks. Windows 8 style "metro" apps that use networking will automatically bypass all LSPs.
I've tested this method with various applications with mixed results: 32-bit applications work, but 64-bit not, i.e. I was able to bind 64-bit Explorer (probably because it's tab processes are 32-bit by default), but not 64-bit Waterfox browser or other 64-bit applications.
I can think of two solutions to the problem :
Create a virtual machine for running the game, which only uses the one network adapter.
If you know the range of IP addresses that the game uses, construct a network route that directs this range toward the gateway of the specific adapter.
I can add more information once I know your preferences. For example, in point 1 your preferred virtual machine product.
Использование ВМ создаст много дополнительных проблем, таких как снижение производительности и постоянное использование нескольких ГБ ОЗУ. Это мой последний вариант, я бы предпочел достичь его другим способом. Я не знаю точный диапазон IP-адресов, которые мне нужно привязать, потому что он мне нужен для всех видов приложений, включая программное обеспечение для обмена p2p (торренты). Может быть, есть брандмауэр, который позволяет вам создавать маршруты на основе соединений, которые устанавливает каждое приложение? Victor Marchuk 5 лет назад 1 Производительность: виртуальная машина не приведет к снижению производительности, если не использовать старый Virtual PC. Память: VMware и VirtualBox не выделяют всю память сразу, поэтому выделяется только память, которая действительно нужна виртуальной машине. Они также имеют дополнительное преимущество для игры, заключающееся в возможности приостановить и возобновить ВМ / игру в более позднее время, что намного лучше, чем сохраняющие способности большинства игр. Для диапазонов IP-адресов: если у вас их много, то вышеупомянутое не практично и не является прокси. harrymc 5 лет назад 0 @harrymc Я сомневаюсь, что можно было бы получить приемлемую 3D-производительность от ВМ, используя эмулированный графический процессор. Прямой доступ к графической карте сложен в настройке и требует наличия процессора с поддержкой VT-D (Intel) или AMD-Vi (и это недешево). beatcracker 5 лет назад 1 @harrymc Действительно, список впечатляет, так что я поправляюсь. Я должен чаще проверять технические характеристики оборудования :). Любопытно, можно ли использовать встроенные графические процессоры в современных процессорах Core в качестве «ОС», а внешние карты в качестве виртуальных процессоров VM? beatcracker 5 лет назад 0 Нужна ли здесь маршрутизация диапазона удаленных адресов? (И, если это сработает, разве это не сработает само по себе, без использования виртуальной машины?) Я могу представить, что вы сможете настроить гипервизор (VMware или VirtualBox), чтобы «видеть» только нужный интерфейс или применять ForceBindIP для гипервизора. Scott 5 лет назад 0 @ Скотт, это два разных решения, это не двухэтапный процесс. Victor Marchuk 5 лет назад 0Предположим, у вас есть две учетные записи Windows:
Когда вы входите в VpnUser учетную запись, вы можете запускать приложения (в частности, упомянутые вами игры) как HomeUser (Shift + RMB для исполняемого файла -> Запускать как другой пользователь), и эти приложения запускают свои дочерние процессы как HomeUser . Приложения, которые вы будете запускать стандартным способом (ярлыки, двойной щелчок на исполняемом файле), будут принадлежать VpnUser .
При определении сетевых подключений Windows у вас есть возможность разрешить другим пользователям использовать это подключение. Давайте предположим, что вы определили:
- HomeNetwork исключительно для HomeUser
- VpnNetwork исключительно для VpnUser
и для упрощения:
- На вашем компьютере нет других сетевых подключений.
В настоящее время у меня есть одна машина Windows, на которой я не могу много испортить, и я никогда не проверял описанную настройку, поэтому я не уверен, верно ли приведенное ниже утверждение.
Мое предположение может быть ограничено встроенным VPN-клиентом Windows - любой сторонний VPN-клиент требует дальнейшего изучения.
Я думаю, что приложения:
- Владелец VpnUser должен использовать только VpnNetwork .
- Владелец HomeUser должен использовать только HomeNetwork .
Если мои предположения верны, то при входе в VpnUser учетную запись приложения будут использовать VpnNetwork , когда приложения будут запускаться как HomeUser из VpnUser учетной записи, которые следует использовать HomeNetwork .
Читайте также: