Docker linux server openvpn as

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

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

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

Предыстория

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

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

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

Запуск

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

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

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

Внимательный читатель мог обратить внимание на то, что IP адрес сервера определяется автоматически с помощью ipify.org. Если по каким-то причинам это не работает, то можно указать адрес вручную.

Если все предыдущие шаги были выполнены верно, то мы должны увидеть в консоли нечто похожее:

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

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

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

Данный видео туториал содержит подробную инструкцию по развертыванию сервиса на DigitalOcean.

P.S. Если вы считаете данный проект полезным, то пожалуйста поставьте ему звездочку на ГитХабе, сделайте форк и расскажите друзьям. Контрибуторы и аудит безопасности также широко приветствуются.

Читайте также:  Некорректное выключение не загружается windows

P.P.S. Если эта статья попадет на Хабр, то я планирую написать следующую про то как я запускал докер-в-докере и докер-в-докере-в-докере, для чего я это делал и что из этого вышло.

EDIT1:

  1. Исправил ошибки в публикации,
  2. Отвечая на комментарии решил вынести эту информацию сюда: флаг —privileged нужен для работы с iptables

Источник

Docker linux server openvpn as

OpenVPN for Docker

OpenVPN server in a Docker container complete with an EasyRSA PKI CA.

Pick a name for the $OVPN_DATA data volume container. It’s recommended to use the ovpn-data- prefix to operate seamlessly with the reference systemd service. Users are encourage to replace example with a descriptive name of their choosing.

Initialize the $OVPN_DATA container that will hold the configuration files and certificates. The container will prompt for a passphrase to protect the private key used by the newly generated certificate authority.

Start OpenVPN server process

Generate a client certificate without a passphrase

Retrieve the client configuration with embedded certificates

Miscellaneous write-ups for advanced configurations are available in the docs folder.

Systemd Init Scripts

A systemd init script is available to manage the OpenVPN container. It will start the container on system boot, restart the container if it exits unexpectedly, and pull updates from Docker Hub to keep itself up to date.

Please refer to the systemd documentation to learn more.

If you prefer to use docker-compose please refer to the documentation.

Create an environment variable with the name DEBUG and value of 1 to enable debug output (using «docker -e»).

Test using a client that has openvpn installed correctly

Run through a barrage of debugging checks on the client if things don’t just work

Consider setting up a systemd service for automatic start-up at boot time and restart in the event the OpenVPN daemon or Docker crashes.

How Does It Work?

Initialize the volume container using the kylemanna/openvpn image with the included scripts to automatically generate:

  • Diffie-Hellman parameters
  • a private key
  • a self-certificate matching the private key for the OpenVPN server
  • an EasyRSA CA key and certificate
  • a TLS auth key from HMAC security

The OpenVPN server is started with the default run cmd of ovpn_run

The configuration is located in /etc/openvpn , and the Dockerfile declares that directory as a volume. It means that you can start another container with the -v argument, and access the configuration. The volume also holds the PKI keys and certs so that it could be backed up.

To generate a client certificate, kylemanna/openvpn uses EasyRSA via the easyrsa command in the container’s path. The EASYRSA_* environmental variables place the PKI CA under /etc/openvpn/pki .

Conveniently, kylemanna/openvpn comes with a script called ovpn_getclient , which dumps an inline OpenVPN client configuration file. This single file can then be given to a client for access to the VPN.

To enable Two Factor Authentication for clients (a.k.a. OTP) see this document.

We use tun mode, because it works on the widest range of devices. tap mode, for instance, does not work on Android, except if the device is rooted.

The topology used is net30 , because it works on the widest range of OS. p2p , for instance, does not work on Windows.

The UDP server uses 192.168.255.0/24 for dynamic clients by default.

The client profile specifies redirect-gateway def1 , meaning that after establishing the VPN connection, all traffic will go through the VPN. This might cause problems if you use local DNS recursors which are not directly reachable, since you will try to reach them through the VPN and they might not answer to you. If that happens, use public DNS resolvers like those of Google (8.8.4.4 and 8.8.8.8) or OpenDNS (208.67.222.222 and 208.67.220.220).

