Как решить "setsockopt (3, SOL_SOCKET, SO_MARK, [10], 4) = -1 EPERM" Операция запрещена ни для одного пользователя root - PullRequest
1 голос
/ 08 мая 2019

У меня есть два сетевых интерфейса (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, чтобы получить достаточно разрешений для запуска команды на правильном интерфейсе. Чего мне не хватает в архиве моих целей?

1 Ответ

3 голосов
/ 08 мая 2019

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

Вы можете попробовать ретро-решение, объясненное здесь , которое переопределяет bind () и connect () вместо socket ().

Но более современным решением будет создание отдельного сетевого пространства имен, а затем запуск приложений в их собственном пространстве имен. Google ip netns для примеров. Для создания и настройки сетевого пространства имен по-прежнему требуется root, но эти права могут быть отброшены перед запуском приложения. Скорее всего, для этого есть инструменты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...