Как выйти в интернет по определенному интернет-соединению, если имеется несколько интернет-соединений?
========================================================================================================

 Приветствую!  

  

**Имеется:** комп (windows/linux на выбор) с несколькими usb входами, в каждом по usb/sim модему. Соответственно, единовременно на компе имеется несколько интернет-соединений.  

  

**Вопрос:** как выйти в интернет программе на C# по определенному интернет-соединению. При этом, другие программы, которые используют другие интернет-соединения не должны лишиться доступа к интернету.  

  

**Несколько виртуалок:** создать несколько виртуалок, в каждую завести по 1 интернет-соединению, и в каждой запускать необходимый софт - **не подходит**. Ибо периодически, необходимо выйти в интернет с другого интернет-соединения...  

  

**В какую сторону копать, что почитать?** 

 В Linux есть возможность оперировать маршрутизацией для маркированного трафика через пакет iproute2.  

Если вы сможете промаркировать трафик от конкретного приложения, например через iptables -j MARK, то потом его можно будет "перемаршрутизировать" на любой исходящий интерфейс. 

 Если вам нужно только подключаться к удалённым хостам из программы (а не принимать входящие соединения), и если программа использует только TCP (а не UDP или другие протоколы), то достаточно соединение (сокет) за-bind-ить к конкретному сетевому интерфейсу или конкретному IP-адресу.  

Этот способ универсален и прост, работает в Windows и Linux, не требует дополнительных настроек, помимо наличия маршрутов по умолчанию для всех интерфейсов (метрика значения не имеет).  

  

То, что вам пишут выше, про маркировку пакетов и назначения конкретных маршрутов — альтернативные, более «правильные» способы, подходящие для более общих случаев, но сложные в настройке. 

 Можете указать конкретный шлюз и трафик пойдет через него.  

Можете указать маршрут на конкретный адрес - через нужный интерфейс.  

Можете использовать файервол, маркировать нужные пакеты и отправлять через нужный интерфейс. 

**ForceBindIP** (<https://soft.mydiv.net/win/download-ForceBindIP.html>)  

Консольная утилита под Windows для принудительного назначения сетевого интерфейса приложению.  

  

**Варианты использования:**  

1. По умолчанию  

Создать ярлык к вашей программе со строкой запуска:  

`ForceBindIP 192.168.1.1 c:\Program.exe`  

Где *192.168.1.1* - локальный IP нужного интерфейса а *c:\Program.exe* - путь к папке с программой.  

Вместо IP можно указать *GUID* сетевого интерфейса: прим. *{E9DE0D15-CA8D-4E41-8F37-79461FCA515C}*  

2. Через код  

Создать функцию на C#, которая выведет список сетевых интерфейсов с их IP адресами. После чего, перезапустить своё приложение через команду запуска (пример в п.1). *ForceBindIP.exe* положить в папку со своей программой.  

3. GUI интерфейс на Java (<https://sourceforge.net/projects/forcebindip-gui/>)  

Открываете GUI и щелкаете мышкой :)  

  

P.S Если вы хотите сделать свои домашние мобильные "носки" под SMM, директ и т.п, при больших объемах советую всё-же воспользоваться известными сервисами (если интересно, пишите в личку).  

  

**Reference:**  

<https://soft.mydiv.net/win/download-ForceBindIP.html>  

[https://translate.google.com/translate?hl=ru&sl=zh...](https://translate.google.com/translate?hl=ru&sl=zh-TW&u=http://nkidtw-program.blogspot.com/2018/01/blog-post.html&prev=search&pto=aue)  

[forum.oszone.net/post-2830221-36.html](http://forum.oszone.net/post-2830221-36.html)  

<https://sourceforge.net/projects/forcebindip-gui/>  

[https://qastack.ru/superuser/410483/can-i-route-pr...](https://qastack.ru/superuser/410483/can-i-route-programs-to-two-internet-connections-simultaneously-in-windows-7-duplicate)  

<https://forum.ixbt.com/topic.cgi?id=14:30017:926#926> 

 Как вариант - взять докер и с его помощью дать доступ каждому приложению к определённому интерфейсу.  

Но у меня есть ощущение, что можно как-то иначе сделать. Так что я подпишусь на вопрос.