Как запустить OpenVPN в Docker-контейнере в Ubuntu 14.04

Вступление

В этом руководстве объясняется, как настроить и запустить контейнер OpenVPN с помощью https://docker.com [Docker].

OpenVPN предоставляет способ создания виртуальных частных сетей (VPN) с использованием шифрования TLS (эволюция SSL). OpenVPN защищает сетевой трафик от перехватов и атак типа «человек посередине» (MITM). Частная сеть может использоваться для безопасного подключения устройства, такого как ноутбук или мобильный телефон, работающий в незащищенной сети Wi-Fi, к удаленному серверу, который затем передает трафик в Интернет. Частные сети также можно использовать для безопасного подключения устройств друг к другу через Интернет.

Docker предоставляет способ инкапсуляции данных процесса и конфигурации сервера OpenVPN, чтобы им было легче управлять. Docker OpenVPN image предварительно собран и включает в себя все необходимые зависимости для запуска сервера в нормальной и стабильной среде. Сценарии включены для существенной автоматизации стандартного варианта использования, но все же позволяют при желании выполнить полную ручную настройку. Docker volume container используется для хранения конфигурации и данных сертификата EasyRSA PKI.

Docker Registry - центральный репозиторий как для официальных, так и для пользовательских образов Docker. Изображение, используемое в этом руководстве, является добавленным пользователем изображением, доступным по адресу kylemanna/openvpn. Образ собран на серверах облачной сборки Docker Registry с использованием источника из репозитория GitHub. Сборка облачного сервера, связанная с Github, добавляет возможность аудита образа Docker, чтобы пользователи могли просматривать исходный файл Dockerfile и связанный с ним код, называемый http://blog.docker.com/2013/11/introduction-trusted-builds/ [ Trusted Build. Когда код обновляется в репозитории GitHub, новый образ Docker создается и публикуется в реестре Docker.

Примеры использования

  • Безопасный маршрут к Интернету в ненадежных общественных сетях (WiFi)

  • Частная сеть для подключения мобильного ноутбука, офисного компьютера, домашнего ПК или мобильного телефона

  • Частная сеть для защищенных служб за маршрутизаторами NAT, которые не имеют возможности обхода NAT

цели

  • Установите демон Docker в Ubuntu 14.04 LTS

  • Настройте Docker volume container для хранения данных конфигурации

  • Создайте центр сертификации EasyRSA PKI (CA)

  • Извлечь автоматически сгенерированные файлы конфигурации клиента

  • Настройте выбранное количество клиентов OpenVPN

  • Ручка запуска контейнера Docker при загрузке

  • Представьте продвинутые темы

Предпосылки

  • Знание оболочки Linux. В этом руководстве в основном предполагается, что пользователь способен устанавливать и запускать демоны Linux в традиционном смысле

  • Корневой доступ на удаленном сервере

  • Для этого урока предполагается DigitalOcean 1 CPU / 512 МБ Droplet RAM под управлением Ubuntu 14.04. Docker облегчает запуск образа на любом хосте дистрибутива Linux

  • Любой виртуальный хост будет работать до тех пор, пока на нем работает технология виртуализации QEMU / KVM или Xen; * OpenVZ не будет работать *

  • Вам понадобится root-доступ на сервере. В этом руководстве предполагается, что пользователь работает как непривилегированный пользователь с включенным sudo. Прочтите Digital Ocean учебное пособие по управлению пользователями в Ubuntu 14.04 если нужно

  • Локальное клиентское устройство, такое как телефон Android, ноутбук или ПК. Почти все операционные системы поддерживаются через различные клиенты OpenVPN

Шаг 1 - Настройка и тестирование Docker

Docker движется быстро, и политика долгосрочной поддержки (LTS) Ubuntu не выдерживает. Чтобы обойти это, мы установим PPA, который предоставит нам последнюю версию Docker.

Добавьте исходный ключ подписи пакета репозитория Docker. Команда + apt-key использует повышенные привилегии через` + sudo`, su может появиться запрос пароля для пароля пользователя:

curl -L https://get.docker.com/gpg | sudo apt-key add -
  • Примечание: * При необходимости введите свой пароль sudo мигающим курсором.

Добавьте вышестоящий Docker-репозиторий в системный список:

echo deb http://get.docker.io/ubuntu docker main | sudo tee /etc/apt/sources.list.d/docker.list

Обновите список пакетов и установите пакет Docker:

sudo apt-get update && sudo apt-get install -y lxc-docker

Добавьте вашего пользователя в группу + docker +, чтобы включить связь с демоном Docker как обычный пользователь, где ++ - ваше имя пользователя. * Выйдите и войдите снова, чтобы новая группа вступила в силу *:

sudo usermod -aG docker

После * повторного входа в систему * проверьте членство в группе с помощью команды + id +. Ожидаемый ответ должен включать + docker +, как в следующем примере:

uid=1001(test0) gid=1001(test0) groups=1001(test0),27(sudo),999(docker)

