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

в 21:22, , рубрики: api, digital ocean, docker, internet security, open source, openvpn, vpn-сервер, информационная безопасность, облачные сервисы

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

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

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

Предыстория

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

Не найдя ничего приемлемого, я начал работу над своим проектом. Впереди были бессонные ночи изучения документции, написания кода и отладки, но в конечном счете мой сервис увидел свет и заиграл всеми цветами мнохромной светодиодной панели роутера. Итак, прошу любить и жаловать — Docker-OpenVPN. Я даже логотип придумал (выше, перед катом), но его не судите строго, ибо я не дизайнер (уже).

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

Запуск

Чтобы запустить сервис нам необходимы несколько вещей:

  1. Сервер: физический или виртуальный. Теоретически можно запускать в режиме докер-в-докере, но я не проводил масштабного тестирования этой опции;
  2. Собственно Докер. Многие хостинг провайдеры предоставляют готовые решения с Докером «на борту»;
  3. Публичный IP адрес.

Если все реквизиты на месте, то дальше нам остается запустить следующую команду в консоле вашего сервера:

docker run --privileged -it --rm --name dovpn -p 1194:1194/udp -p 8080: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:8080/
Sun Jun  9 08:56:12 2019 NOTE: After you download you client config, http server will be shut down!

Мы близки к цели: теперь нам надо скопировать example.com:8080/ (в вашем случае будет адрес вашего сервера) и вставить в адресную строку браузера. После того как вы нажмете Enter, client.ovpn файл будет скачан, а сам http сервер уйдет в небытие. Если данное решение вызовет сомнение, то можно воспользоваться следующим трюком: зупустить предыдущую команду с добавить флаги zp и пароль. Теперь, если вы вставите сгенерированную ссылку в окно браузера — вы получите зип архив с паролем.

Когда у вас есть файл с клиентской конфигурацией, можно использовать любой подходящий клиент. Я испоьзую Tunnelblick для Мака.

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

Данный видео тутриал содержит подробную инструкцию по развертыванию сервиса на DigitalOcean. Пока что на английском языке, но я планирую сделать версию на русском в скором времени.

Автор: alekslitvinenk

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js