The Docker container runs its own EasyRSA PKI Certificate Authority. This was chosen as a good way to compromise on security and convenience. The container runs under the assumption that the OpenVPN container is running on a secure host, that is to say that an adversary does not have access to the PKI files under /etc/openvpn/pki . This is a fairly reasonable compromise because if an adversary had access to these files, the adversary could manipulate the function of the OpenVPN server itself (sniff packets, create a new PKI CA, MITM packets, etc).

  • The certificate authority key is kept in the container by default for simplicity. It’s highly recommended to secure the CA key with some passphrase to protect against a filesystem compromise. A more secure system would put the EasyRSA PKI CA on an offline system (can use the same Docker image and the script ovpn_copy_server_files to accomplish this).
  • It would be impossible for an adversary to sign bad or forged certificates without first cracking the key’s passphase should the adversary have root access to the filesystem.
  • The EasyRSA build-client-full command will generate and leave keys on the server, again possible to compromise and steal the keys. The keys generated need to be signed by the CA which the user hopefully configured with a passphrase as described above.
  • Assuming the rest of the Docker container’s filesystem is secure, TLS + PKI security should prevent any malicious host from using the VPN.
Читайте также:  Как установить double commander для linux

Benefits of Running Inside a Docker Container

The Entire Daemon and Dependencies are in the Docker Image

This means that it will function correctly (after Docker itself is setup) on all distributions Linux distributions such as: Ubuntu, Arch, Debian, Fedora, etc. Furthermore, an old stable server can run a bleeding edge OpenVPN server without having to install/muck with library dependencies (i.e. run latest OpenVPN with latest OpenSSL on Ubuntu 12.04 LTS).

It Doesn’t Stomp All Over the Server’s Filesystem

Everything for the Docker container is contained in two images: the ephemeral run time image (kylemanna/openvpn) and the $OVPN_DATA data volume. To remove it, remove the corresponding containers, $OVPN_DATA data volume and Docker image and it’s completely removed. This also makes it easier to run multiple servers since each lives in the bubble of the container (of course multiple IPs or separate ports are needed to communicate with the world).

Some (arguable) Security Benefits

At the simplest level compromising the container may prevent additional compromise of the server. There are many arguments surrounding this, but the take away is that it certainly makes it more difficult to break out of the container. People are actively working on Linux containers to make this more of a guarantee in the future.

Источник

Установка и настройка OpenVPN сервера с помощью docker-compose

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

OpenVPN одна из самых популярных программ для организации VPN туннеля, а docker-compose отличный инструмент для установки и настройки программ с помощью одного docker-compose.yml файла.

В статье я расскажу как быстро и просто настроить OpenVPN сервер на собственном VPS используя docker-compose. За основу возьмем образ kylemanna/docker-openvpn .

Заинтересовавшихся прошу под кат.

Установка OpenVPN сервера

Итак, для работы нам понадобятся: собственный VPS сервер, установленный docker и docker-compose.

Создаем новый docker-compose.yml

Копируем следующие строчки в созданный docker-compose.yml

Меняем на путь где OpenVPN будет хранить свои настройки, у меня это /home/administrator/openvpn/ .

Docker-compose файл готов. Запустим следующие команды для инициализации OpenVPN и создания сертификата сервера. Замените на адрес вашего сервера,
это может быть как IP адрес (10.10.10.8), так и доменное имя (vpn.server.com).

Во время генерации сертификата введите контрольную фразу (Enter PEM pass phrase) и имя сертификата (Common Name).

Советую не забывать контрольную фразу, т.к. она понадобится на следующем шаге при создании клиентских сертификатов.

Генерирование сертификата обычно занимает некоторое время, так что откиньтесь на спинку стула и расслабьтесь.

Когда сертификат готов, можно запускать наш OpenVPN сервер.

Создание клиентских сертификатов

