Отправка данных в интерфейс Linux без использования sudo

275
user1738833

Я пытаюсь настроить модульные тесты для моих сетевых сценариев. Поскольку модульные тесты выполняются пользователем без полномочий root (обычно «jenkins»), я хочу иметь возможность настроить сетевой интерфейс, который может использоваться jenkins только для проверки пакетов, отправляемых из моей сети скрипты. Программа, которую я тестирую, использует сетевой интерфейс в «беспорядочном» режиме и, в конечном счете, запускается от имени пользователя root в качестве службы Linux. Тем не менее, я хочу, чтобы функциональный модуль тестировался, не требуя root-входа или интерактивного ввода - пользователь jenkins не является интерактивным пользователем в системе.

Я могу настроить интерфейс подключения (CentOS 7.x) следующим образом:

sudo ip tuntap add tap0 mode tap user jenkins sudo ifconfig tap0 promisc up 

Это вызывает интерфейс, который я вижу, используя ifconfig, но это не «РАБОТАЕТ».

Я могу отправить данные в него, запустив мою программу с помощью sudo XXXX, так что моя программа работает, как ожидалось. Однако, если я запускаю программу через учетную запись jenkins, пакеты не проходят - я могу временно переключить учетную запись пользователя jenkins на «интерактивную», чтобы попробовать это. Я использую Wireshark для просмотра пропускной способности на этом интерфейсе.

Я пробовал это, используя мою собственную учетную запись пользователя и другие учетные записи, но работает только учетная запись root.

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

Я мог бы разработать систему с использованием разрешений sudoи / или suid ( chmod 4755 XXX), которые позволили бы запускать модульные тесты с привилегиями суперпользователя, но мне кажется, что я должен иметь возможность запускать автоматические тесты без необходимости проходить через этот несколько извилистый процесс.

Кто-нибудь знает, как я могу использовать интерфейс крана из учетной записи пользователя?

Примечание: В конце концов, моя программа использует libpcap«S, pcap_injectчтобы ввести пакет в интерфейс.

Кроме того, я могу внедрить пакеты как пользователь без полномочий root в мой реальный сетевой интерфейс, и это работает, но несколько опасно пропускать мои пакеты (которые могут быть ошибочными) в реальную сеть. Кажется неуместным, что пользователь может использовать реальный интерфейс, но не использовать интерфейс «касания» для тестирования.

Если это принципиально невозможно, то есть ли у кого-нибудь предложение, как выполнить модульное тестирование (на одной машине) моего сетевого пакета инъекцией другим способом?

0
Я не совсем понимаю, что вы пытаетесь проверить, но я предлагаю сетевые пространства имен вместо интерфейса крана (который на самом деле является одной из сторон прикладной программы, которая обрабатывает пакеты - создание их с помощью `ip` имеет смысл только для сохранения название). Создание сетевых пространств имен потребует привилегий суперпользователя; использовать их не буду. dirkt 6 лет назад 0

0 ответов на вопрос