LINUX.ORG.RU
решено ФорумAdmin

Запуск программы в VRF без привилегий root в Debian

 ,


0

1

Добрый день.

Есть идея запустить браузер в отдельном VRF, чтобы он шел на вышестоящий роутер где тоже есть VRF и интерфейсы в данном VRF идут через VPN.

Ну тоесть я хочу чтобы у меня в системе было запущено два браузера, один работал как обычно а второй имел по сути дефолт роут в VPN.

Столкнулся с тем что

flame@linux-pc:~$ ip vrf exec vrf32 google-chrome
Failed to load BPF prog: 'Operation not permitted'

Пошел гуглить про bpf и capabilities, нашел тему Запуск процесса в VRF без привилегий root

Из нее понял что вроде бы как достаточно только cap_bpf. Но это не помогло, выдал еще несколько.

сделал вот так:

root@linux-pc:~# getcap /opt/google/chrome/google-chrome
/opt/google/chrome/google-chrome cap_net_raw,cap_sys_admin,cap_bpf=ep
root@linux-pc:~# getcap /opt/google/chrome/chrome
/opt/google/chrome/chrome cap_net_raw,cap_sys_admin,cap_bpf=ep

Установил kernel.unprivileged_bpf_disabled в 0 (по дефолту было 2)

flame@linux-pc:~$ sysctl kernel.unprivileged_bpf_disabled
kernel.unprivileged_bpf_disabled = 0

всё равно получаю ту же ошибку:

flame@linux-pc:~$ ip vrf exec vrf32 google-chrome
Failed to load BPF prog: 'Operation not permitted'

выдал те же capabilites для ping:

root@linux-pc:~# getcap /usr/bin/ping
/usr/bin/ping cap_net_raw,cap_sys_admin,cap_bpf=ep
flame@linux-pc:~$ ip vrf exec vrf32 ping 10.32.32.1
Failed to load BPF prog: 'Operation not permitted'

Из под рута пинг работает:

root@linux-pc:~# ip vrf exec vrf32 ping 10.32.32.1
PING 10.32.32.1 (10.32.32.1) 56(84) bytes of data.
64 bytes from 10.32.32.1: icmp_seq=1 ttl=64 time=0.470 ms
64 bytes from 10.32.32.1: icmp_seq=2 ttl=64 time=0.448 ms
^C
--- 10.32.32.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1015ms
rtt min/avg/max/mdev = 0.448/0.459/0.470/0.011 ms
root@linux-pc:~# ip vrf exec vrf32 ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=117 time=273 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=117 time=131 ms
^C
--- 8.8.8.8 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 131.457/202.363/273.270/70.906 ms

вобщем понимаю что чего то не хватает но не понимаю чего :)

как можно реализовать такое?

И еще вопрос насколько опасно это может быть, если выдавать браузеру такие capabilities?

ОС Debian stable

root@linux-pc:~# cat /etc/os-release 
PRETTY_NAME="Debian GNU/Linux 12 (bookworm)"
NAME="Debian GNU/Linux"
VERSION_ID="12"
VERSION="12 (bookworm)"

root@linux-pc:~# uname -a
Linux linux-pc 6.1.0-28-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.119-1 (2024-11-22) x86_64 GNU/Linux


Последнее исправление: psyflame (всего исправлений: 1)
Ответ на: комментарий от firkax

Да вы правы теперь ругается на cgroup. Пока что не понял как ими правильно рулить, буду читать документацию.

flame@linux-pc:~$ ip vrf exec vrf32 ping 10.32.32.1
Failed to open cgroups.procs file: Permission denied.

По поводу просто роутинга - и так есть на маршрутизаторе, причем по DNS именам, но иногда получается такая ситуация что на каких то сайтах какие то ресурсы например js файлы либо формы тянутся через впн и не отображаются.

Хотел сделать именно два браузера причем чтобы они работали локально. Рассматривал разные варианты - проброс X11 через ssh в виртуалку либо lxc контейнер но в этом случае всеравно есть инпут лаг и оверхед траффик.

А чтобы запустить локально чтобы браузер использовал все ресурсы системы пока придумал только такой способ

psyflame
() автор топика

https://man7.org/linux/man-pages/man8/ip-vrf.8.html

This command also requires to be run as root. Alternatively
              it can be run by an unprivileged user if the following
              capabilities(7) are given:

              CAP_BPF
                     To load the BPF program.

              CAP_NET_ADMIN
                     To set the socket into the cgroup.

              CAP_DAC_OVERRIDE
                     To create the cgroup subdir in /sys.

Права надо выдавать бинарнику ip, а не той программе, что ты запускаешь.
Очевидно что при такой конфигурации любой пользователь сможет запустить любой процесс в любом существуещем VRF.
Поэтому я бы рассмотрел вариант использования sudo/doas.

Pinkbyte ★★★★★
()
Последнее исправление: Pinkbyte (всего исправлений: 1)

@firkax

@antech

@Pinkbyte

Спасибо вам что отписались и натолкнули на верные мысли. А еще говорят комьюнити в линуксе токсичное, ниче не токсичное.

Для своей задачи разобрался.

Оставлю тут инструкцию и полезные ссылки для тех кому возможно будет интересна эта тема.

Само собой для отдельного браузера можно было использовать и прокси который где нибудь в контейнере с впн. Но что если нам нужен не только браузер а другое приложение. и приложение не поддерживает работу с прокси? Тогда изоляция трафика это наш бро!

Запускаем прям вот так

root@linux-pc:~# ip vrf exec vrf32 /bin/bash

Переходим в своего пользователя

root@linux-pc:~# su - flame

добавляем переменную с дисплеем

flame@linux-pc:~$ export DISPLAY=:0.0

Ну и запускаем нужные приложения, они будут маршрутизироваться внутри VRF !

Дополнительно - если у вас проблема с пшшшш аудио :) (пульсаудио кто не понял) - ну тоесть нет звука в приложениях запущеных в VRF или ошибки такого вида например

flame@linux-pc:~$ vlc
VLC media player 3.0.21 Vetinari (revision 3.0.21-0-gdd8bfdbabe8)
[0000558f38474880] vlcpulse audio output error: PulseAudio server connection failure: Соединение отвергнуто

Фиксим вот так правя в файлах следующие строки:

etc/pulse/default.pa
load-module module-native-protocol-unix auth-group=audio socket=/tmp/pulse-server

/etc/pulse/client.conf
autospawn = no
default-server = unix:/tmp/pulse-server
enable-memfd = yes

Ну и перезапускаем демона пшшш :) аудио:

pulseaudio -k ; pulseaudio -D

Полезные ссылки:

Изоляция трафика в линукс общая теория

Изоляция через пространсва имен - более глубокий уровень:

Статья по изоляции приложений в пространствах имен раз

Статья по изоляции приложений в пространствах имен два

psyflame
() автор топика