LINUX.ORG.RU

root TUNSETIFF NET_ADMIN

 , , ,


0

1

Всех приветствую. Столкнулся со странной фигней.

В рамках рабочей задачи, надо одно сетевое самописное приложение подружить с tun0. Делаем простейшее приложение, которое открывает /dev/net/tun и вызывает ioctl(fd, TUNSETIFF, &arg); На своем рабочем компе все отлично.

Когда понес это на целевую платформу получил по морде -EPERM. Пошел исследовать tun.c, там все упирается в то, что у пользователя нет CAP_NET_ADMIN. Притом, что tun0 я создаю от root и приложение тоже запускаю от root.

Да, целевая система, это мелкий арм с ядром 4.3+uClibс+busybox. никаких setcap/getcap там нет. А собрать libcap под это я еще не смог. Что это может быть? Почему root не может в своей системе творить что хочет?

★★★★★
Ответ на: комментарий от vel

А strace там есть

там вообще ничего нет.

но ioctl возвращает -1, так что вариантов там не много.

Уж не через tunctl?

Все так. Но на контрольном примере (на рабочем компе) делал и через tunctl и через ip tuntap - работало одинаково.

На целевой платформе ip от busybox-а кастрированный да еще и старый (1.23). Поэтому ip tuntap не доступен. Приходится играть на том что есть.

yax123 ★★★★★
() автор топика
Ответ на: комментарий от yax123

IMHO tunctl нужен только когда интерфейс использует обычный юзер.

Если ты от рута запускашь процесс который создает интерфейс через /dev/net/tun, то в tunctl нет необходимости.

А на целевой платформе ядро выше 4.4?

vel ★★★★★
()
Ответ на: комментарий от vel

На целевой платформе у меня 4.3 и без вариантов что либо поменять.

Похоже я тут нарвался на недомыслие.

На локальном компе (5.15.19), я создал интерфейс tun0, настроил и потом прицепился к нему через:

open("/dev/net/tun", O_RDWR);
ifr.ifr_flags = IFF_TUN;
strcpy(ifr.ifr_name, "tun0");
ioctl(tun_fd, TUNSETIFF, (void *)&ifr);
read(tun_fd, buffer, sizeof(buffer));

и все взлетело.

Попробовал на таргете и там получил по морде (-EPERM). Но когда я удалил предварительно из системы tun0 и опять запустил выше приведенный исходный код - все взлетело.

То есть, на локальном он смог прицепиться к существующему интерфейсу (ну или создал свой с таким же именем). А на таргете такой интерфейс существует, то ничего не работает. Похоже есть отличия в реализации tun.c

Пойду дифну их

yax123 ★★★★★
() автор топика
Ответ на: комментарий от no-dashi-v2

Нет, дело не в этом. Он в принципе не может ничего делать с уже существующим интерфейсом. Если его нет, то он его создает. Если есть, то ioctl отваливается с ошибкой.

yax123 ★★★★★
() автор топика