Поиск по сайту:

Как запустить 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 в терминале и найти интерфейс OpenVPN tunX при подключении.

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

    Заключение

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

    Репозиторий исходного кода docker-openvpn доступен для просмотра кода, а также для разветвления модификаций. Запросы на получение общих функций или исправлений ошибок приветствуются.

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

    Сообщайте об ошибках в систему отслеживания проблем docker-openvpn.