7

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

Пример: сетевые интерфейсы: eth0, eth1

Приложение A использовать Dummy0 Приложение B использовать Dummy1

Возможно ли связать приложение с таким интерфейсом?

Вариант использования:1 машина с 2 подключениями к интернету; eth0 -> подключение к интернету 0 eth1 -> подключение к интернету 1

Приложение использует предопределенный интерфейс Firefox -> eth0 -> интернет-соединение 0 Chrome -> eth1 -> интернет-соединение 1

ОС: CentOS 5.9 32bit

5 ответов5

4

Выбор конкретного адаптера для приложения является настройкой приложения. Вы должны определить, как это делается в вашем конкретном приложении. Это не может быть сделано на системном уровне.

Windows

Вы можете настроить приоритет адаптеров на глобальном системном уровне. Используйте стрелки вверх и вниз на странице расширенных свойств сетевых подключений.

http://levynewsnetwork.wordpress.com/2011/12/01/windows-7-default-internet-connection-choice/

Linux

В Linux процесс не так прост. Вы должны сказать Linux, что один адаптер находится дальше, чем другой, используя metric .

Чтобы расставить приоритеты для адаптеров в Linux, вам нужно использовать команду route , чтобы добавить маршрут с желаемой метрикой и удалить старую запись. Например:

sudo route add -net default gw 10.10.0.1 netmask 0.0.0.0 dev wlan0 metric 1
sudo route del -net default gw 10.10.0.1 netmask 0.0.0.0 dev wlan0 metric 0

Для обеих ОС один и тот же порядок будет использоваться для каждого приложения, когда это будет сделано.

2

Есть простое решение - Даниэль Райд написал для этой цели библиотеку LD_PRELOAD « shim » (bind.c), которая изменяет поведение привязки. Проверьте этот учебник:

https://www.x4b.net/kb/BindProcessToIPonLinux

Учитывая , есть эффективен адрес привязки по умолчанию для приложений (смотрите таблицу маршрутизации), это по - моему великолепно странно , что , как правило , не существует стандартный способ (как в "распределении коды пакета") , чтобы переопределить этот интерфейс по умолчанию, да; на системном уровне, для определенного набора приложений.

Некоторые программы имеют параметры командной строки для прослушивания интерфейса по вашему выбору, что все хорошо и хорошо.

Мой маршрут по умолчанию идет через VPN-прокси (конечно, довольно распространенный сценарий). Хорошее значение по умолчанию для исходящих соединений, этот туннель не очень хорошо поддерживает входящие соединения из Интернета. Поэтому мне нужно заставить серверно-ориентированные программы A, B и C связываться с каким-либо другим IP-адресом (основным адресом, предоставленным провайдером). И клиент-ориентированная программа D, я хочу использовать свой публичный интерфейс по разным причинам.

Приведенная выше библиотека работает хорошо, для этой цели!

Решение:

  1. Создать нового пользователя
  2. Заголовок-mangle ВСЕ пакеты этого конкретного пользователя
  3. Запускать программы от имени этого пользователя ТОЛЬКО для "эффективного связывания" с желаемым интерфейсом, по сравнению с этим, кажется уродливым хаком.

В качестве альтернативы:

  1. Создать нового пользователя SuperFluous
  2. Сделать SuperFluous использовать другую таблицу маршрутизации
  3. Запустите A, B, C как пользователь SuperFluous; Все еще недостаточно хорош! Я хочу запускать "мои" серверы как "я" (у меня может даже не быть привилегий для создания новых пользователей и политик маршрутизации).

LISTEN_TO = $ THIS_INTERFACE Command; # <- Это должно быть так просто.

1

На самом деле предмет вопроса немного неточный. Привязка приложения к интерфейсу применяется к приложению, выполняющему роль сервера.

В этом случае правильный термин "Маршрутизация трафика для конкретного приложения определенным образом". В Linux это можно сделать с помощью политики маршрутизации.

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

http://blog.sebastien.raveau.name/2009/04/per-process-routing.html имеет полное описание.

0

В то время как приложения могут связываться с определенными IP-адресами, это зависит от конкретного приложения. Для вашего конкретного примера и Chrome, и Firefox поддерживают HTTP прокси.

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

acl browser1 localip 127.0.0.2
acl browser2 localip 127.0.0.3
tcp_outgoing_address 192.168.1.99 browser1
tcp_outgoing_address 197.6.0.1 browser2

Теперь Firefox будет настроен для подключения к прокси на 127.0.0.2, который будет использовать 192.168.1.99 в качестве сетевого адаптера для выполнения исходящих TCP-запросов.

Chrome будет настроен на использование 127.0.0.3 в качестве прокси, который будет использовать 197.6.0.1 в качестве исходящего адреса.

0

Как мы уже говорили, это зависит от приложения. Если ваше приложение не поддерживает привязку к данному интерфейсу /IP, вы можете использовать iptables (Linux) или ipfilter (* BSD).

В Ubuntu-Wiki есть довольно приятное введение в iptables:https://help.ubuntu.com/community/IptablesHowTo

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .