Как запустить OpenVPN в контейнере Docker в Ubuntu 14.04
Введение
В этом руководстве объясняется, как настроить и запустить Docker.
OpenVPN предоставляет способ создания виртуальных частных сетей (VPN) с использованием шифрования TLS (эволюция SSL). OpenVPN защищает сетевой трафик от прослушивания и атак типа «человек посередине» (MITM). Частную сеть можно использовать для безопасного подключения устройства, например ноутбука или мобильного телефона, работающего в незащищенной сети Wi-Fi, к удаленному серверу, который затем передает трафик в Интернет. Частные сети также можно использовать для безопасного подключения устройств друг к другу через Интернет.
Docker предоставляет способ инкапсулировать процесс сервера OpenVPN и данные конфигурации, чтобы им было легче управлять. образ Docker OpenVPN предварительно создан и включает в себя все необходимые зависимости для запуска сервера в нормальном и стабильном окружении. Сценарии включены для значительной автоматизации стандартного варианта использования, но при желании позволяют выполнить полную ручную настройку. контейнер тома Docker также используется для хранения конфигурации и данных сертификата EasyRSA PKI.
Надежная сборка. Когда код обновляется в репозитории GitHub, создается новый образ Docker, который публикуется в реестре Docker.
Примеры использования
- Безопасный маршрут к Интернету в ненадежных общедоступных сетях (WiFi)
- Частная сеть для подключения мобильного ноутбука, офисного компьютера, домашнего ПК или мобильного телефона.
- Частная сеть для безопасных служб за маршрутизаторами NAT, которые не имеют возможности обхода NAT
Цели
- Настройка демона Docker в Ubuntu 14.04 LTS
- Настройте контейнер томов Docker для хранения данных конфигурации.
- Создайте центр сертификации (ЦС) EasyRSA PKI
- Извлечение автоматически созданных файлов конфигурации клиента
- Настройте выбранное количество клиентов OpenVPN
- Обработка запуска контейнера Docker при загрузке
- Представьте дополнительные темы
Предпосылки
- Знание оболочки Linux. В этом руководстве предполагается, что пользователь может настраивать и запускать демоны Linux в традиционном смысле
- Корневой доступ на удаленном сервере
- Для этого руководства предполагается дроплет DigitalOcean с 1 ЦП и 512 МБ ОЗУ под управлением Ubuntu 14.04. Docker упрощает запуск образа на любом дистрибутиве Linux.
- Любой виртуальный хост будет работать, если на хосте работает технология виртуализации QEMU/KVM или Xen; OpenVZ не будет работать
- Вам потребуется root-доступ на сервере. В этом руководстве предполагается, что пользователь работает как непривилегированный пользователь с включенным sudo. При необходимости просмотрите руководство Digital Ocean по управлению пользователями в Ubuntu 14.04
Шаг 1 — Настройте и протестируйте Docker
Docker развивается быстро, а политика долгосрочной поддержки Ubuntu (LTS) не поспевает за ним. Чтобы обойти это, мы установим PPA, который предоставит нам последнюю версию Docker.
Добавьте ключ подписи пакета вышестоящего репозитория Docker. Команда
apt-key
использует повышенные привилегии черезsudo
, поэтому может появиться запрос на ввод пароля пользователя: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 как обычный пользователь, гдеsammy
— ваше имя пользователя. Выйдите и войдите снова, чтобы новая группа вступила в силу:sudo usermod -aG docker sammy
После повторного входа проверьте членство в группе с помощью команды
id
. Ожидаемый ответ должен включатьdocker
, как в следующем примере:uid=1001(test0) gid=1001(test0) groups=1001(test0),27(sudo),999(docker)
Необязательно: запустите
bash
в простом образе Debian Docker (--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
, чтобы упростить копирование и вставку. Установите это на все, что вам нравится. Значение по умолчаниюovpn-data
рекомендуется для отдельных серверов-контейнеров OpenVPN Docker. Установка переменной в оболочке использует подстановку строк, чтобы пользователь не заменял ее вручную для каждого шага в руководстве:OVPN_DATA="ovpn-data"
Создайте пустой контейнер тома Docker, используя
busybox
в качестве минимального образа Docker:docker run --name $OVPN_DATA -v /etc/openvpn busybox
Инициализируйте контейнер
$OVPN_DATA
, в котором будут храниться файлы конфигурации и сертификаты, и заменитеvpn.example.com
на ваше полное доменное имя. Значениеvpn.example.com
должно быть полным доменным именем, которое вы используете для связи с сервером. Это предполагает, что настройки DNS уже настроены. В качестве альтернативы можно использовать только 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 по умолчанию используют парольную фразу для ключа CA для повышения безопасности и предотвращения выдачи поддельных сертификатов.Подробнее о резервном копировании хранилища сертификатов см. в Заключении ниже.
Шаг 3 — Запустите сервер OpenVPN
Чтобы автоматически запустить контейнер Docker, который запускает серверный процесс OpenVPN (см. Файл инициализации 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, который мы создали на последнем шаге.
Обязательно замените
CLIENTNAME
соответствующим образом (это не обязательно должно быть полное доменное имя). Имя клиента используется для идентификации машины, на которой работает клиент OpenVPN (например, «домашний ноутбук», «рабочий ноутбук», «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 через собственный OpenVPN
На клиентах 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
Arch Linux через собственный OpenVPN
Установите OpenVPN:
pacman -Sy openvpn
Скопируйте файл конфигурации клиента с сервера и установите безопасные разрешения:
sudo install -o root -m 400 CLIENTNAME.ovpn /etc/openvpn/CLIENTNAME.conf
Запустите серверный процесс клиента OpenVPN:
systemctl start openvpn@CLIENTNAME
Необязательно: настройте systemd для запуска
/etc/openvpn/CLIENTNAME.conf
при загрузке:systemctl enable openvpn@CLIENTNAME
MacOS X через TunnelBlick
Загрузите и установите TunnelBlick.
Скопируйте
CLIENTNAME.ovpn
с сервера на Mac.Импортируйте конфигурацию, дважды щелкнув файл
*.ovpn
, скопированный ранее. Будет запущен TunnelBlick и импортирована конфигурация.Откройте TunnelBlick, выберите конфигурацию, а затем выберите подключение.
Android через OpenVPN Connect
Установите приложение OpenVPN Connect из магазина Google Play.
Скопируйте
CLIENTNAME.ovpn
с сервера на устройство Android безопасным способом. Карты USB или microSD более безопасны. Поместите файл на SD-карту, чтобы облегчить его открытие.Импорт конфигурации: Меню -> Импорт -> Импорт профиля с SD-карты
Выберите подключение.
Шаг 6 — Проверка работы
Есть несколько способов убедиться, что трафик маршрутизируется через VPN.
Веб-браузер
Посетите веб-сайт, чтобы определить внешний IP-адрес. Внешний IP-адрес должен быть адресом сервера OpenVPN.
Попробуйте 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
в терминале и найти интерфейс OpenVPNtunX
при подключении.Просмотрите журналы. В системах Unix проверьте
/var/log
в старых дистрибутивах илиjournalctl
в дистрибутивах systemd.Заключение
Образ Docker, созданный для запуска, имеет открытый исходный код и способен на гораздо больше, чем описано здесь.
Репозиторий исходного кода docker-openvpn доступен для просмотра кода, а также для разветвления модификаций. Запросы на получение общих функций или исправлений ошибок приветствуются.
Дополнительные темы, такие как резервное копирование и статические IP-адреса клиентов, обсуждаются в папке docker-openvpn/docs.
Сообщайте об ошибках в систему отслеживания проблем docker-openvpn.