У меня есть два сетевых интерфейса (ethernet и wlan). Теперь я нашел небольшой скрипт на github (https://github.com/Intika-Linux-Firewall/App-Route-Jail), который, кажется, позволяет мне маршрутизировать определенные приложения через шлюз none по умолчанию, чтобы немного сбалансировать трафик.
Сценарий использует следующий вызов:
setsockopt(sd, SOL_SOCKET, SO_MARK, &mark, sizeof(mark));
Как я узнал через strace, я получил: '-1 EPERM Permission denied' (как показано на http://man7.org/linux/man-pages/man7/capabilities.7.html этой команде нужны права cap_net_admin)
Инструмент работает, когда я использую "sudo" перед командой, сокет создается с шлюзом none по умолчанию и работает как задумано (например, wget файл)
Пример:
MARK=10 LD_PRELOAD=./mark.so wget -qO- ifconfig.me
использует шлюз по умолчанию (так что не то, что я хотел)
sudo MARK=10 LD_PRELOAD=./mark.so wget -qO- ifconfig.me
возвращает IP шлюза none по умолчанию (что я хочу, но без использования sudo)
Некоторые вещи, которые я нашел в интернете и попробовал:
- Настройка возможностей файла (setcap cap_net_admin + eip) (по-прежнему требуется как-то root)
- Использование бита SUID (chmod u + s) (без изменений)
Я ожидаю, что команда будет выполняться без привилегий root, поэтому каждое приложение может использовать шлюз none по умолчанию, но в настоящее время мне нужно использовать sudo
, чтобы получить достаточно разрешений для запуска команды на правильном интерфейсе.
Чего мне не хватает в архиве моих целей?