Привет, хабровчане! Сталкивались ли вы когда-либо с ситуацией, когда очень хотелось бы виртуально перенестись в другой город, страну или на другой континент? У меня такая необходимость возникает достаточно часто, поэтому возможность иметь свой VPN сервер, который можно запустить где угодно, за пару секунд, стоял достаточно остро.
В этой статье хочу рассказать про свой проект, который я задумал когда искал готовое решение, в данном случае докер образ, который бы позволил быстро поднять OpenVPN сервер, с минимумом настроек и приемлемым уровнем безопасности.
Возможность запускать сервис на любой машине: будь-то физический сервер, или виртуальный частный сервер, или, вовсе, контейнерное пространство внутри другой системы управления контейнерами — была критически важной. Мой взор сразу пал на Докер. Во-первых, этот сервис набирает популярность, а следовательно, все больше и больше провайдеров предоставляют готовые решения с его предустановкой; во-вторых — есть централизованное хранилище образов, откуда можно скачать и запустить сервис с помощью одной команды в терминале. Мысль, что подобный проект уже должен существовать, посещала меня и я упорно искал. Но, большинство проектов, которые я находил — были либо слишком громоздкими (нужно было создавать контейнер для постоянного хранения данных и несколько раз запускать контейнер с приложением с разными параметрами), либо без вменяемой документации, либо вовсе заброшенными.
Не найдя ничего приемлемого, я начал работу над своим проектом. Впереди были бессонные ночи изучения документации, написания кода и отладки, но в конечном счете мой сервис увидел свет и заиграл всеми цветами монохромной светодиодной панели роутера. Итак, прошу любить и жаловать — Docker-OpenVPN. Я даже логотип придумал (выше, перед катом), но его не судите строго, ибо я не дизайнер (уже).
Когда я реализовывал этот проект, я ставил во главу угла скорость развертывания, минимум настроек и приемлемый уровень безопасности. Методом проб и ошибок я нашел оптимальный баланс этих критериев, правда, кое-где пришлось пожертвовать скоростью развертывания ради безопасности, а за минимум настроек пришлось заплатить портативностью: в текущей конфигурации однажды созданный контейнер на одном сервере нельзя перенести и запустить на другой. Например, все клиентские и серверные сертификаты генерируются при запуске сервиса и это заниамет около 2 секунд. Однако, генерацию файла Дефи Хеллмана пришлось вынести в билд-тайм: он создается во время сборки докер образа и может длиться до 10 минут. Я бы очень хотел получить аудит безопасности подобного решения от многоуважаемого сообщества.
Чтобы запустить сервис нам необходимы несколько вещей:
Если все реквизиты на месте, то дальше нам остается запустить следующую команду в консоли вашего сервера:
Внимательный читатель мог обратить внимание на то, что IP адрес сервера определяется автоматически с помощью ipify.org. Если по каким-то причинам это не работает, то можно указать адрес вручную.
Если все предыдущие шаги были выполнены верно, то мы должны увидеть в консоли нечто похожее:
Мы близки к цели: теперь нам надо скопировать example.com (в вашем случае будет адрес вашего сервера) и вставить в адресную строку браузера. После того как вы нажмете Enter, client.ovpn файл будет скачан, а сам http сервер уйдет в небытие. Если данное решение вызовет сомнение, то можно воспользоваться следующим трюком: запустить предыдущую команду и добавить флаги zp и пароль. Теперь, если вы вставите сгенерированную ссылку в окно браузера — вы получите зип архив с паролем.
Когда у вас есть файл с клиентской конфигурацией, можно использовать любой подходящий клиент. Я использую Tunnelblick для Мака.
Данный видео т��ториал содержит подробную инструкцию по развертыванию сервиса на DigitalOcean.
P.S. Если вы считаете данный проект полезным, то пожалуйста поставьте ему звездочку на ГитХабе, сделайте форк и расскажите друзьям. Контрибуторы и аудит безопасности также широко приветствуются.
P.P.S. Если эта статья попадет на Хабр, то я планирую написать следующую про то как я запускал докер-в-докере и докер-в-докере-в-докере, для чего я это делал и что из этого вышло.
EDIT1:
EDIT2:
EDIT3:
В этой статье хочу рассказать про свой проект, который я задумал когда искал готовое решение, в данном случае докер образ, который бы позволил быстро поднять OpenVPN сервер, с минимумом настроек и приемлемым уровнем безопасности.
Предыстория
Возможность запускать сервис на любой машине: будь-то физический сервер, или виртуальный частный сервер, или, вовсе, контейнерное пространство внутри другой системы управления контейнерами — была критически важной. Мой взор сразу пал на Докер. Во-первых, этот сервис набирает популярность, а следовательно, все больше и больше провайдеров предоставляют готовые решения с его предустановкой; во-вторых — есть централизованное хранилище образов, откуда можно скачать и запустить сервис с помощью одной команды в терминале. Мысль, что подобный проект уже должен существовать, посещала меня и я упорно искал. Но, большинство проектов, которые я находил — были либо слишком громоздкими (нужно было создавать контейнер для постоянного хранения данных и несколько раз запускать контейнер с приложением с разными параметрами), либо без вменяемой документации, либо вовсе заброшенными.
Не найдя ничего приемлемого, я начал работу над своим проектом. Впереди были бессонные ночи изучения документации, написания кода и отладки, но в конечном счете мой сервис увидел свет и заиграл всеми цветами монохромной светодиодной панели роутера. Итак, прошу любить и жаловать — Docker-OpenVPN. Я даже логотип придумал (выше, перед катом), но его не судите строго, ибо я не дизайнер (уже).
Когда я реализовывал этот проект, я ставил во главу угла скорость развертывания, минимум настроек и приемлемый уровень безопасности. Методом проб и ошибок я нашел оптимальный баланс этих критериев, правда, кое-где пришлось пожертвовать скоростью развертывания ради безопасности, а за минимум настроек пришлось заплатить портативностью: в текущей конфигурации однажды созданный контейнер на одном сервере нельзя перенести и запустить на другой. Например, все клиентские и серверные сертификаты генерируются при запуске сервиса и это заниамет около 2 секунд. Однако, генерацию файла Дефи Хеллмана пришлось вынести в билд-тайм: он создается во время сборки докер образа и может длиться до 10 минут. Я бы очень хотел получить аудит безопасности подобного решения от многоуважаемого сообщества.
Запуск
Чтобы запустить сервис нам необходимы несколько вещей:
- Сервер: физический или виртуальный. Теоретически можно запускать в режиме докер-в-докере, но я не проводил масштабного тестирования этой опции;
- Собственно Докер. Многие хостинг провайдеры предоставляют готовые решения с Докером «на борту»;
- Публичный 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:
- Исправил ошибки в публикации,
- Отвечая на комментарии решил вынести эту информацию сюда: флаг --privileged нужен для работы с iptables
EDIT2:
- Улучшил команду запуска образа: теперь он не требует флаг --privileged
- Добавил ссылку на русскоязычное видео руководство: youtu.be/A8zvrHsT9A0
EDIT3:
- Сделал сайт для проекта: dockovpn.io

