Настройка OpenVPN-сервера с веб-интерфейсом в Docker

  • Михаил
  • 8 мин. на прочтение
  • 10
  • 22 Apr 2023
  • 22 Apr 2023

OpenVPN — это широко распространённое, безопасное и гибкое решение для создания виртуальных частных сетей (VPN). Оно позволяет объединять удалённые компьютеры в единую защищённую сеть, шифруя весь трафик между ними. OpenVPN работает поверх протоколов UDP или TCP, поддерживает аутентификацию по сертификатам, логину/паролю и может использоваться для:

  • обеспечения безопасного доступа сотрудников к корпоративным ресурсам из дома;
  • защиты соединения в общественных Wi-Fi сетях;
  • объединения нескольких офисов в одну сеть.

В отличие от многих коммерческих VPN-сервисов, OpenVPN является полностью бесплатным и открытым. Вы можете развернуть собственный сервер на своём оборудовании или в облаке, получив полный контроль над данными и неограниченное количество одновременных подключений.

Однако ручное управление сертификатами и конфигурациями может быть сложным для новичков. Именно поэтому мы дополним OpenVPN удобным веб-интерфейсом, который позволит создавать клиентов, скачивать конфигурации и отслеживать статус сервера в несколько кликов.

В этой статье мы пошагово развернём OpenVPN-сервер с веб-панелью на базе Docker — самой популярной платформе контейнеризации. Всё будет работать в двух контейнерах:

kylemanna/openvpn — проверенный, стабильный образ самого сервера OpenVPN (более 10 млн загрузок).

d3vilh/openvpn-ui — современный веб-интерфейс для управления сервером.


Предварительные требования

  1. Сервер под управлением Linux (Ubuntu, Debian, CentOS, Fedora и т.д.) с доступом в интернет.
  2. Установленный Docker и Docker Compose (достаточно Docker Engine, Compose не обязателен, но удобен).
  3. Публичный IP-адрес сервера (или домен, указывающий на него).
  4. Открытые порты в фаерволе: 1194/udp (для VPN) и 8072/tcp (для веб-интерфейса).

Проверьте, загружен ли модуль ядра tun (необходим для работы VPN):

lsmod | grep tun

Если пусто, загрузите модуль и добавьте в автозагрузку:

sudo modprobe tun
echo "tun" | sudo tee -a /etc/modules-load.d/tun.conf

Включите IP-форвардинг (маршрутизацию), чтобы клиенты могли выходить в интернет через VPN:

sudo sysctl -w net.ipv4.ip_forward=1
echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf

Пошаговая установка

1. Очистка старых контейнеров (если есть)

Чтобы избежать конфликтов, остановите и удалите все контейнеры, связанные с OpenVPN:

docker stop openvpn openvpn-server openvpn-ui 2>/dev/null
docker rm openvpn openvpn-server openvpn-ui 2>/dev/null

2. Создание Docker-тома для данных

Том будет хранить все сертификаты, ключи и конфигурации. Данные не пропадут при пересоздании контейнеров.

docker volume create ovpn-data

3. Генерация базовой конфигурации сервера

Укажите ваш публичный IP-адрес или домен, который будут использовать клиенты для подключения. Например, vpn.example.com или 203.0.113.10.

docker run -v ovpn-data:/etc/openvpn --rm kylemanna/openvpn ovpn_genconfig -u udp://ВАШ_IP_ИЛИ_ДОМЕН

4. Добавление management-интерфейса (необходим для веб-панели)

Веб-интерфейс d3vilh/openvpn-ui подключается к OpenVPN через специальный management-порт (по умолчанию 2080). Добавим эту опцию в конфигурацию:

docker run -v ovpn-data:/etc/openvpn --rm alpine sh -c "echo 'management 127.0.0.1 2080' >> /etc/openvpn/openvpn.conf"

5. Инициализация PKI (создание центра сертификации)

Этот шаг создаст корневой сертификат (CA), серверный сертификат и ключи. Вам будет предложено придумать пароль CA — запишите его, он понадобится при создании клиентов.

docker run -v ovpn-data:/etc/openvpn --rm -it kylemanna/openvpn ovpn_initpki

Следуйте инструкциям:

  • На запрос Enter New CA Key Passphrase: введите пароль и подтвердите.
  • На Common Name (eg: your user, host, or server name) [Easy-RSA CA]: можно просто нажать Enter.
  • На запрос Enter pass phrase for /etc/openvpn/pki/private/ca.key: введите тот же пароль.

6. Запуск OpenVPN-сервера

docker run -d \
  --name openvpn \
  --restart unless-stopped \
  --cap-add=NET_ADMIN \
  --device /dev/net/tun \
  -p 1194:1194/udp \
  -v ovpn-data:/etc/openvpn \
  kylemanna/openvpn

