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, но в этом случа о портативности сервиса придется забыть. Что касается пространства пользователя, то подавляющее большинство веб-сервисов работают в нем и даже держат очень высокую нагрузку. Мода на функциональное программирование сделала возможным писать очень быстрые неблокирующие сервера.
Да, это отличное проверенное решение.

Вставлю свои пять копеек. Написал как то небольшую инструкцию к этому образу. Вдруг кому-то окажется полезной — 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 just landed and posted this here
ключевое слово "нативно": не требуется никаких «приложений-клиентов», которые могут устареть или не обновиться — используются штатные компоненты операционной системы.

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

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

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

OpenVPN — ставим приложение, распаковываем и ставим сертификаты, импортируем ovpn-файл. Чешем репу, когда соединение поднимается (секунд так несколько), а трафик в него почему-то не заворачивается. Ну нафиг.
UFO just landed and posted this 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