Данное руководство поможет установить и запустить контейнер 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 можно просмотреть. Также вы можете создать новую ветку и опубликовать усовершенствованную версию кода.