Комментарии 30
рассказывал в телеграмме бывшему другу и коллеге

Судя по всему у друга что-то не срослось, раз стал бывшим.
Скорее это я — существо очень странное. Но здесь не место для обсуждения моих личных взаимодействий.
Штука интересная, но применимость на практике стремится к нулю.
Мне проще поднять N vpn-соединений и банальной машрутизацией разрулить трафик.
Пара строчек ip r намного проще этого монстра.
Где монстр-то?
Все в юните и живет само по себе.
На практике все настраивается один раз и работает.
Но у каждого свой путь, ваш тоже имеет право на жизнь, я предложил готовое решение для желающих.
Юнит на 15 строк ExecStart в моём понимании есть монстр. Более того, чтобы кто-то со стороны попытался понять логику всего этого дела и отлаживать его в случае неработоспособности… Я бы снёс нафиг, «не дожидаясь перитонитов».

Если уж на то пошло, уж лучше поднять прокси-серверы вместо vpn, и указать в приложениях эти прокси. Обслуживать на порядок проще будет.
Согласен, если задачу ставить именно так. Но я с трудом могу представить, когда может возникнуть такая необходимость.
Элементарно. Нужно что бы вся система ходила напрямую через провайдера, а торрент-клиент или браузер ходил через VPN. Или нужно, что бы только Steam ходил через VPN(что бы Steam видел регион отличный от того где ты), а вся система ходила, напрямую. Десктопных кейсов я могу придумать три десятка.
Торрент-клиенты и браузеры умеют через прокси ходить, а настроить socks-прокси намного проще.

В случае со стимом действительно имеет место быть.
Кстати, подобная технология уже была описана 2 года назад: https://habrahabr.ru/post/123140.
Да, торрент-клиенты и браузеры могут, но ими софт не ограничивается. Простой пример: подключение к сети клиента. Мне не нужно, что бы что-то еще ходило в его сеть, мне нужно, что бы туда ходило одно конкретное приложение.
Просто отключить переназначение шлюза по умолчанию для VPN и всё. Лично меня так три VPN-подключения висят.
Дело не в шлюзах по умолчанию, у меня тоже висит три VPN'а без default gw, дело в том, что можно пускать куда-то отдельное приложение. Помимо Steam это полезно для некоторых онлайн-игр, где бывает рестрикт по региону(да, запускать игры под wine — дурное занятие, но часто для того что бы поиграть не хочется ребутиться в систему для игр, да и под системой для игр подобное невозможно).
Вооот, потихоньку удаётся вытянуть примеры задач.

Я ничего не имею против network namespace, просто я приверженец принципа KISS.
То есть, к примеру, запихивать браузер в такую обёртку — это как из пушки по воробьям. Но если приложение по-другому никак не ограничить, тогда ладно.

BTW виндовые игрушки можно в VirtualBox запускать с openvpn. Тяжеловато, но просто реализовать.
> BTW виндовые игрушки можно в VirtualBox запускать с openvpn.

Не-не-не. Если под вайном они еще как-то прилично идут, то под VB совсем беда и огорчение. Плюс я не использую VB принципиально, я не вижу смысла тащить сторонний VB, при наличии нативного KVM.
Отлично, спасибо за quickstart! Я всё думал, как бы так красиво разрулить трафик, почему-то namespaces в голову не приходили.
Рад что пригодилось, для того и писал, да на гитхаб выкладывал.
Да, конечно, можно запустить что угодно, я вот теперь еще pptp так запускаю до одного из клиентов.
Как вариант, чтобы не использовать sudo, есть возможность использовать http://man7.org/linux/man-pages/man7/capabilities.7.html
Примерно так:
cp /bin/ip ~/bin
sudo setcap CAP_SYS_ADMIN=eip ~/bin/ip
~/bin/ip netns exec vpn id

Еще нужно не забыть добавить ~/bin/ в переменную PATH до основных директорий и ограничить к ней доступ.
Вы таким образом дадите использовать вообще ip, а не только ip netns exec, чего не хотелось бы, но идея интересная, спасибо.
О, как раз недавно задавался таким вопросом. Спасибо за статью!
Совсем не обязательно настраивать интернет внутри неймспейса, не нужно даже запускать OpenVPN внутри него, достаточно установить VPN-соединение обычным образом и перенести tun-интерфейс внутрь нового неймспейса. Этот способ примечателен тем, что в случае разъединения VPN, трафик приложений внутри неймспейса не пойдет через обычный интернет.
Если обратить на строки про установку фейкового gw, то у меня тоже трафик приложений внутри неймспейса никуда не пойдет.
А можно подробнее почему PrivateNetwork= и JoinsNamespaceOf= с PrivateTmp= не будут работать как нам надо? Заодно и создание/настройку сети для неймспейса оформить через networkd (используя .network, .netdev, .link файлы)? В чем там проблема?
C PrivateTmp= посмотрите по ссылке на LOR, это не моя информация, там есть объяснение:
«Note that using this setting will disconnect propagation of mounts from the service to the host (propagation in the opposite direction continues to work). This means that this setting may not be used for services which shall be able to install mount points in the main mount namespace»

Если предложите решение с networkd, то с радостью посмотрю, пишите на гитхабе, я для того и сделал репозиторий, что бы можно было смотреть и править, если что.
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.