Проверьте, что контейнер запустился:

docker ps | grep openvpn

7. Запуск веб-интерфейса

docker run -d \
  --name openvpn-ui \
  --restart unless-stopped \
  --cap-add NET_ADMIN \
  --privileged \
  -p 8072:8080/tcp \
  -e OPENVPN_ADMIN_USERNAME=admin \
  -e OPENVPN_ADMIN_PASSWORD=ваш_пароль \
  -v ovpn-data:/etc/openvpn \
  -v openvpn-ui-data:/opt/openvpn-gui/db \
  d3vilh/openvpn-ui:latest

Замените ваш_пароль на надёжный пароль для входа в веб-интерфейс.

8. Проверка работоспособности

Убедитесь, что management-порт внутри контейнера слушается:

docker exec openvpn netstat -tlnp | grep 2080

Вывод должен содержать строку с openvpn и портом 2080.

Откройте браузер и перейдите по адресу:
http://IP_вашего_сервера:8072

Введите логин admin и пароль, заданный на предыдущем шаге. Если всё настроено верно, вы увидите панель управления со статусом сервера Running.


Создание первого VPN-клиента

Через веб-интерфейс (рекомендуется)

  1. В левом меню выберите ClientsAdd Client.
  2. Укажите имя клиента (например, home-laptop). Можно оставить все остальные поля по умолчанию.
  3. Нажмите Save. Система сгенерирует сертификат и ключ.
  4. Напротив созданного клиента нажмите кнопку Download (или Export) — скачается файл client.ovpn.
  5. Передайте этот файл пользователю. Он сможет подключиться, установив OpenVPN-клиент и импортировав конфигурацию.

Вручную (через командную строку)

Если веб-интерфейс по какой-то причине не может создавать клиентов (хотя обычно может), можно добавить клиента вручную:

# Создание клиента с именем client1 (без пароля на сертификат)
docker run -v ovpn-data:/etc/openvpn --rm -it kylemanna/openvpn easyrsa build-client-full client1 nopass
# Получение .ovpn файла
docker run -v ovpn-data:/etc/openvpn --rm kylemanna/openvpn ovpn_getclient client1 > client1.ovpn

Настройка фаервола

Убедитесь, что на вашем сервере открыты порты:

  • 1194/udp — для VPN-соединений.
  • 8072/tcp — для веб-интерфейса.

Если используется firewalld (CentOS, Fedora):

sudo firewall-cmd --add-port=1194/udp --permanent
sudo firewall-cmd --add-port=8072/tcp --permanent
sudo firewall-cmd --reload

Если ufw (Ubuntu):

sudo ufw allow 1194/udp
sudo ufw allow 8072/tcp

Если iptables:

sudo iptables -A INPUT -p udp --dport 1194 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 8072 -j ACCEPT
sudo iptables-save > /etc/iptables/rules.v4

Проверка подключения

На клиентском устройстве установите официальный OpenVPN-клиент:

  • Windows: OpenVPN GUI
  • macOS: Tunnelblick или OpenVPN Connect
  • Linux: sudo apt install openvpn / sudo dnf install openvpn

Android/iOS: OpenVPN Connect из магазина приложений

Импортируйте полученный .ovpn файл и подключитесь. После успешного подключения вы сможете заходить на внутренние ресурсы сервера и выходить в интернет через его IP-адрес.


Управление и мониторинг

Веб-интерфейс позволяет:

  • просматривать список активных подключений;
  • отзывать сертификаты клиентов;
  • изменять настройки сервера (порт, протокол, DNS и т.д.);
  • обновлять пароль администратора;
  • скачивать логи OpenVPN.

Обновление контейнеров

Чтобы обновить образы до последних версий:

docker pull kylemanna/openvpn:latest
docker pull d3vilh/openvpn-ui:latest
docker stop openvpn openvpn-ui
docker rm openvpn openvpn-ui

Затем повторно запустите контейнеры из шагов 6 и 7 (том с данными сохранится).


Заключение

Вы успешно развернули собственный OpenVPN-сервер с веб-интерфейсом в Docker. Теперь у вас есть полностью бесплатный, безопасный и масштабируемый VPN-сервис без ограничений на количество одновременных подключений (кроме мощности вашего сервера и ширины канала).

При возникновении проблем сверьтесь с логами:

docker logs openvpn
docker logs openvpn-ui

Большинство ошибок связано с фаерволом, не загруженным модулем tun или неверно указанным публичным IP. Если останутся вопросы — обращайтесь к официальной документации или сообществу OpenVPN.

ВНИМАНИЕ !!!! Статья техническая для организации безопастных каналов связи для производственных целей и личного использования, и не призывает использовать технологии для обхода блокировок и нарушения законодательства.