Статья OpenVPN для отдельной программы

К написанию этой заметки натолкнула статья Настройка IPTables на разрыв соединения при отключении от VPN, хотя основной функционал, о котором хочу рассказать совершенно другой.

Многим ведь хотелось иметь следующую возможность: сидеть в интернете через обычное соеденение, а какой то софт (допустим Firefox, Burp Suite, sqlmap), паралельно работал через VPN-соединение.
Не многие знают, но в Linux это возможно, и называется это namespace.

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

Namespace - тема обширная, кто хочет копать глубже - гугль в помощь.

Мы же займемся практикой. Тут на самом деле все просто, так как "все придумано до нас":

установка:
git clone https://github.com/slingamn/namespaced-openvpn

запуск:
cd namespaced-openvpn
sudo ./namespaced-openvpn --config openvpn-client.conf

где openvpn-client.conf - стандартный конфиг вашего openvpn соеденения

После этого в терминале, где мы запустили ./namespaced-openvpn сам OpenVPN нам скажет, что соединение установлено.
Открываем новый терминал, пишем ifconfig и... мы не видим соединения tun0...
Не видим, так как оно переместилось в контейнер, а наша система выходит в интернет как и раньше, без всяких vpn (она про него даже не знает).
Теперь в этом же, только что открытом терминале запускаем как есть (ничего не меняя):

sudo ip netns exec protected sudo -u $USER -i

тут protected - имя нашего контейнера по дефолту. Менять не надо.

тут же вводим ifconfig и видим только lo и tun интерфейсы

Теперь, все то, что мы запустим в данном окне терминала, будет работать через VPN-соединение, которое мы запустили выше. Вся остальная система будет выходить в сеть как и выходила до этого.

Ответы на предполагаемые вопросы:
- открыв несколько терминалов и введя их в контейнер protected, все эти терминалы будут использовать ваше VPN соединение
- дисковая система, процессы и все остальное для софта запущенного в контейнере и вне его - все остается общим. Разница лишь в сетевой подсистеме: у "обычной" системы своя, у контейнера своя, "они не видят" друг друга.
- если рвется соединение с VPN-сервером, то никакие данные из нашего контейнера наружу не вырвутся - просто пропадет линк из контейнера с сетью.
- не получилось запустить Palemoon в контейнере. Вернее запустить получилось, но в сеть он выходит не через VPN. Как, почему - не знаю.
- во избежании кучи открытых терминалов советую использовать terminator (во всяком случае мне нравится)
- вместо терминала, можно запускать сразу нужное приложение. Запуск Firefox в контейнере: sudo ip netns exec protected firefox -u $USER -i

P.S.: с чем не разобрался - это с dns-ами и resolv.conf
После запуска ./namespaced-openvpn --config openvpn-client.conf нужно в контейнере добавлять dns в /etc/resolv.conf, ибо он пуст. В Readme namespaced-openvpn про это что то сказано, но руки так и не дошли. Если кто разберется - озвучте плиз.
 
Последнее редактирование:
>> нужно в контейнере добавлять dns в /etc/resolv.conf,
dhcp-option DNS 8.8.8.8 (ну или какой там вам нужен) в конфиге клиента openvpn есть?
 
Последнее редактирование модератором:
  • Нравится
Реакции: nekto
>>dhcp-option DNS 8.8.8.8 (ну или какой там вас нужен) в конфиге клиента openvpn есть?

Точно, такого нет... Спасибо за наводку )))
 
  • Нравится
Реакции: $random_username
Вопрос к знающим
Как в контейнере namespaced-openvpn запустить anonsurf?
Выдает:
curl: (6) could not resolve host:
resolv.conf изменял? куда смотреть?
 
resolv.conf изменять нужно _именно_ в контейнере
 
При эксплуатации виртуальной сети по протоколу OpenVPN на стороне клиента должны быть следующие файлы:
  • общий сертификат ca.crt
  • ключ для клиента vpn-client.key
  • сертификат для подключения vpn-klient.cert
  • ключ Диффи-Хельмана dh2048.pem
  • клиентский файл конфигурации client.ovpn
О каком стандартном конфиге соединения пишет автор ?
Что это за файл с расширением *.conf ?

где openvpn-client.conf - стандартный конфиг вашего openvpn соеденения
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!