Как использовать различные сетевые интерфейсы для разных процессов?

У меня есть два сетевых интерфейса на Linux-ПК, и мне нужно вручную установить интерфейс, который будет использовать данный процесс.

Программа (программный телефон Twinkle) не имеет аналогичного варианта, поэтому я считаю, что она должна быть установлена ​​снаружи.

Как мне это сделать?

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

Вы можете заменить код во время выполнения с помощью LD_PRELOAD (@windows вы можете использовать подобный метод, называемый обходной , довольно фантастический). Это означает, что динамический компоновщик должен сначала загрузить все библиотеки в процесс, который вы хотите запустить, а затем добавить еще больше. Вы обычно используете его так:

% LD_PRELOAD=./mylib.so ls 

И тем ls вы меняете то, что делает ls .

Для вашей проблемы я бы попробовал http://www.ryde.net/code/bind.c.txt , который вы можете использовать как:

 % BIND_ADDR="ip_of_ethX" LD_PRELOAD=./bind.so twinkle 

Вот как вы его построите:

 % wget http://www.ryde.net/code/bind.c.txt -O bind.c % gcc -nostartfiles -fpic -shared bind.c -o bind.so -ldl -D_GNU_SOURCE 

Более длинное руководство – http://daniel-lange.com/archives/53-Binding-applications-to-a-specific-IP.html

Похожие хаки и инструменты:

  • bindhack
  • liboverride
  • fixsrcip
  • netjail

Ip netns может это сделать.

TL; DR: создать сетевые пространства имен, связать с ними интерфейсы, а затем запустить «ip netns exec NAME cmd …»

Просто проверьте, поддерживает ли ваш дистрибутив ip netns … (Backtrack 5r3 не делает, тогда как Kali делает;))

В БОЛЕЕ ДЕТАЛЯХ:

 #create netns ip netns add myNamespace #link iface to netns ip link set eth0 netns myNamespace #set ip address in namespace ip netns exec myNamespace ifconfig eth0 192.168.0.10/24 up #set loopback (may be needed by process run in this namespace) ip netns exec myNamespace ifconfig lo 127.0.0.1/8 up #set route in namespace ip netns exec myNamespace route add default gw 192.168.0.1 #force firefox to run inside namespace (using eth0 as outgoing interface and the route) ip netns exec myNamespace firefox 

Почему это лучше, чем привязка ip через LD_PRELOAD? Поскольку LD_PRELOAD не контролирует маршрут, который использует процесс. Он будет использовать первый маршрут.

И поскольку он всегда использует один и тот же маршрут, он будет по умолчанию интерфейсом, зарегистрированным на маршруте (это не то, что мы хотим)

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

Тем не менее, я думаю, что вы можете играть с ipchain / iptables и заставлять какой-то порт, который прослушивает ваш процесс, будут получать пакеты только через определенный интерфейс.

Полезный HOWTO: http://tldp.org/HOWTO/IPCHAINS-HOWTO.html

Обычно, если у программы нет опции для настройки интерфейса прослушивания, она прослушивает ВСЕ интерфейсы. (Вы можете проверить это с помощью lsof -i ).

Создание правил брандмауэра iptables, которые отбрасывают входящий трафик, указывающий на его порты на интерфейсах, которые вы не хотите видеть, является самой простой задачей.

Основываясь на @olivervbk, ответ ниже, мой!

Запустите все команды как «root».

Используйте команду …

 ip a 

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

Выполните команды ниже в качестве шаблона …

 ip netns add [INTERFACE_NAME]_ns ip link set dev [INTERFACE_NAME] netns [INTERFACE_NAME]_ns ip netns exec [INTERFACE_NAME]_ns ifconfig [INTERFACE_NAME] 10.1.1.10/24 up ip netns exec [INTERFACE_NAME]_ns ifconfig lo 127.0.0.1/8 up ip netns exec [INTERFACE_NAME]_ns route add default gw 10.1.1.1 ip netns exec [INTERFACE_NAME]_ns dhcpcd [INTERFACE_NAME] ip netns exec [INTERFACE_NAME]_ns sudo -b -u [YOUR_USER] [APP_NAME] 2> /dev/null 1> /dev/null & 
  • [INTERFACE_NAME] – Замените имя выбранного сетевого интерфейса.
  • [YOUR_USER] – Замените свое имя пользователя.
  • [APP_NAME] – имя приложения, которое будет запущено в пространстве имен "[INTERFACE_NAME] _ns". Например: «firefox».

ПРИМЕЧАНИЕ I: Флаги «-b» в команде «sudo» позволяют приложению запускаться с использованием вашего пользователя (а не «root») и на фоне освобождения терминала. Параметр 2> /dev/null 1> /dev/null & snippet предназначен для предотвращения вывода выходов из «[APP_NAME]» на терминале.
ПРИМЕЧАНИЕ II: Значения ip "10.1.1.10" и "10.1.1.1" являются произвольными.
ПРИМЕЧАНИЕ III: Чтобы работать для меня, мне пришлось запустить команду dhcpcd [INTERFACE_NAME] .

Чтобы удалить пространство имен, используйте …

 ip netns del [INTERFACE_NAME]_ns 

… или…

 ip -all netns delete 

… удалить любое существующее.

Почему вы хотите, чтобы программа использовала интерфейс, отличный от подключенного к серверу, для общения с этим сервером? И если система не использует интерфейс, подключенный к серверу, чтобы разговаривать с этим сервером, это проблема на системном уровне (таблица маршрутизации) и не имеет никакого отношения к тому, с каким процессом происходит разговор с этим сервером.

Различные серверы в IP-сетях имеют разные IP-адреса. Ядро должно знать, какой интерфейс использовать для достижения определенного IP-адреса на основе таблицы маршрутизации. Если вы пытаетесь поговорить с двумя разными серверами, имеющими один и тот же IP-адрес, система запутается (потому что, помимо прочего, она только индексирует соединения внутри по адресу назначения). Вы можете сделать эту работу, но это исправление на системном уровне, связанное с включением одного сервера в отдельную логическую сеть, которая подключается только к машине через программное обеспечение NAT.

Поэтому, если у них разные IP-адреса, используйте маршруты, чтобы выбрать правильный интерфейс. Если у них одинаковый IP-адрес, вам необходимо использовать NAT, чтобы они отображали разные IP-адреса в системе.

  • Как я могу получить пропускную способность интерфейса в любой момент времени из командной строки Linux?
  • Нет GRUB после повторной установки Windows
  • Как загрузить все изображения с веб-сайта (а не веб-страницы) с помощью терминала?
  • Показывать только текущее имя каталога (не полный путь) в приглашении bash
  • Как я могу получить комментарий текущего ssh-ключа authorized_keys?
  • Tmux без учета файла конфигурации
  • Putty 0.61: почему я вижу сообщение «Access Denied» после ввода моего идентификатора входа?
  • Требовать пароли пользователей на linux только в будние дни
  • Смонтируйте диск HFSPlus с разрешениями на чтение и запись в Linux
  • Debian: обновление списков пакетов с помощью apt-offline, --simulate непонятно для apt-get update
  • Есть ли аналог Bash's Ctrl + Z & fg в Powershell?
  • Interesting Posts
    Давайте будем гением компьютера.