Описание тега atlantic-ocean
Я пытаюсь написать Тун/программы нажмите в Русте. Поскольку я не хочу, чтобы это запустить как root я добавил CAP_NET_ADMIN возможностей в двоичный:
$судо setcap cap_net_admin=эип целевой/выпуска/тоннель
getcap цели $/выпуска/тоннель
целевой/выпуска/тоннеля = cap_net_admin+РП
Однако, это не работает. Все, что я читал говорит, что это только потенциал, необходимый для создания бочки, но программа получает возникновения ошибки EPERM на функции ioctl. В трассированием, я вижу эту ошибку:
в openat(AT_FDCWD, "как/dev/сеть/Тун", O_RDWR|O_CLOEXEC) = 3
вызов fcntl(3, F_GETFD) = 0х1 (флаги FD_CLOEXEC)
функции ioctl(3, TUNSETIFF, 0x7ffcdac7c7c0) = -1 возникновения ошибки EPERM (операция не разрешена)
Я проверил, что бинарные успешно работает с полными правами root, но я не хочу, чтобы это требуют sudo запускать. Почему CAP_NET_ADMIN не достаточно?
Для справки, я на Линукс версия 4.15.0-45
Есть только несколько способов, я вижу, что этот ioctl может вернуть возникновения ошибки EPERM в ядре (https://elixir.bootlin.com/linux/v4.15/source/drivers/net/tun.c#L2194) и по крайней мере один из них, кажется, были довольны. Я не уверен, как проверить другим:
если (!способен(CAP_NET_ADMIN))
возвращение -возникновения ошибки EPERM;
...
если (tun_not_capable(Тун))
возвращение -возникновения ошибки EPERM;
...
если (!ns_capable(сеть->user_ns, CAP_NET_ADMIN))
возвращение -возникновения ошибки EPERM;