Заставить приложение использовать определенный сетевой интерфейс

48

Я использую несколько сетевых интерфейсов (LAN и Wireless), и я заметил, что есть способ изменить порядок предпочтительных интерфейсов. Как я могу использовать проводную сеть, чтобы работать, проверять электронную почту и т. Д. (Безопасно), и использовать беспроводную VLAN для доступа к другим вещам (в противном случае блокируется портами, а иногда и веб-зрением)?

Ками
источник

Ответы:

22

Хитрость заключается в корректировке таблиц маршрутизации (которая не зависит от порта назначения или исходного приложения, но зависит от хоста назначения). Это предполагает, что вы работаете в Linux или OS X (как показывают теги).

Скажем, ваш шлюз по умолчанию - 1.2.3.4, и у вас есть vpn, который может маршрутизировать трафик на 6.7.8.9. Если вы хотите, чтобы ваш почтовый трафик проходил через 6.7.8.9, просто сделайте

sudo route add mail.myserver.com 6.7.8.9

В некоторых версиях маршрута может потребоваться ключевое слово "gw" между адресом и следующим прыжком. Если вы хотите создать весь сетевой маршрут для следующего перехода, просто добавьте маску сети в нотации CIDR для пункта назначения, например

sudo route add 192.168.0.0/24 6.7.8.9

Если вы хотите просмотреть существующую таблицу маршрутизации, используйте

netstat -nrl
or
ip route list

Если вы работаете в Windows, «сетевой маршрут» поможет вам в этом, но синтаксис совершенно другой.

Тим Хэтч
источник
17
Это не совсем ответ, не так ли? Вопрос в том, как заставить приложение, а не веб-сайт. Например, что я хотел, чтобы Safari использовал VPN (ppp0), а Firefox - en0 независимо от того, к какому сайту они обращаются? Вот в чем вопрос.
1913 года
2
@gman: Ничто в этом ответе не относится только к веб-сайтам.
Легкость гонки с Моникой
3
ОП хочет выбрать сетевой интерфейс на основе прикладной программы. Этот ответ показывает, как выбрать на основе хоста назначения.
Беннет МакЭлви
Я не собираюсь опровергать это (это хороший совет для другого вопроса), но я, конечно, не собираюсь опровергать и это (по причинам, указанным @gman и @ bennett-mcelwee).
ratskin
Как указано выше, это не дает ответа на вопрос о том, как заблокировать конкретное приложение для конкретного сетевого адаптера.
catchdave
6

Если вы просто хотите, чтобы одновременно были активны две сетевые карты, вы можете установить порядок обслуживания в Системных настройках / Сеть, выбрав механизм под списком сетевых устройств. Перетащите порядок, в котором вы хотите их.

Например, у меня всегда активны Ether и WiFi на моем MBP с установленным Ether выше Wi-Fi. Поскольку я использую Ether на работе, я настроил этот сетевой адаптер с настройками прокси-сервера и Wi-Fi без него. Когда я иду домой, нет необходимости настраивать какие-либо настройки. Вы также можете сделать это с помощью терминала /usr/bin/networksetup -ordernetworkservices.

Но для того, чтобы и активное приложение и приложение использовали нестандартный режим, мне повезло с немного более легким вращением по совету @ Andor. Если я хочу, чтобы приложение не использовало Ether в моем случае, я устанавливаю настройки прокси для приложения на IP-адрес моего адаптера Wi-Fi. Он будет использовать этот интерфейс для выхода и таким образом обходить прокси-серверы и серверы мониторинга компании. Так что, если Ether имеет адрес 1.2.3.4 и идет до Wi-Fi (5.6.7.8) в сервисном заказе, у меня есть прокси приложения до 5.6.7.8.

SaxDaddy
источник
5

Для Mac есть простое решение, которое я использую. На самом деле это реализация решения @ Andor. Установите прокси и настройте приложения для его использования:

  1. Я установил SquidMan

  2. В конфигурации добавьте следующую строку. Вам необходимо указать IP-адрес, который вы будете использовать для своих личных приложений вместо x.x.x.x:

    tcp_outgoing_address x.x.x.x
    
  3. Запустите SquidMan и настройте ваше приложение на использование его в качестве прокси.

Я потратил час, чтобы найти эту информацию на разных страницах, поэтому надеюсь, что это поможет другим сделать это быстрее.

matrik
источник
Должно работать так же на Windows и, кажется, единственное элегантное решение!
TJJ
1

Вам, вероятно, понадобится использовать низкоуровневые функции управления IO (ioctl). Особенно:

ioctl( socket, SIOCGIFADDR, ... ); // Get network interface address

а также

ioctl( socket, SIOCSIFADDR, ... ); // Set network interface address

Смотрите эту справочную страницу для более подробной информации.


источник
1

Проблема в том, что у вас будет несколько шлюзов к вашему сетевому соединению, и это немного сложно для управления ...

У некоторых утилит unix и linux, связанных с сервером или сетью, обычно есть флаг под названием «interface», где вы можете указать, какой интерфейс вы хотите использовать, например, в tcpdump:

tcpdump -i eth0

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

В любом случае, я могу рассказать вам об этом ... Мой обычный способ решения этих проблем - использование прокси и наличие только одного шлюза. Практически любое программное обеспечение, которое использует Интернет в настоящее время, имеет опции для настройки прокси, так что вы можете сделать это любым из следующих способов:

1.- Настройка прокси на «незащищенной» (я имею в виду, где политики не применяются) части вашей сети и направление вашего программного обеспечения на этот прокси.

2. Установите SSH-сервер в другом «незащищенном» месте, скажем, у вас дома или на выделенном сервере в Интернете, и откройте соединение с помощью специальной функции SSH, которая создает прокси-сервер socks:

ssh -D 1234 user@host

Это создаст на вашем компьютере прокси-сервер socks на порту «1234», который будет подключаться к вашему «хосту», используя вашего «пользователя», и выходить в Интернет через соединение, которое имеет ваш «хост» ... Затем, в вашем локальном программном обеспечении вам нужно только открыть инструменты настройки прокси и указать localhost: 1234.

Хорошие трюки, чтобы избежать корпоративных интернет-политик: P

: D

Андор
источник
1

Я запускаю свои бизнес-приложения на виртуальной машине. Я использовал приведенные выше инструкции, чтобы установить WiFi в качестве предпочтительного подключения, а затем настроил виртуальную машину для использования порта Ethernet в качестве адаптера «Bridged».

Все, что работает внутри виртуальной машины, теперь жестко связано с портом Ethernet. Wi-Fi - мое предпочтительное соединение для всех других приложений (за пределами виртуальной машины), если у меня подключено соединение WiFi.

Я считаю, что существуют утилиты, которые можно использовать для принудительного связывания приложения с конкретным портом Ethernet, но не исследовали его для MacOS.

Упомянутый ранее метод маршрутизации является несколько сложным для «непрофессионала», но также выглядит хорошим жизнеспособным подходом, особенно если вы постоянно получаете один и тот же IP-адрес в ваших соединениях.

Богатый
источник
0

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

http://www.howtogeek.com/117890/how-to-force-an-application-to-use-a-specific-network-card/

В приведенном выше руководстве используется утилита ForceBindIp, которая рекламируется для работы, Windows NT/2000/XP/2003 но у меня не возникло проблем с тем, чтобы она работала в Windows 7 - 64-битной среде.

Также проблемы с ForceBindIP в Windows 7 (x64)

Ашутош Джиндал
источник