Чтобы соединиться с вашим OpenVPN сервером понадобится клиентский сертификат.

Для создания клиентского сертификата используем следующую команду:

Читайте также:  Radeon hd 6650m windows 10 driver

Не забываем заменить на имя клиента, например my_phone.

Во время создания сертификата вас попросят ввести контрольную фразу (Enter passpharse) из предыдущего шага.

Если вы хотите максимальной безопасности, рекомендую убрать опцию nopass из предыдущей команды, чтобы назначить клиентскому сертификату контрольную фразу.

Когда клиентский сертификат сгенерирован давайте экспортируем его в .ovpn файл и отправим клиенту

На этом все, надеюсь кому-то это статья поможет вновь ощутить свободу в интернете.

Дополнительную информацию вы можете найти на официальном сайте образа kylemanna/docker-openvpn.

Источник

Docker linux server openvpn as

Out of the box stateless openvpn server docker image which starts in just a few seconds and doesn’t require presistent storage. To get it running, just copy & paste the snippet below and follow instructions in your terminal:

To get more detailed information, go to Quick Start tutorial or watch video.

Tag Description
latest This tag is added to every newly built version be that v#.#.# or v#.#.#-regen-dh
v#.#.# Standard fixed release version, where <1>is major version, <2>— minor and <3>is a patch. For instance, v1.1.0
v#.#.#-regen-dh Release version with newly generated Deffie Hellman security file. In order to keep security high this version is generated every hour. Tag example — v1.1.0-regen-dh
dev Development build which contains the most recent changes from the active development branch (master)

After container was run using docker run command, it’s possible to execute additional commands using docker exec command. For example, docker exec ./version.sh . See table below to get the full list of supported commands.

Command Description Parameters Example
./version.sh Outputs full container version, i.e Dockovpn v1.2.0 docker exec dockovpn ./version.sh
./genclient.sh Generates new client configuration z — Optional. Puts newly generated client.ovpn file into client.zip archive.

zp paswd — Optional. Puts newly generated client.ovpn file into client.zip archive with password pswd

o — Optional. Prints cert to the output.

oz — Optional. Prints zipped cert to the output. Use with output redirection.

ozp paswd — Optional. Prints encrypted zipped cert to the output. Use with output redirection.

docker exec dockovpn ./genclient.sh

docker exec dockovpn ./genclient.sh z

docker exec dockovpn ./genclient.sh zp 123

docker exec dockovpn ./genclient.sh o > client.ovpn

docker exec dockovpn ./genclient.sh oz > client.zip

docker exec dockovpn ./genclient.sh ozp paswd > client.zip

  1. Any hardware or vps/vds server running Linux. You should have administrative rights on this machine.
  2. Docker installation on your server.
  3. Public ip address assigned to your server.

1. Run docker-openvpn

Copy & paste the following command to run docker-openvpn:

⚠️ Note: This snippet runs Dockovpn in attached mode, which means if you close your terminal window, container will be stopped. To prevent this from happening, you first need to detach container from ssh session. Type Ctrl+P Ctrl+Q .

If everything went well, you should be able to see the following output in your console:

2. Get client configuration

Now, when your docker-openvpn is up and running you can go to :8080 on your device and download ovpn client configuration. As soon as you have your config file downloaded, you will see the following output in the console:

Import client.ovpn into your favourite openvpn client. In most cases it should be enough to just doubleclick or tap on that file.

3. Connect to your docker-openvpn container

You should be able to see your newly added client configuration in the list of available configurations. Click on it, connection process should initiate and be established withing few seconds.

Congratulations, now you’re all set and can safely browse the internet.

There’s a possibility to persist generated files in volume storage. Run docker with

Alternative way. Run with docker-compose

Sometimes it is more convinient to use docker-compose.

To run docker-openvpn with docker-compose run:

After run this command you can find your client.ovpn inside openvpn_conf folder.

About

🔐 Out of the box stateless openvpn-server docker image which starts in less than 2 seconds

Источник

Оцените статью