как привязать приложение к определенному сетевому интерфейсу
Как привязать приложение к определенному сетевому интерфейсу
Необходимость привязать программу к конкретному сетевому интерфейсу (сетевой карте) возникает не слишком часто. В том случае, если компьютер одновременно подключен к двум (и более) подсетям, к примеру, к корпоративной через Ethernet кабель и к публичной сети через Wi-Fi, как заставить приложение (тот же интернет браузер) отправлять данные только через конкретный интерфейс?
Windows при маршрутизации пакетов на системах с несколькими сетевыми интерфейсами выбирает интерфейс, через который слать данные в соответствии со своей таблицей маршрутизацией. Этот механизм не позволяет заставить определенное приложение всегда работать через конкретный сетевой интерфейс. Решение о маршруте отправки пакета все равно остается за ОС.
В моем случае для решения задачи привязки программы к сетевой карте, пришлось искать стороннее решение. В своих изысканиях я остановился на утилите ForceBindIP (http://www.r1ch.net/stuff/forcebindip/). Разберёмся, как ею пользоваться (для работы требуется наличие установленной библиотеки Visual Studio 2015 Runtime).
Архив с Portable версией утилиты содержит 4 файла:
Как видно из имен файлов, одна пара файлов предназначена для x86 ОС/приложений, другая – для x64.
К примеру, Firefox на x64 битной ОС является 32-битным приложением, поэтому для его привязки к сетевой карте нужно использовать ForceBindIP.exe. В то время, как для RDP клиента (mstsc.exe) на x64 придется использовать ForceBindIP64.exe
Рассмотрим примеры использования утилиты ForceBind:
Предположим, у нас имеется 2 сетевые карты с IP адресами 10.10.1.10 и 192.168.1.12. Наша задача, настроить систему так, чтобы Firefox всегда работал через второй интерфейс.
Следующая команда запустит Firefox в режиме привязки к сетевой карте 192.168.1.12:
ForceBindIP.exe 192.168.1.12 «c:\Program Files (x86)\Mozilla Firefox\firefox.exe»
Если IP адрес интерфейса динамический, можно осуществить привязку не к IP адресу, а к GUID интерфейса (GUID всех сетевых интерфейсов можно найти в ветке HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces).
Привязка приложения к определенному сетевому интерфейсу
пусковая установка запускает патчер, патчер запустите клиент и т. д. Я могу повлиять только на родителя всех этих процессов в дереве, поэтому фактическая игра не привязана к интерфейсу, который я хочу, что делает все это предприятие бессмысленным.
есть ли более современная альтернатива ForceBindIP для Windows 7? На этом сайте есть много вопросов, похожих на этот, но они в основном старые. Может быть, сейчас есть лучший способ решить эту проблему?
моя текущая идея состоит в том, чтобы сделать следование:
настроить локальный 3proxy сервер, привязанный к нужному интерфейсу.
запустить игру через Proxifier или аналогичное программное обеспечение, настроенное для запуска через этот локальный прокси.
Я не уверен, что это сработает, но даже если это будет, это кажется неоптимальным решением. У вас есть идеи получше?
Edit: моя идея не сработала: (
Edit 2: в основном, то, что я пытаюсь достичь это привязать несколько приложений к обычному интерфейсу, в то время как VPN работает. Причина в том, что мне нужно подключаться через VPN большую часть времени, но некоторые приложения (например, игры) не работают должным образом Таким образом, из-за более высокого пинга и других проблем.
5 ответов
обновление
я обнаружил, что 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 должен как-то передать IP-адрес dll).
для обнаружения запуска целевого приложения, мы можем добавить Debugger ключ в параметры выполнения файл образа в реестре на этот файл:
Kernel32!CreateProcess при вызове без DEBUG_PROCESS или DEBUG_ONLY_THIS_PROCESS флаги создания, проверяет реестр, чтобы увидеть, если IFEO был установлен на исполняемый файл, который его запускает. Если да, то он просто добавляет путь отладчика к имени исполняемого файла, эффективно получать исполняемый файл для запуска в отладчике.
практика
создать папку где-то ( C:\BindIp например) и положить эти три файла в это:
добавить строковое значение к этому ключу:
Grant Users Полные права на этот ключ (скрипт должен будет изменять его при каждом запуске). Она должна выглядеть так:
Привязать приложение к определенному сетевому интерфейсу
Панель запуска запускает патчер, патчер запускает клиент и т. Д. Я могу влиять только на родителя всех этих процессов в дереве, поэтому настоящая игра не привязана к желаемому интерфейсу, что делает все это бессмысленным.
Есть ли более современная альтернатива ForceBindIP для Windows 7? На этом сайте есть много вопросов, похожих на этот, но они в основном старые. Может быть, теперь есть лучший способ решить эту проблему?
Моя текущая идея заключается в следующем:
Настройте локальный сервер 3proxy, связанный с желаемым интерфейсом.
Запустите игру через Proxifier или аналогичное программное обеспечение, настроенное для запуска через этот локальный прокси.
Я не уверен, что это сработает, но даже если это сработает, это кажется неоптимальным решением. Ребята, у вас есть идеи получше?
Изменить: моя идея не сработала 🙁
Редактировать 2: По сути, я пытаюсь добиться привязки нескольких приложений к обычному интерфейсу во время работы VPN. Причина в том, что мне нужно подключаться через VPN большую часть времени, но некоторые приложения (например, игры) не работают должным образом из-за более высокого пинга и других проблем.
Обновить
Вот модифицированные шаги и BindIp.cmd скрипт:
Установите ForceBindIp как обычно
Поместите в BindIp.cmd любое место на вашем диске (например C:\BindIp\BindIp.cmd )
Затем выполните шаги 2-6 снизу.
Вступление
теория
Для использования 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 в исполняемом файле, который он запускает. Если да, тогда он просто добавляет путь отладчика к имени исполняемого файла, фактически выполняя запуск исполняемого файла под отладчиком.
практика
Создайте папку где-нибудь ( C:\BindIp например) и поместите эти три файла в нее:
Добавьте строковое значение к этому ключу:
Предоставьте Users полные разрешения для этого ключа (скрипт должен будет изменять его при каждом запуске). Это должно выглядеть так:
Как привязать приложение к определенному сетевому интерфейсу
Панель запуска запускает патчер, патчер запускает клиент и т. Д. Я могу влиять только на родителя всех этих процессов в дереве, поэтому настоящая игра не привязана к интерфейсу, который я хочу, что делает все это бессмысленным.
Существует ли более современная альтернатива ForceBindIP для Windows 7? На этом сайте есть много вопросов, похожих на этот, но они в основном старые. Может быть, теперь есть лучший способ решить эту проблему?
Моя текущая идея заключается в следующем:
Настройте локальный сервер 3proxy, привязанный к желаемому интерфейсу.
Запустите игру через Proxifier или аналогичное программное обеспечение, настроенное для запуска через этот локальный прокси.
Я не уверен, что это сработает, но даже если это сработает, это кажется неоптимальным решением. У вас, ребята, есть идеи получше?
Изменить: моя идея не сработала 🙁
Редактировать 2: По сути, я пытаюсь добиться привязки нескольких приложений к обычному интерфейсу во время работы VPN. Причина в том, что мне нужно подключаться через VPN большую часть времени, но некоторые приложения (например, игры) не работают должным образом из-за более высокого пинга и других проблем.
Update
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.
Practice
Create folder somewhere ( C:\BindIp for example) and put those three files in it:
Add String Value to this key:
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
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.
I’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 )
Put Install.cmd and Uninstall.cmd to this folder
Install.cmd
Uninstall.cmd
First, you have to create new Secure IP Bind object:
And then you can call it’s methods:
Uninstalling HideMyAss’ Secure IP Bind
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.
Предположим, у вас есть две учетные записи Windows:
При определении сетевых подключений Windows у вас есть возможность разрешить другим пользователям использовать это подключение. Давайте предположим, что вы определили:
В настоящее время у меня есть одна машина Windows, на которой я не могу много испортить, и я никогда не проверял описанную настройку, поэтому я не уверен, верно ли приведенное ниже утверждение.
Я думаю, что приложения:
Как использовать разные сетевые интерфейсы для разных процессов?
У меня есть два сетевых интерфейса на ПК с Linux, и мне нужно вручную установить интерфейс, который будет использовать данный процесс.
Программа (софтфон Twinkle) не имеет подобной опции, поэтому я считаю, что она должна быть установлена внешне.
Как я могу это сделать?
Редактировать: я не пытаюсь привязать процесс сервера к определенному интерфейсу, а хочу, чтобы клиентская программа связывалась с сервером через определенный интерфейс.
и тем самым вы меняете то, что ls делает.
вот как вы это строите:
похожие хаки и инструменты:
ip netns может сделать это.
ПОДРОБНЕЕ:
Почему это лучше, чем привязка ip через LD_PRELOAD? Потому что LD_PRELOAD не контролирует маршрут, используемый процессами. Он будет использовать первый маршрут.
И поскольку он всегда использует один и тот же маршрут, он по умолчанию будет использовать интерфейс, зарегистрированный для маршрута. (А это не то, что нам нужно)
Я не думаю, что можно заставить процесс использовать определенный интерфейс.
Тем не менее, я думаю, что вы можете играть с ipchain / iptables и заставить определенный порт, который прослушивает ваш процесс, получать пакеты только через определенный интерфейс.
Исходя из @olivervbk ответ ниже мой!
Запустите все команды как «root».
. чтобы узнать название сетевого интерфейса, который вы хотите использовать.
. чтобы удалить все, что существует.
Создание правил брандмауэра iptables, которые отбрасывают входящий трафик, направленный на его порты на интерфейсах, на которых вы не хотите, чтобы он был виден, является самым простым делом.
Альтернатива I:
Использование ld_preload для принудительной настройки шлюза интерфейса https://github.com/Intika-Linux-Network/App-Route-Jail
Заставить приложение использовать определенный сетевой интерфейс
Нам нужно выяснить, какой шлюз использует сетевой интерфейс, а затем принудительно установить этот шлюз для нашего приложения, находящегося в тюрьме, и, таким образом, принудительно привязать приложение к определенному сетевому интерфейсу.
На шлюз приложения
Альтернатива II:
Firejail https://firejail.wordpress.com/ может заставить приложение использовать определенную сеть, но совместимость ограничена.
Почему вы хотите, чтобы программа использовала интерфейс, отличный от того, который подключен к серверу, для связи с этим сервером? И если система не использует интерфейс, связанный с сервером, для связи с этим сервером, это проблема системного уровня (таблица маршрутизации), и она не имеет никакого отношения к тому, какой процесс хочет связаться с этим сервером.
Разные серверы в IP-сетях имеют разные IP-адреса. Ядро должно знать, какой интерфейс использовать для достижения определенного IP-адреса на основе таблицы маршрутизации. Если вы пытаетесь установить связь с двумя разными серверами с одинаковым IP-адресом, система будет сбита с толку (поскольку, помимо прочего, она индексирует соединения только по внутреннему адресу). Вы можете сделать это, но это исправление на уровне системы, включающее помещение одного сервера в отдельную логическую сеть, которая подключена к компьютеру только через программный NAT.
Поэтому, если у них разные IP-адреса, используйте маршруты, чтобы выбрать правильный интерфейс. Если у них одинаковый IP-адрес, вам нужно использовать NAT, чтобы они имели разные IP-адреса для системы.