All streams
Search
Write a publication
Pull to refresh

Comments 55

А есть ли какие-то планы по развитию в будущем или это на ваш взгляд уже полностью готовое решение?

Очень хороший вопрос, жаль нету кармы чтобы проголосовать. Идей очень много: в первую очередь хотел поработать над портативностью, добавить возможность генерации новых клиентский конфигураций когда сервис уже работает; сделать дополнительную опцию, чтобы можно было сохранять ранее сгенерированные сертификаты, но при этом постараться сохранить первоначальную простоту и замысел по крайней мере как дефолтный вариант: запустил, попользовался, убил — и так каждый раз. Были идеи написать свой VPN протокол на Scala или Erlang — как эксперимент. Прикрутить аутентификацию: Okta и Google. Возможно сделать сервис доступным «on demand» по СМС (послал смс — получил ответную смску с ссылкой на конфигурацию), в этом плане Twilio дает интересные возможности. В самой ближайшей перспективе — сделать видео туториал и документацию по использованию на мобильниках.

А что необычного в запуске докера в докере? Это же обычная практика монтировать сокет докера с хоста внутрь контейнера? И запускай сколько угодно докеров "внутри".

Можно не монтировать ничего, а запускать именно dockerd внутри докер контейнера. В следующей статье я опишу подводные ками и опишу ситуации, где это может быть полезно.
> Это же обычная практика монтировать сокет докера с хоста внутрь контейнера?

Вот так и получаются LPE.

openvpn --config /etc/openvpn/server.conf &


Какой "изумительный" способ запускать в докере службу. Пойдите почитайте пожалуйста best practice

Подобное — в расстрельных списках, тут не best practice надо читать, а вообще как работают Docker контейнеры.
Что ещё в комплекте накопал за 5 минут из неуказанного в других комментариях:
  • Уже устаревший базовый образ из-за прибития к конкретной версии
  • Работа исключительно в --privileged контейнере, вероятнее всего автор не знает как разруливать жизнь внутри network namespace
  • Худший entrypoint из всех возможных, бонусом генерация серверного ключа и правил в хостовый iptables запускаются при каждом старте контейнера
  • Основной сетевой интерфейс хоста должен называться eth0 или не взлетит
  • Крайне полезный build.sh с наличием docker push в Docker Hub (хотя бы без данных для аутентификации)
Каждый дополнительный флаг — это боль разработчика, которую он решил таким способом. Сталкивался с ситуацией, когда при обновлении одного из ассетов, докер упорно не хотел пересобирать образ и говорил что версия в кеше самая актуальная. Завел баг в трекере.
  • Версия 3.9.3 все еще доступна, хотя не рекламируется. На момент старта проекта — она была latest. Я специально отказался от использования тега latest чтобы собирать неизменяемые билды только с протестированными версиями.
  • Флаг
    --privileged
    необходим чтобы делать манипуляции с iptables. В трекере уже есть тикет на то чтобы отказатся от его использования по возможности.
  • Можно пожалуйста больше подробностей, что не так с entrypoint? Генерация серверного ключа при запуске сделана для того чтобы не помещать ее в билдтайм. Проект задумывался как одноразовый VPN сервер, хотя сейчас я думаю как сделать его пригодным для повторного использования. Это все еще Work In Progress проект, но я дошел до стадии когда мне нужен фидбек от комьюнити чтобы все улучшить.
  • Основной сетевой интерфейс хоста должен называться eth0 или не взлетит
    . Спасибо за баг репорт, буду исправлять, а пока добавлю дисклаймер в README.
  • Крайне полезный build.sh с наличием docker push в Docker Hub (хотя бы без данных для аутентификации)
    . Я думаю, что это действительно нужно убрать.

Прилетит дыра в OpenSSL (а таких патчей может прилетать раз в 3 дня в течении месяца) и ваш VPN будет немножко нешифрованным.
Для манипуляций нужен только CAP_NET_ADMIN. Внезапно, всех их можно крутить вообще без прямого участия хоста, создав докерную bridge сеть и поднимая tun0 внутри неё, правила для iptables будут выпиливаться вместе с контейнером.
В Dockerfile указать WORKDIR в место со скриптами, в качестве entrypoint можно использовать стандартную заглушку exec "$@". Таким образом можно отдельной командой с хоста выполнять ваши скрипты и одновременно спокойно проваливаться внутрь через docker exec -it container_name bash.
Спасибо, я знаю про существование capabilities, но мне хотелось чтобы это все взлетело и можно было начать тестировать в боевых условиях как можно раньше. Буду работать над улучшениями. Это бесценный фидбек

Я писал с телефона, и перед сном, поэтому не расписал другие косяки. Крайне нечитаемый код из-за 100500 скриптов

Спасибо, буду делать рефакторинг и все поправлю.
Спасибо, буду делать рефакторинг и все поправлю.

нужно больше скриптов богу скриптов… зачем столько? Зачем аж целый скрипт из аж целой одной строчки?

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

Для генерирования uuid не надо заниматься самодеятельностью, все уже сделано за вас. Команда uuidgen из пакета uuid-runtime

А вы пробовали замерять падение скорости по сравнению с прямым доступом на хост? Файлик там скачать.


Мало того, что openvpn выполняется в пространстве пользователя, вы ещё его в контейнер запихиваете.


Больше изоляции богу изоляции. Не говоря уже о том, что сам сервер в DO хостится на виртуалке. Но это уже не слишком критично, если там ядерная виртуализация.

