dogberrt (dogberrt) wrote,
dogberrt
dogberrt

Category:

Настройка использования network namespaces: заставляем отдельные приложения ходить в сеть через VPN.

Чтобы не дублировать гугл, наиболее понятное и краткое описание Network Namespaces в Linux на русском из тех, что я видел — тут.
В принципе, ничего сложного в настройке namespaces как таковых нет. Но когда мне захотелось сделать красиво, я столкнулся с парой проблем, часть из которых обходится, а часть — не очень. Особенно в KDE.
В интернетах полно мануалов, но можно поступить проще и взять готовый скрипт настройки, например, отсюда (если используется OpenVPN). После чего этот скрипт спокойно дёргать при запуске openvpn, например, такой командой:

openvpn --ifconfig-noexec --route-noexec --up [script_name] --route-up [script_name] --down [script_name] --config [config_name].ovpn --script-security 2 --up [script_name]

Опция --script-security 2 нужна, чтобы OpenVPN разрешил запуск "левого" скрипта после соединения (а его как раз нужно запустить для помещения vpn-соединения в соответствующий namespace и настройки маршрутизации).
Если для поднятия сети используется Network Manager — можно обернуть и эту команду в ещё один простенький скрипт и закинуть в /etc/NetworkManager/dispatcher.d/.
Заблаговременно можно озаботиться отдельным DNS для VPN-соединений (если это необходимо). Прописываются они в /etc/netns/[namespace]/resolv.conf абсолютно стандартным образом:

nameserver [IP-адрес]

Если всё сделано правильно, в итоге должен получиться новый namespace, запускаемые в котором приложения не будут видеть никаких
"реальных" интерфейсов, и от безысходности обращаться к tun0. На этом этапе должен иметься успешный пинг до чего угодно и даже какой-нибудь elinks.

sudo ip netns exec vpn su - [user] -c elinks

Поскольку давать простому пользователю возможность играться с netns, равно как и пускать браузер от рута — плохая идея, приходится дважды вызывать либо su, либо sudo, либо обеих сразу.
В случае особого везения может запуститься даже иксовое приложение, хотя полагаться на это не стоит по паре причин.
1. Ему неизвестно, в какую сессию и на какой дисплей выводиться.
2. Запускаемые в namespace приложения не могут общаться с запущенной сессией D-Bus.
И к слову, пускать иксовое приложение из консоли — сомнительное удовольствие, поэтому sudo надо заменить на какой-нибудь графический эквивалент, который можно будет обернуть в .desktop-файл и запускать так, чтобы вообще не задумываться о том, что есть какие-то namespace. Ну или почти.
Плохие новости для кдешников — kdesudo не подходит совсем: запускать оно запускает, но по пути namespace почему-то теряется, равно как и второе su — при запуске, например, вот так:

kdesudo ip netns exec vpn su - [user] -c opera

— мы получим оперу, однако это будет опера от рута и не знающая ни о каком namespace. Что будет с gksudo — не знаю.
Поэтому я выбрал pkexec. Если дебиан или убунта — не забыть проверить, чтобы в системе стоял policykit-1-gnome. Pkexec заодно надо напомнить, что за сессия и что за экран (соответственно, показать ему Xauthority и DISPLAY)

pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY ip netns exec vpn su - [user] -c opera

...И опера (по крайней мере, классическая) всё равно не запустится. Равно как и Ktorrent, и вообще большая часть приложений из состава KDE. Все они будут громко ругаться на невозможность присоединиться к действующей сессии D-Bus.
Тут есть два варианта:
— добавить запуск новой сессии D-Bus, например, так:

pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY ip netns exec vpn su - [user] -c "dbus-run-session opera"

После этого окажется, что кеды не очень хорошо принимают ситуацию нескольких открытых сессий D-Bus. После того, как Опера дёрнет D-Bus (самое очевидное — вызов кде-шного диалога открытия/сохранения), значки в трее могут перемешаться рандомным образом, а приложения из состава KDE могут начать тормозить и падать, вплоть до фриза иксов. Замена dbus-run-session на dbus-launch особо суть дела не поменяет. Как такое перенесёт гном или мэйт — не знаю. Xfce и более простым окружениям, скорее всего, как раз будет насрать, их пользователям, в принципе, уже можно успокоиться.

взять это проще и отказаться от запуска сложных, требующих интеграции со средой, приложений, в namespace. Firefox, например, хоть и изрядно поругается, но запустится. Практически без проблем запустится qBittorrent. Вообще, если приложение написано на чистом Qt или GTK — проблем с ним, скорее всего, не будет. Можно и классическую оперу научить так запускаться, сказав ей, что на самом деле у вас не KDE. За это отвечает настройка Dialog Toolkit в opera:config. Выберите 2 (GTK) или 4 (X11).


Приложениям на Qt тоже надо объяснить, что у вас на самом деле не KDE, в противном случае при попытке выбора файла они тормознут и откроют KDE-шный диалог, в котором ничего выбрать не дадут (к сессии D-Bus у них доступа нет). Обычно помогает -style=GTK+ (имейте в виду, что диалоги выбора файлов станут гномовскими, тут ничего не поделать, ну и тема GTK должна быть настроена).
В итоге в .desktop-файл можно прописать примерно следующее:

pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY ip netns exec vpn su - [user] -c 'qbittorrent -style=GTK+ "%U"'

Функциональность в целом не пострадала, разве что вызвать из qBittorrent приложение, полагающееся на D-Bus, не получится. То есть, например, посмотреть загружающееся видео в SMPlayer или тем более mpv — без проблем, а вот открыть содержащую файл папку в Krusader — ни-ни.
Ну и пароль пользователя при запуске спросит. Ну, это не баг, это фича.
На выходе получится то, что нужно — одно приложение ходит в сеть через общий интерфейс, а другое — через VPN.
Tags: kde, linux, network namespaces, vpn
Subscribe

  • Linux и Logitech M560.

    M560, насколько мне известно — одна из наименее дорогих (назвать дешёвой мышку почти за две тыщи рублей язык не повернётся) беспроводных мышей…

  • "Не пытайтесь повторить самостоятельно"

    Час ночи. Synaptic ставит OpenOffice.org. MPD опять крутит Hare Hare Yukai. День разгребания конфигов и попытки подружить приложения на Qt3, Qt4 и…

  • Долгие скитания в поисках идеального DE

    Хоть я и пишу весьма редко (если это можно назвать записями), но в этот раз перерыв получился просто гигантским. Несмотря на кучу материала, который…

  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 0 comments