Необязательно: Запустите + bash + в простом образе Docker Debian (+ - rm + для очистки контейнера после выхода и + -it + для интерактивного), чтобы проверить работу Docker на хосте:

docker run --rm -it debian:jessie bash -l

Ожидаемый ответ от докера, когда он извлекает изображения и устанавливает контейнер:

Unable to find image 'debian:jessie' locally
debian:jessie: The image you are pulling has been verified
511136ea3c5a: Pull complete
36fd425d7d8a: Pull complete
aaabd2b41e22: Pull complete
Status: Downloaded newer image for debian:jessie
root@de8ffd8f82f6:/#

Оказавшись внутри контейнера, вы увидите приглашение + root @: / # +, означающее, что текущая оболочка находится в контейнере Docker. Чтобы убедиться, что он отличается от хоста, проверьте версию Debian, запущенную в контейнере:

cat /etc/issue.net

Ожидаемый ответ для контейнера OpenVPN на момент написания:

Debian GNU/Linux jessie/sid

Если вы видите другую версию Debian, это нормально.

Выйдите из контейнера, набрав + logout +, и приглашение хоста должно появиться снова.

Шаг 2. Настройка хранилища сертификатов EasyRSA PKI

Этот шаг обычно является головной болью для тех, кто знаком с OpenVPN или любыми сервисами, использующими PKI. К счастью, Docker и сценарии в образе Docker упрощают этот шаг, генерируя файлы конфигурации и все необходимые нам файлы сертификатов.

Создайте контейнер объема. В этом руководстве будет использоваться переменная окружения ++, чтобы сделать ее удобной для копирования и вставки. Установите это на что угодно. Значение по умолчанию + ovpn-data + рекомендуется для отдельных серверов-контейнеров OpenVPN Docker. Установка переменной в оболочке использует подстановку строк, чтобы избавить пользователя от замены вручную для каждого шага в учебнике:

="ovpn-data"

Создайте пустой контейнер тома Docker, используя + busybox + в качестве минимального образа Docker:

docker run --name  -v /etc/openvpn busybox

Инициализируйте контейнер `, который будет содержать файлы конфигурации и сертификаты, и замените ` на ваше полное доменное имя. Значение ++ должно быть полным доменным именем, которое вы используете для связи с сервером. Это предполагает, что DNS settings уже настроены. Кроме того, можно использовать только IP-адрес сервера, но это не рекомендуется.

docker run --volumes-from  --rm kylemanna/openvpn ovpn_genconfig -u udp://:1194

Создайте центр сертификации EasyRSA PKI. Вам будет предложено ввести ключевую фразу для закрытого ключа CA. Выберите хороший и запомните это; без ключевой фразы невозможно выдать и подписать клиентские сертификаты:

docker run --volumes-from  --rm -it kylemanna/openvpn ovpn_initpki
  • Обратите внимание, безопасность контейнера ++ важна. * Он содержит все закрытые ключи для олицетворения сервера и все клиентские сертификаты. Помните об этом и контролируйте доступ соответствующим образом. Сценарии OpenVPN по умолчанию используют ключевую фразу для ключа CA для повышения безопасности и предотвращения выдачи поддельных сертификатов.

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

Шаг 3 - Запустите сервер OpenVPN

