Запуск OpenVPN в контейнере Docker в Ubuntu 14.04

Данное руководство поможет установить и запустить контейнер OpenVPN с помощью Docker.

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

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

Docker Registry – это центральное хранилище официальных и пользовательских образов Докер. В данном руководстве используется пользовательский образ, доступный на kylemanna/openvpn.

Контейнер OpenVPN обеспечивает:

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

Данное руководство поможет:

  • Установить демон Docker на Ubuntu 14.04 LTS.
  • Добавить том Docker для хранения данных и конфигураций.
  • Сгенерировать сертификат EasyRSA PKI.
  • Извлечь автоматически сгенерированные файлы конфигурации клиента
  • Настроить необходимое количества клиентов OpenVPN.
  • Настроить автозапуск контейнера Docker.

Требования

  • Базовые навыки работы в Linux.
  • Предварительно настроенный сервер Ubuntu 14.04 (1 CPU, 512 MB RAM минимум).
  • Root-доступ к удалённому серверу; рекомендуется создать пользователя с доступом к sudo.
  • Виртуализация QEMU/KVM или Xen. OpenVZ не подходит.
  • Локальное клиентское устройство: смартфон, ноутбук, ПК.

Примечание: Клиенты OpenVPN поддерживают почти все операционные системы.

1: Установка и тестирование Docker

Проект Docker быстро развивается, и в репозитории Ubuntu LTS находится уже устаревшая версия. Чтобы получить актуальную версию Docker, нужно установить PPA.

Сначала нужно добавить ключ репозитория Docker:

curl -L https://get.docker.com/gpg | sudo apt-key add -

Примечание: Введите пароль текущего пользователя.

Добавьте репозиторий 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 8host

Примечание: Замените условное имя пользователя 8host именем вашего пользователя.

Выйдите и снова войдите, чтобы обновить настройки.

После этого убедитесь, что пользователь добавлен в группу docker. Для этого используйте команду id. В выводе команды должна быть группа docker:

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

Опционально: Чтобы убедиться, что Docker работает на хосте, запустите bash в простом образе Debian (–rm очистит контейнер после выхода, -it запустит интерактивный режим).

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

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

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@<container id>:/#

Чтобы убедиться, что это не командная строка системы, попробуйте запросить версию Debian:

cat /etc/issue.net

Контейнер OpenVPN должен вернуть:

Debian GNU/Linux jessie/sid

Примечание: Версия Debian может отличаться.

Чтобы покинуть контейнер и вернуться на хост, введите logout.

2: Сертификация EasyRSA PKI

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

Создайте том данных. В руководстве используется переменная среды $OVPN_DATA, которая упростит процедуры копирования и вставки данных. Выберите любое значение для этой переменной (для одного контейнера OpenVPN рекомендуется установить значение ovpn-data).

OVPN_DATA="ovpn-data"

Создайте пустой том Docker с помощью busybox:

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

Инициализируйте контейнер $OVPN_DATA, который будет хранить конфигурационные файлы и сертификаты

Примечание: Замените vpn.example.com своим FQDN или IP-адресом сервера.

docker run --volumes-from $OVPN_DATA --rm kylemanna/openvpn ovpn_genconfig -u udp://vpn.example.com:1194

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

docker run --volumes-from $OVPN_DATA --rm -it kylemanna/openvpn ovpn_initpki

Примечание: Безопасность контейнера $OVPN_DATA крайне важна. В нём хранятся все закрытые ключи сертификатов. Стандартные сценарии OpenVPN используют пароль ЦС для повышения уровня безопасности и предотвращения выдачи фиктивных сертификатов.

3: Запуск сервера OpenVPN

Чтобы автоматически запустить контейнер Docker, в котором запускается процесс сервера OpenVPN, создайте init-файл Upstart:

sudo vim /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

Запустите процесс:

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.

Вместо CLIENTNAME укажите имя клиента (не FQDN). имя клиента должно описывать машину, на которой работает клиент OpenVPN (например, home-laptop, my –laptop, nexus5 и т.п.).

Инструмент easyrsa запросит пароль ЦС (который был указан в команде ovpn_initpki). Создайте клиентский сертификат:

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

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

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

Примечание: Замените CLIENTNAME именем клиента.

docker run –volumes-from $OVPN_DATA –rm kylemanna/openvpn ovpn_getclient CLIENTNAME > CLIENTNAME.ovpn

В результате получится файл CLIENTNAME.ovpn, который содержит закрытые ключи и сертификаты, необходимые для подключения к VPN.

Важно! Храните эти файлы в безопасности.

Теперь нужно передать файлы .ovpn клиентам. Поскольку файлы содержат конфиденциальные данные, их нельзя передавать по незащищённым соединениям с помощью общедоступных сервисов (электронной почты, облачного хранилища и т.п.). Для передачи файлов рекомендуется использовать ssh/scp, HTTPS, USB или microSD.

5: Настройка клиентов OpenVPN

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

Дистрибутивы Ubuntu и Debian

Данные инструкции предназначены для Ubuntu 12.04/14.04 и Debian wheezy/jessie (и других подобных дистрибутивов).

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

sudo apt-get install openvpn

Скопируйте конфигурационный файл клиента с сервера и установите ограниченный доступ:

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

Настройте автозапуск всех конфигураций в файлах /etc/openvpn/*.conf:

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

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

sudo /etc/init.d/openvpn restart

MacOS X и TunnelBlick

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

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

Импортируйте конфигурации, дважды щелкнув по скопированному файлу * .ovpn. Tunnelblick запустится и импортирует конфигурации.

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

Android и OpenVPN Connect

Установите приложение OpenVPN Connect с Google Play.

Скопируйте файл CLIENTNAME.ovpn с сервера на Android. Выберите безопасный метод копирования: USB, microSD и т.п.

Импортируйте конфигурации: Menu -> Import -> Import Profile from SD card. Нажмите connect.

6: Тестирование настройки

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

Веб-браузер

Откройте один из сайтов:

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

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

В командной строке можно использовать wget или curl:

curl icanhazip.com
wget -qO - icanhazip.com

Также можно выполнить поиск DNS на специально настроенном сервере DNS только для этой цели с помощью host или dig:

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

или

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

Команда должна вернуть IP-адрес сервера OpenVPN.

Дополнительная проверка

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

Кроме того, нужно просматривать логи: /var/log и journalctl (в дистрибутивах systemd).

Заключение

Данное руководство охватывает основы работы с образом Docker.

Код в репозитории docker-openvpn можно просмотреть. Также вы можете создать новую ветку и опубликовать усовершенствованную версию кода.

Tags: , ,

2 комментария

Добавить комментарий