К сожалению пока нет возможности запускать сетевой дайвер в контейнере. Вернее тма можно сделать, но для этого придется собирать свой линукс-хост. Я собирал кастомные ядра с github.com/linuxkit/linuxkit, но в этом случа о портативности сервиса придется забыть. Что касается пространства пользователя, то подавляющее большинство веб-сервисов работают в нем и даже держат очень высокую нагрузку. Мода на функциональное программирование сделала возможным писать очень быстрые неблокирующие сервера.
UFO landed and left these words here
Да, это отличное проверенное решение.

Вставлю свои пять копеек. Написал как то небольшую инструкцию к этому образу. Вдруг кому-то окажется полезной — hmdw.me/openvpn-docker-new
Основное отличие состоит в том, что проект docker-openvpn от kylemanna требует создания volume-container и еще несколько запусков runnable-container с разными командами и флагами. Для простого пользователя это слишком сложно. Это во-первых.

Во-вторых, мне хотелось создать именно свой контейнер и набить на нем всевозможные шишки и глубоко понимать что происходит «под капотом».

О, да, kylemanna попробовал — прям палочка-выручалочка. Документация подробная и достаточная. Запускается без каких-либо проблем. Какое-то время даже (полу)продакшен на этом образе работал.

Посмотрел и добавил в закладки, но опять таки, я меня создалось впечатление что эти проекты слишком долго настраивать и много документации в README, что наверняка отпугивает многих пользователей. На мой взгляд, в README должен быть минимум информации и Quick Start руководство + плюс ссылки на расширенную документацию.
Any phisical or vps server running Linux.

- phisical
+ physical

А возможно, лучше:


- phisical
+ hardware
bare metal и физический сервер — это немного разные вещи. bare metal — абсолютный минимум, только самое необходимое для запуска контейнеров. Физический сервер — любая железка с линуксом, десктоп Васи Пупкина с Убунту — тоже попадает в эту категорию
Hardware мне больше нравится, я использовал — physical как антоним для virtual, так сказать для контраста
Зачем OpenVPN? Во-первых, он малость устарел, во-вторых, сложно подключаться с мобильных устройств, в третьих — он плохо обрабатывает ситуации, когда мобильный клиент скачет между WiFi и 4G.

Есть IPsec IKEv2, поддерживаемый нативно в Windows и iOS. Не нужны хлопоты с установкой сертификатов и конфигов на клиентские устройства, можно пользоваться сертификатом Let's Encrypt. Split tunnelling работает сразу.

Вот тут — github.com/jawj/IKEv2-setup — лежит скрипт, с помощью которого на пустой виртуалке в Хетцнере, DigitalOcean или AmazonAWS можно поднять VPN-сервер за 2 минуты. On вам сгенерирует mobileconfig для IOS и PowerShell-команду для Windows-клиента даже.

UFO landed and left these words here
ключевое слово "нативно": не требуется никаких «приложений-клиентов», которые могут устареть или не обновиться — используются штатные компоненты операционной системы.

Я ещё понимаю ситуации, когда нужна гибкость OpenVPN — у меня, например, на работе его используют, поскольку к нему легко прикрутить аппаратные токены для 2FA. Но использовать софт из 2001 года в 2019-м для стандартного, в общем-то, сценария? Не понимаю.
Большинству пользователей нужно просто иметь возможность посмотреть как выглядит сайт или какие сервисы доступны из другой гео-позиции. Для этих целей нужно иметь возможность быстро развертывать VPN. Собственно, для этого проект и был задуман и, на мой взгляд, справляется со своей задачей

Чтобы посмотреть с другого региона можно к примеру через hidemyass вбить адрес и выбрать сервер. Вообще за 20 секунд

UFO landed and left these words here
rly? IPsec — открываем по ссылке с сайта файл .mobileconfig, ставим, вводим пароль и PIN от смартфона. Готово. На Андроиде — ставим приложение, вводим пароль, готово.

OpenVPN — ставим приложение, распаковываем и ставим сертификаты, импортируем ovpn-файл. Чешем репу, когда соединение поднимается (секунд так несколько), а трафик в него почему-то не заворачивается. Ну нафиг.
UFO landed and left these words here
Я как раз работаю над документацией и видео-туториалом для подключения с мобильных устройств. Там действительно ничего сложного, а если использовать телефон как хот-спот, то можно добиться того, что делает, например, Телепорт (https://www.amplifi.com/teleport/)
Если то, что вы делаете, (а) дублирует функциональность OS и (б) требует «видео-туториала», вы зря приумножаете сущности.
Зачем OpenVPN? Во-первых, он малость устарел,

Поддержу оратора. Сам им пользовался. Но сейчас путь OpenVPN — в Вальхаллу. Откройте для себя openconnect + ocserv. Весьма зачётная вещь. Даже несмотря на то, что родом оно — из Cisco...

пожалуйста поставьте ему звездочку на ГитХабе, сделайте форк

ну лайк еще ладно, но форк зачем? YT-шные like & subscribe & press that bell button теперь и на GH?

В случае каких либо споров по поводу прав ителлектуальной собственности будет сложнее отжать проект если у него много форков. Всегда можно рефоркнуть проект и продолжать работу в случае чего. Форк — это контрибуция в независимость проекта и его право на долгую жизнь.

ну так надо форки поддерживать в свежем состоянии тогда.

Я вот так и вижу диванных девелоперов которые лайкают, форкают, а потом каждый день дифф накатывают, а то вдруг DMCA :-)

Я имел ввиду что диф накатывает сам разработчик со своего локального репозитария когда возвращается к работе над проектом и делает его open-source снова.

На докер хабе уже столько этих openvpn что потеряться можно

Большинство контейнеров на Докер хабе без вменяемой документации, без привязки к Гит хабу (или любому публичному проекту), без автобилдов, обновлялись сто лет назад.

Вот ссылка на мой образ, если интересно hub.docker.com/r/alekslitvinenk/openvpn
Sign up to leave a comment.

Articles