Чтобы автоматически запустить Docker-контейнер, который запускает процесс сервера OpenVPN (см. Https://docs.docker.com/articles/host_integration/[Docker Host Integration для получения дополнительной информации]), создайте https://www.digitalocean.com/community/tutorials Файл инициализации [upstart] / upstart-event-system-what-it-and-how-to-it-it [Upstart], использующий + nano + или + vim +:

sudo vim /etc/init/docker-openvpn.conf

Содержимое для размещения в + / etc / init / docker-openvpn.conf +:

description "Docker container for OpenVPN server"
start on filesystem and started docker
stop on runlevel [!2345]
respawn
script
 exec docker run --volumes-from ovpn-data --rm -p 1194:1194/udp --cap-add=NET_ADMIN kylemanna/openvpn
end script

Запустите процесс, используя механизм инициализации Upstart:

sudo start docker-openvpn

Убедитесь, что контейнер запустился и сразу не рухнул, посмотрев столбец + STATUS:

test0@tutorial0:~$ docker ps
CONTAINER ID        IMAGE                      COMMAND             CREATED             STATUS              PORTS                    NAMES
c3ca41324e1d        kylemanna/openvpn:latest   "ovpn_run"          2 seconds ago       Up 2 seconds        0.0.0.0:1194->1194/udp   focused_mestorf

Шаг 4 - Генерация клиентских сертификатов и файлов конфигурации

В этом разделе мы создадим сертификат клиента с использованием PKI CA, который мы создали на последнем шаге.

Обязательно замените ++ соответствующим образом (это не обязательно должно быть полное доменное имя). Имя клиента используется для идентификации машины, на которой работает клиент OpenVPN (например, «домашний ноутбук», «рабочий ноутбук», «nexus5» и т. Д.).

Инструмент + easyrsa + запросит пароль CA. Это пароль, который мы установили выше во время команды + ovpn_initpki +. Создайте сертификат клиента:

docker run --volumes-from  --rm -it kylemanna/openvpn easyrsa build-client-full  nopass

После того, как каждый клиент создан, сервер готов принимать соединения.

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

docker run --volumes-from  --rm kylemanna/openvpn ovpn_getclient  > .ovpn

Получающийся файл + .ovpn + содержит закрытые ключи и сертификаты, необходимые для подключения к VPN. * Храните эти файлы в безопасности и не оставляйте их на месте. * Вам необходимо безопасно транспортировать файлы + *. Ovpn + клиентам, которые будут их использовать. Избегайте использования общедоступных сервисов, таких как электронная почта или облачное хранилище, если это возможно, при передаче файлов из соображений безопасности.

Рекомендуются следующие способы передачи: карты ssh / scp, HTTPS, USB и microSD, если они доступны.

Шаг 5 - Настройка клиентов OpenVPN

Ниже приведены команды или операции, выполняемые на клиентах, которые будут подключаться к серверу OpenVPN, настроенному выше.

Дистрибутивы Ubuntu и Debian через собственный OpenVPN

В клиентах Ubuntu 12.04 / 14.04 и Debian wheezy / jessie (и аналогичных):

Установите OpenVPN:

sudo apt-get install openvpn

Скопируйте файл конфигурации клиента с сервера и установите безопасные разрешения:

sudo install -o root -m 400 .ovpn /etc/openvpn/.conf

Сконфигурируйте сценарии инициализации для автоматического запуска всех конфигураций, соответствующих + / etc / openvpn / *. Conf +:

echo AUTOSTART=all | sudo tee -a /etc/default/openvpn

Перезапустите серверный процесс клиента OpenVPN:

sudo /etc/init.d/openvpn restart

Arch Linux через нативный OpenVPN

Установите OpenVPN:

pacman -Sy openvpn

Скопируйте файл конфигурации клиента с сервера и установите безопасные разрешения:

sudo install -o root -m 400 .ovpn /etc/openvpn/.conf

Запустите процесс сервера клиента OpenVPN:

systemctl start openvpn@

Необязательно: настройте systemd для запуска + / etc / openvpn / .conf + при загрузке:

systemctl enable openvpn@

MacOS X через TunnelBlick

Загрузите и установите TunnelBlick.

Скопируйте + .ovpn + с сервера на Mac.

Импортируйте конфигурацию, дважды щелкнув ранее скопированный файл + *. Ovpn +. TunnelBlick будет вызван и импортировать конфигурацию.

Откройте TunnelBlick, выберите конфигурацию, а затем выберите * connect *.

Android через OpenVPN Connect

Установите OpenVPN Connect App из магазина Google Play.

Скопируйте + .ovpn + с сервера на устройство Android безопасным способом. USB или microSD карты безопаснее. Поместите файл на SD-карту, чтобы облегчить его открытие.

Импорт конфигурации: * Меню * → * Импорт * → * Импорт профиля с SD-карты *

Выберите * подключить *.

Шаг 6 - Проверьте операцию

Есть несколько способов проверить, что трафик направляется через VPN.

Веб-браузер

Посетите веб-сайт, чтобы определить внешний IP-адрес. Внешний IP-адрес должен быть адресом сервера OpenVPN.

Попробуйте Google «что такое мой ip» или https://icanhazip.com [icanhazip.com].

Командная строка

Из командной строки пригодятся + wget + или + curl +. Пример с + curl +:

curl icanhazip.com

Пример с + wget +:

wget -qO - icanhazip.com

Ожидаемый ответ должен быть IP-адрес сервера OpenVPN.

Другой вариант - сделать специальный поиск DNS на специально настроенном DNS-сервере, просто для этой цели используя + host + или + dig +. Пример использования + host +:

host -t A myip.opendns.com resolver1.opendns.com

Пример с + dig +:

dig +short myip.opendns.com @resolver1.opendns.com

Ожидаемый ответ должен быть IP-адрес сервера OpenVPN.

Дополнительные вещи для проверки

Проверьте конфигурацию сетевого интерфейса. В операционных системах на основе Unix это так же просто, как запустить + ifconfig + в терминале и искать интерфейс OpenVPN + tunX +, когда он подключен.

Просмотрите логи. В системах Unix проверьте + / var / log + в старых дистрибутивах или + journalctl + в дистрибутивах systemd.

Заключение

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

Https://github.com/kylemanna/docker-openvpn[docker-openvpn исходный репозиторий] доступен для просмотра кода, а также для разветвления изменений. Запросы на извлечение общих функций или исправления ошибок приветствуются.

Дополнительные темы, такие как * резервное копирование * и * статические IP-адреса клиентов *, обсуждаются в папке docker-openvpn/docs.

Related