Как использовать различные сетевые интерфейсы для разных процессов?
У меня есть два сетевых интерфейса на Linux-ПК, и мне нужно вручную установить интерфейс, который будет использовать данный процесс.
Программа (программный телефон Twinkle) не имеет аналогичного варианта, поэтому я считаю, что она должна быть установлена снаружи.
Как мне это сделать?
- Как извлечь текст с помощью OCR из PDF в Linux?
- Приоритет сети Ubuntu
- Я только что получил взломан?
- Создайте загрузочный USB-диск для установки Windows XP из Linux
- Почему вино «не эмулятор»?
Изменить: я не пытаюсь привязать серверный процесс к определенному интерфейсу, а скорее, чтобы клиентская программа обращалась к серверу с использованием определенного интерфейса.
- Какие торрент-приложения работают без головы (только из командной строки)?
- Неизвестный кодер 'libmp3lame'
- Как я могу объединить буфер обмена gnome и выбор X?
- Как защитить пароль .tgz-файла с помощью tar в Unix?
- VM на хосте ESXi - Как сделать доступным извне?
- Какую файловую систему использовать при использовании как Windows, так и Linux?
- Как смонтировать сжатый ISO-образ?
- Что означает звездочка после имени файла при вводе `ls -l`?
Вы можете заменить код во время выполнения с помощью 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-адреса в системе.