У меня есть два сетевых интерфейса на ПК с Linux, и мне нужно вручную установить интерфейс, который будет использовать данный процесс.
Программа (софтфон Twinkle) не имеет подобной опции, поэтому я считаю, что она должна быть установлена внешне.
Как я могу это сделать?
Редактировать: я не пытаюсь привязать процесс сервера к определенному интерфейсу, а хочу, чтобы клиентская программа связывалась с сервером через определенный интерфейс.
linux
networking
Андреа Спадаччини
источник
источник
Ответы:
Вы можете заменить код во время выполнения с помощью LD_PRELOAD (@windows вы можете использовать аналогичную технику, называемую обходными путями , довольно необычно). для этого нужно сообщить динамическому компоновщику, что сначала нужно загрузить все библиотеки в процесс, который вы хотите запустить, а затем добавить еще один к нему. вы обычно используете это так:
и тем самым вы меняете то, что
ls
делает.для вашей проблемы я бы попробовал http://www.ryde.net/code/bind.c.txt , который вы можете использовать как:
вот как вы это строите:
более длинная инструкция http://daniel-lange.com/archives/53-Binding-applications-to-a-specific-IP.html
похожие хаки и инструменты:
источник
force_bind
Проект Каталин М. Boie поддерживает ipv6ip netns может сделать это.
TL; DR: создайте сетевые пространства имен, свяжите с ними интерфейсы и запустите «ip netns exec NAME cmd ...»
Просто проверьте, поддерживает ли ваш дистрибутив ip netns ... (Backtrack 5r3 не поддерживает, а Kali поддерживает;))
ПОДРОБНЕЕ:
Почему это лучше, чем привязка ip через LD_PRELOAD? Потому что LD_PRELOAD не контролирует маршрут, используемый процессами. Он будет использовать первый маршрут.
И поскольку он всегда использует один и тот же маршрут, он по умолчанию будет использовать интерфейс, зарегистрированный для маршрута. (А это не то, что нам нужно)
источник
ip netns exec myNamespace firefox
sudo ip netns exec myNamespace su -u someUser -c firefox
Я не думаю, что можно заставить процесс использовать определенный интерфейс.
Тем не менее, я думаю, что вы можете играть с ipchain / iptables и заставить определенный порт, который прослушивает ваш процесс, получать пакеты только через определенный интерфейс.
Полезное руководство: http://tldp.org/HOWTO/IPCHAINS-HOWTO.html
источник
Исходя из @olivervbk ответ ниже мой!
Запустите все команды как «root».
Используйте команду ...
... чтобы узнать название сетевого интерфейса, который вы хотите использовать.
Запустите команды ниже как шаблон ...
ПРИМЕЧАНИЕ I: Флаги «-b -u» в команде «sudo» позволяют приложению запускаться с использованием вашего пользователя (не «root») и в фоновом режиме освобождают терминал.
2> /dev/null 1> /dev/null &
Фрагмент кода, чтобы предотвратить выходы из «[APP_NAME]» печатается на терминале.ПРИМЕЧАНИЕ II: значения ip "10.1.1.10" и "10.1.1.1" являются произвольными.
ПРИМЕЧАНИЕ III: Чтобы работать на меня, я должен был запустить
dhcpcd [INTERFACE_NAME]
команду.Чтобы удалить пространство имен, используйте ...
... или же...
... чтобы удалить все, что существует.
источник
Обычно, если программа не имеет возможности настройки интерфейса прослушивания, она прослушивает ВСЕ интерфейсы. (Вы можете проверить это с помощью
lsof -i
).Создание правил брандмауэра iptables, которые отбрасывают входящий трафик, направленный на его порты на интерфейсах, на которых вы не хотите, чтобы он был виден, является самым простым делом.
источник
Альтернатива I:
Использование ld_preload для принудительной настройки шлюза интерфейса https://github.com/Intika-Linux-Network/App-Route-Jail
Заставить приложение использовать определенный сетевой интерфейс
Нам нужно выяснить, какой шлюз использует сетевой интерфейс, а затем принудительно установить этот шлюз для нашего приложения, находящегося в тюрьме, и, таким образом, принудительно привязать приложение к определенному сетевому интерфейсу.
На шлюз приложения
192.168.1.1
используется в качестве принудительного шлюза, это правило маршрута не повлияет на другие приложения, например, эту манипуляцию нужно выполнять только один раз при загрузке системы, если вы хотите используйте это решение ежедневноАльтернатива II:
Firejail https://firejail.wordpress.com/ может заставить приложение использовать определенную сеть, но совместимость ограничена.
источник
Почему вы хотите, чтобы программа использовала интерфейс, отличный от того, который подключен к серверу, для связи с этим сервером? И если система не использует интерфейс, связанный с сервером, для связи с этим сервером, это проблема системного уровня (таблица маршрутизации), и она не имеет никакого отношения к тому, какой процесс хочет связаться с этим сервером.
Разные серверы в IP-сетях имеют разные IP-адреса. Ядро должно знать, какой интерфейс использовать для достижения определенного IP-адреса на основе таблицы маршрутизации. Если вы пытаетесь установить связь с двумя разными серверами с одинаковым IP-адресом, система будет сбита с толку (поскольку, помимо прочего, она индексирует соединения только по внутреннему адресу). Вы можете сделать это, но это исправление на уровне системы, включающее помещение одного сервера в отдельную логическую сеть, которая подключена к компьютеру только через программный NAT.
Поэтому, если у них разные IP-адреса, используйте маршруты, чтобы выбрать правильный интерфейс. Если у них одинаковый IP-адрес, вам нужно использовать NAT, чтобы они имели разные IP-адреса для системы.
источник