3 July 2019

Запускаем OpenVPN в Докере за 2 секунды

Information SecurityOpen sourceAPICloud services
Tutorial
Привет, хабровчане! Сталкивались ли вы когда-либо с ситуацией, когда очень хотелось бы виртуально перенестись в другой город, страну или на другой континент? У меня такая необходимость возникает достаточно часто, поэтому возможность иметь свой VPN сервер, который можно запустить где угодно, за пару секунд, стоял достаточно остро.В этой статье хочу рассказать про свой проект, который я задумал когда искал готовое решение, в данном случае докер образ, который бы позволил быстро поднять OpenVPN сервер, с минимумом настроек и приемлемым уровнем безопасности.


Предыстория

Возможность запускать сервис на любой машине: будь-то физический сервер, или виртуальный частный сервер, или, вовсе, контейнерное пространство внутри другой системы управления контейнерами — была критически важной. Мой взор сразу пал на Докер. Во-первых, этот сервис набирает популярность, а следовательно, все больше и больше провайдеров предоставляют готовые решения с его предустановкой; во-вторых — есть централизованное хранилище образов, откуда можно скачать и запустить сервис с помощью одной команды в терминале. Мысль, что подобный проект уже должен существовать, посещала меня и я упорно искал. Но, большинство проектов, которые я находил — были либо слишком громоздкими (нужно было создавать контейнер для постоянного хранения данных и несколько раз запускать контейнер с приложением с разными параметрами), либо без вменяемой документации, либо вовсе заброшенными.Не найдя ничего приемлемого, я начал работу над своим проектом. Впереди были бессонные ночи изучения документации, написания кода и отладки, но в конечном счете мой сервис увидел свет и заиграл всеми цветами монохромной светодиодной панели роутера. Итак, прошу любить и жаловать — Docker-OpenVPN. Я даже логотип придумал (выше, перед катом), но его не судите строго, ибо я не дизайнер (уже).Когда я реализовывал этот проект, я ставил во главу угла скорость развертывания, минимум настроек и приемлемый уровень безопасности. Методом проб и ошибок я нашел оптимальный баланс этих критериев, правда, кое-где пришлось пожертвовать скоростью развертывания ради безопасности, а за минимум настроек пришлось заплатить портативностью: в текущей конфигурации однажды созданный контейнер на одном сервере нельзя перенести и запустить на другой. Например, все клиентские и серверные сертификаты генерируются при запуске сервиса и это заниамет около 2 секунд. Однако, генерацию файла Дефи Хеллмана пришлось вынести в билд-тайм: он создается во время сборки докер образа и может длиться до 10 минут. Я бы очень хотел получить аудит безопасности подобного решения от многоуважаемого сообщества.

Запуск

Чтобы запустить сервис нам необходимы несколько вещей:
  1. Сервер: физический или виртуальный. Теоретически можно запускать в режиме докер-в-докере, но я не проводил масштабного тестирования этой опции;
  2. Собственно Докер. Многие хостинг провайдеры предоставляют готовые решения с Докером «на борту»;
  3. Публичный IP адрес.
Если все реквизиты на месте, то дальше нам остается запустить следующую команду в консоли вашего сервера:
docker run --cap-add=NET_ADMIN \
-it -p 1194:1194/udp -p 80:8080/tcp \
-e HOST_ADDR=$(curl -s https://api.ipify.org) \
alekslitvinenk/openvpn
Внимательный читатель мог обратить внимание на то, что IP адрес сервера определяется автоматически с помощью ipify.org. Если по каким-то причинам это не работает, то можно указать адрес вручную.Если все предыдущие шаги были выполнены верно, то мы должны увидеть в консоли нечто похожее:
Sun Jun  9 08:56:11 2019 Initialization Sequence Completed
Sun Jun  9 08:56:12 2019 Client.ovpn file has been generated
Sun Jun  9 08:56:12 2019 Config server started, download your client.ovpn config at http://example.com/
Sun Jun  9 08:56:12 2019 NOTE: After you download you client config, http server will be shut down!
Мы близки к цели: теперь нам надо скопировать example.com (в вашем случае будет адрес вашего сервера) и вставить в адресную строку браузера. После того как вы нажмете Enter, client.ovpn файл будет скачан, а сам http сервер уйдет в небытие. Если данное решение вызовет сомнение, то можно воспользоваться следующим трюком: запустить предыдущую команду и добавить флаги zp и пароль. Теперь, если вы вставите сгенерированную ссылку в окно браузера — вы получите зип архив с паролем.Когда у вас есть файл с клиентской конфигурацией, можно использовать любой подходящий клиент. Я использую Tunnelblick для Мака.

Видео туториал

Данный видео туториал содержит подробную инструкцию по развертыванию сервиса на DigitalOcean.
P.S. Если вы считаете данный проект полезным, то пожалуйста поставьте ему звездочку на ГитХабе, сделайте форк и расскажите друзьям. Контрибуторы и аудит безопасности также широко приветствуются.P.P.S. Если эта статья попадет на Хабр, то я планирую написать следующую про то как я запускал докер-в-докере и докер-в-докере-в-докере, для чего я это делал и что из этого вышло.
EDIT1:
  1. Исправил ошибки в публикации,
  2. Отвечая на комментарии решил вынести эту информацию сюда: флаг --privileged нужен для работы с iptables

EDIT2:
  1. Улучшил команду запуска образа: теперь он не требует флаг --privileged
  2. Добавил ссылку на русскоязычное видео руководство: youtu.be/A8zvrHsT9A0

EDIT3:
  1. Сделал сайт для проекта: dockovpn.io
Tags:vpn-серверopenvpndockerdigital oceaninternet security
Hubs: Information Security Open source API Cloud services
+22
25.5k 199
Comments 55