К написанию этой заметки натолкнула статья Настройка IPTables на разрыв соединения при отключении от VPN, хотя основной функционал, о котором хочу рассказать совершенно другой.
Многим ведь хотелось иметь следующую возможность: сидеть в интернете через обычное соеденение, а какой то софт (допустим Firefox, Burp Suite, sqlmap), паралельно работал через VPN-соединение.
Не многие знают, но в Linux это возможно, и называется это namespace.
Namespace - тема обширная, кто хочет копать глубже - гугль в помощь.
Мы же займемся практикой. Тут на самом деле все просто, так как "все придумано до нас":
установка:
запуск:
где openvpn-client.conf - стандартный конфиг вашего openvpn соеденения
После этого в терминале, где мы запустили ./namespaced-openvpn сам OpenVPN нам скажет, что соединение установлено.
Открываем новый терминал, пишем ifconfig и... мы не видим соединения tun0...
Не видим, так как оно переместилось в контейнер, а наша система выходит в интернет как и раньше, без всяких vpn (она про него даже не знает).
Теперь в этом же, только что открытом терминале запускаем как есть (ничего не меняя):
тут protected - имя нашего контейнера по дефолту. Менять не надо.
тут же вводим ifconfig и видим только lo и tun интерфейсы
Теперь, все то, что мы запустим в данном окне терминала, будет работать через VPN-соединение, которое мы запустили выше. Вся остальная система будет выходить в сеть как и выходила до этого.
Ответы на предполагаемые вопросы:
- открыв несколько терминалов и введя их в контейнер protected, все эти терминалы будут использовать ваше VPN соединение
- дисковая система, процессы и все остальное для софта запущенного в контейнере и вне его - все остается общим. Разница лишь в сетевой подсистеме: у "обычной" системы своя, у контейнера своя, "они не видят" друг друга.
- если рвется соединение с VPN-сервером, то никакие данные из нашего контейнера наружу не вырвутся - просто пропадет линк из контейнера с сетью.
- не получилось запустить Palemoon в контейнере. Вернее запустить получилось, но в сеть он выходит не через VPN. Как, почему - не знаю.
- во избежании кучи открытых терминалов советую использовать terminator (во всяком случае мне нравится)
- вместо терминала, можно запускать сразу нужное приложение. Запуск Firefox в контейнере:
P.S.: с чем не разобрался - это с dns-ами и resolv.conf
После запуска
Многим ведь хотелось иметь следующую возможность: сидеть в интернете через обычное соеденение, а какой то софт (допустим 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 про это что то сказано, но руки так и не дошли. Если кто разберется - озвучте плиз.
Последнее редактирование: