Привязать программу unix к определенному сетевому интерфейсу

Чтобы получить результаты в файл, нужно просто передать вывод команды в файл.

find /volume1/video/ -iname "sample" > output

Теперь я предполагаю, что вам нужно удалить все файлы, которые мы получили в выходном файле. Для этого вы можете прочитать все строки файла и использовать rm -rf внутри цикла while.

while IFS= read -r line; do
rm -rf "$line"
done < output.txt
42
13.04.2017, 15:36
2 ответа

Решение I :Предварительная загрузка определенной библиотеки

  • Приложение -Маршрут -Тюрьма:использование ld _предварительная загрузка для принудительного подключения шлюза интерфейса (отличная идея, но требуются возможности root или меток )использование подробно описано в примечаниях ниже

  • Proxybound:используйте ld _preload, чтобы принудительно использовать прокси для определенного приложения (это использует прокси вместо интерфейса)

  • Force -Bind:имеет много функций, но утечка привязки (ненадежна)

  • Привязка -Интерфейс -IP:слишком простые и неплотные соединения (ненадежны)

  • Связывание -IP:слишком простое и негерметичное соединение (ненадежно)

Решение II :Пользовательское пространство Linux

  • Классическое пользовательское пространство Linux ip -netns:отличное решение, но требуется root, а интерфейс может существовать только в одном пользовательском пространстве

  • Firejail:Firejail может заставить приложение использовать определенную сеть, но совместимость ограничена (например, он не совместим с интерфейсами tun ). firejail не требует rootfirejail --dns=8.8.8.8 --noprofile --net=eth0 --ip=192.168.1.1 app-command

  • Firejail с netns:Firejail может заставить приложение использовать определенное пользовательское пространство, которое было создано отдельно,это позволяет называть пространства без корняfirejail --dns=8.8.8.8 --noprofile --netns=nameOfyourNS app-command

  • Firejail с masquerade и bridge:Firejail может заставить приложение использовать специальный интерфейс с iptables masquerade , это замечательно и не требует root , но для этого требуется ip _вперед и может повлиять на безопасностьfirejail --net=br0 firefox

Решение III :Linux iptables

Для этой цели можно использовать Iptables , но для этого требуется переадресация ip _и может повлиять на безопасность, если он неправильно настроен, пример 1 , пример 2 , пример 3 , пример 4

Решения (I, II и III )примечания:

Проволочная защита

Если вы используете VPN (, особенно wireguard ), и хотите применить это решение к интерфейсу wireguard(wireguard с пользовательским пространством ), вы можете следовать инструкциям по ссылке, чтобы создать пользовательское пространство, содержащее интерфейс wg (и, таким образом, ограниченный интерфейсом vpn ), также его можно комбинировать с firejail --netns=container, чтобы иметь возможность использовать пространство пользователя без root.

Как найти шлюз интерфейса

Существует множество решений для поиска шлюза, вот несколько команд, позволяющих найти используемый шлюз.

$ route
$ route -n
$ ip rule list
$ ip route show
$ netstat -rn
$ cat /etc/network/interfaces
$ cat /etc/sysconfig/network-scripts/ifcfg-eth0
$ traceroute www.google.com
$ ip route show 0.0.0.0/0 dev eth0

Как пользоваться приложением -Маршрут -Тюрьма

  • Сборка приложения -Маршрут -Тюрьма
git clone https://github.com/Intika-Linux-Network/App-Route-Jail.git
cd Approute-Root-Jail
chmod 755 make.sh
./make.sh
  • Добавить маршрут для будущих помеченных пакетов (для приложения в тюрьме )в этом примере 192.168.1.1используется в качестве принудительного шлюза, это правило маршрута не повлияет на другие приложения,эту манипуляцию необходимо выполнить только один раз при загрузке системы, например, если вы хотите использовать это решение ежедневно
ip rule add fwmark 10 table 100
ip route add default via 192.168.1.1 table 100
  • Запустите приложение, которое вы хотите поместить в тюрьму
MARK=10 LD_PRELOAD=./mark.so firefox
  • Тестирование wan IP-адреса
MARK=10 LD_PRELOAD=./mark.so wget -qO- ifconfig.me
11
27.01.2020, 19:35

Есть еще одно решение с предварительной загрузкой.

Привязка к интерфейсу

BindToInterfaceзагружает библиотеку, которая заставляет программу работать с определенным интерфейсом. Остальные 3 варианта привязки в ответ интика принудительно привязывают к определенному ip адресу. Итак, вместо, например. 0.0.0.0, что означает, что все интерфейсы, которые вы можете привязать к 192.168.178.68, чтобы привязать прослушивание только на этом интерфейсе. Но при подключении по-прежнему будет использоваться таблица маршрутизации по умолчанию и другие интерфейсы.

BindToInterface используется как BIND_INTERFACE=eth1 LD_PRELOAD=./bindToInterface.so <your command>. Вы также можете перезаписать DNS-сервер -, что весьма полезно, когда ваш DNS-сервер -по умолчанию недоступен через связанный интерфейс. Это ускоряет подключение. Вы можете управлять этим через переменную окруженияDNS_OVERRIDE_IP=8.8.8.8

Если ваша программа привязана к eth1, она не может получить доступ к локальному хосту. Если он должен достичь этого или других IP-адресов, вы можете исключить их через BIND_EXCLUDE=127.0.0.1.

Таким образом, команда будет выглядеть так: BIND_INTERFACE=eth1 DNS_OVERRIDE_IP=8.8.8.8 BIND_EXCLUDE=127.0.0.1 LD_PRELOAD=./bindToInterface.so <your command>.

Есть еще несколько параметров для Привязки к интерфейсу, описанных на странице Github .



В настоящее время (Март 2020 г. )Решение firejail невозможно с Wi-Fi, см.https://github.com/netblue30/firejail/issues/3000

2
21.03.2020, 14:34

Теги

Похожие вопросы