[English](../README.md) | [简体中文](README-zh.md) | [繁體中文](README-zh-Hant.md) | [Русский](README-ru.md) # Сервер OpenVPN на Docker [![Build Status](https://github.com/hwdsl2/docker-openvpn/actions/workflows/main.yml/badge.svg)](https://github.com/hwdsl2/docker-openvpn/actions/workflows/main.yml)  [![Docker Pulls](https://raw.githubusercontent.com/hwdsl2/badges/main/img/docker-pulls-openvpn-server.svg)](https://hub.docker.com/r/hwdsl2/openvpn-server)  [![License: MIT](images/license.svg)](https://opensource.org/licenses/MIT) Docker-образ для запуска сервера OpenVPN. Основан на Alpine Linux с OpenVPN и EasyRSA. Разработан как простой, современный и легко поддерживаемый. **Возможности:** - Автоматическая генерация PKI, сертификатов сервера и конфигурации клиента при первом запуске - Управление клиентами через вспомогательный скрипт (`ovpn_manage`) - Современный набор шифров: AES-128-GCM, SHA256, tls-crypt - Поддержка двойного стека IPv4 и IPv6 для VPN-клиентов - Автоматически собирается и публикуется через [GitHub Actions](https://github.com/hwdsl2/docker-openvpn/actions) - Постоянное хранение данных через Docker volume - Поддержка нескольких архитектур: `linux/amd64`, `linux/arm64`, `linux/arm/v7` **Также доступно:** - **Без Docker:** [Скрипт установки OpenVPN](https://github.com/hwdsl2/openvpn-install/blob/master/README-ru.md) - **VPN:** [WireGuard](https://github.com/hwdsl2/docker-wireguard/blob/main/docs/README-ru.md), [IPsec VPN](https://github.com/hwdsl2/docker-ipsec-vpn-server/blob/master/README-ru.md), [Headscale](https://github.com/hwdsl2/docker-headscale/blob/main/docs/README-ru.md) - **AI:** [Стек ИИ на своём сервере](https://github.com/hwdsl2/self-hosted-ai-stack/blob/main/docs/README-ru.md) для локальных LLM, чата, RAG, голосовых функций и инструментов ИИ > 📘 Хотите развернуть ИИ на собственном сервере? **The Self-Hosted AI Builder’s Guide** ([Kindle](https://books2read.com/aiguide?store=amazon) · [Google Play](https://books2read.com/aiguide?store=google) · [книга в мягкой обложке](https://books2read.com/aiguide?store=amazon-paperback&format=PAPERBACK)): практическое руководство по созданию, защите и эксплуатации собственного приватного ИИ-стека. ## Быстрый старт **Шаг 1.** Запустите сервер OpenVPN: ```bash docker run \ --name openvpn \ --restart=always \ -v openvpn-data:/etc/openvpn \ -p 1194:1194/udp \ -d --cap-add=NET_ADMIN \ --device=/dev/net/tun \ --sysctl net.ipv4.ip_forward=1 \ --sysctl net.ipv6.conf.all.forwarding=1 \ hwdsl2/openvpn-server ``` При первом запуске сервер автоматически генерирует PKI, сертификат сервера, ключ TLS crypt и конфигурацию клиента с именем `client.ovpn`. **Шаг 2.** Скопируйте конфигурацию клиента на локальную машину: ```bash docker cp openvpn:/etc/openvpn/clients/client.ovpn . ``` Импортируйте `client.ovpn` в ваш клиент OpenVPN для подключения. В качестве альтернативы вы можете [настроить OpenVPN без Docker](https://github.com/hwdsl2/openvpn-install/blob/master/README-ru.md). Чтобы узнать больше о том, как использовать этот образ, прочитайте разделы ниже. ## Сообщество - 📬 [Получайте новости проектов и бесплатные руководства по развёртыванию](https://selfhostedstack.beehiiv.com/subscribe?utm_campaign=vpn-ru) (1–2 письма в месяц; руководства в формате PDF на английском языке) - 💬 Присоединяйтесь к сообществу [r/selfhostedstack](https://www.reddit.com/r/selfhostedstack/) для обсуждений и демонстрации проектов - ⭐ Поставьте звезду репозиторию, если он оказался вам полезен — это поможет другим пользователям его найти. ## Требования - Linux-сервер с публичным IP-адресом или DNS-именем - Установленный Docker - Открытый в файрволе порт VPN (по умолчанию UDP 1194, или настроенный порт/протокол) ## Загрузка Получите образ из [реестра Docker Hub](https://hub.docker.com/r/hwdsl2/openvpn-server/): ```bash docker pull hwdsl2/openvpn-server ``` Либо загрузите из [Quay.io](https://quay.io/repository/hwdsl2/openvpn-server): ```bash docker pull quay.io/hwdsl2/openvpn-server docker image tag quay.io/hwdsl2/openvpn-server hwdsl2/openvpn-server ``` Поддерживаемые платформы: `linux/amd64`, `linux/arm64` и `linux/arm/v7`. ## Переменные окружения Все переменные необязательны. Если не заданы, автоматически используются безопасные значения по умолчанию. Этот Docker-образ использует следующие переменные, которые можно задать в файле `env` (см. [пример](../vpn.env.example)): | Переменная | Описание | Значение по умолчанию | |---|---|---| | `VPN_DNS_NAME` | Полное доменное имя (FQDN) сервера | Автоопределение публичного IP | | `VPN_PUBLIC_IP` | Публичный IPv4-адрес сервера | Автоопределение | | `VPN_PUBLIC_IP6` | Публичный IPv6-адрес сервера | Автоопределение | | `VPN_PROTO` | Протокол VPN: `udp` или `tcp` | `udp` | | `VPN_PORT` | Порт VPN (1–65535) | `1194` | | `VPN_CLIENT_NAME` | Имя первого сгенерированного конфига клиента | `client` | | `VPN_DNS_SRV1` | Основной DNS-сервер, передаваемый клиентам | `8.8.8.8` | | `VPN_DNS_SRV2` | Резервный DNS-сервер, передаваемый клиентам | `8.8.4.4` | | `VPN_DISABLE_USAGE_COUNTS` | Установите `1`, чтобы отключить анонимные агрегированные счётчики использования. | *(не задан)* | **Примечание:** В файле `env` можно заключать значения в одинарные кавычки, например `VAR='значение'`. Не добавляйте пробелы вокруг `=`. Если вы изменили `VPN_PORT` или `VPN_PROTO`, соответственно обновите флаг `-p` в команде `docker run`. Пример использования файла `env`: ```bash docker run \ --name openvpn \ --restart=always \ -v openvpn-data:/etc/openvpn \ -v ./vpn.env:/vpn.env:ro \ -p 1194:1194/udp \ -d --cap-add=NET_ADMIN \ --device=/dev/net/tun \ --sysctl net.ipv4.ip_forward=1 \ --sysctl net.ipv6.conf.all.forwarding=1 \ hwdsl2/openvpn-server ``` Файл env монтируется в контейнер через bind mount, поэтому изменения применяются при каждом перезапуске контейнера без его пересоздания. ## Управление клиентами Используйте `docker exec` для управления клиентами с помощью вспомогательного скрипта `ovpn_manage`. **Добавить нового клиента:** ```bash docker exec openvpn ovpn_manage --addclient alice docker cp openvpn:/etc/openvpn/clients/alice.ovpn . ``` **Экспортировать конфигурацию клиента** (выводится в stdout): ```bash docker exec openvpn ovpn_manage --exportclient alice > alice.ovpn ``` **Список клиентов:** ```bash docker exec openvpn ovpn_manage --listclients ``` **Отозвать клиента** (будет запрошено подтверждение): ```bash docker exec -it openvpn ovpn_manage --revokeclient alice # Или отозвать без запроса подтверждения: docker exec openvpn ovpn_manage --revokeclient alice -y ``` ## Постоянные данные Все данные сервера и клиентов хранятся в Docker volume (`/etc/openvpn` внутри контейнера): ``` /etc/openvpn/ ├── server/ │ ├── server.conf # Конфигурация сервера OpenVPN │ ├── ca.crt # Сертификат CA │ ├── server.crt # Сертификат сервера │ ├── server.key # Закрытый ключ сервера │ ├── tc.key # Ключ TLS crypt │ ├── dh.pem # Параметры DH │ ├── crl.pem # Список отозванных сертификатов │ ├── client-common.txt # Шаблон конфигурации клиента │ ├── ipp.txt # Сохранение пула IP-адресов │ └── easy-rsa/pki/ # Полный каталог PKI └── clients/ ├── client.ovpn # Конфигурация первого клиента └── alice.ovpn # Дополнительные клиенты ``` Сделайте резервную копию Docker volume для сохранения всех ключей и конфигураций клиентов. ## Поддержка IPv6 Если Docker-хост имеет публичный (глобальный одноадресный) IPv6-адрес и выполнены приведённые ниже требования, поддержка IPv6 автоматически включается при запуске контейнера. Никакой дополнительной настройки не требуется. **Требования:** - Docker-хост должен иметь маршрутизируемый глобальный одноадресный IPv6-адрес (начинающийся с `2` или `3`). Локальные адреса канала (`fe80::/10`) не подходят. - Для Docker-контейнера должна быть включена поддержка IPv6. См. [Enable IPv6 support in Docker](https://docs.docker.com/engine/daemon/ipv6/). Чтобы включить IPv6 для Docker-контейнера, сначала включите IPv6 в демоне Docker, добавив следующее в файл `/etc/docker/daemon.json` на Docker-хосте, затем перезапустите Docker: ```json { "ipv6": true, "fixed-cidr-v6": "fddd:1::/64" } ``` После этого пересоздайте Docker-контейнер. Чтобы проверить работу IPv6, подключитесь к VPN и проверьте ваш IPv6-адрес, например, с помощью [test-ipv6.com](https://test-ipv6.com). ## Использование docker-compose ```bash cp vpn.env.example vpn.env # При необходимости отредактируйте vpn.env, затем: docker compose up -d docker cp openvpn:/etc/openvpn/clients/client.ovpn . ``` Пример `docker-compose.yml` (уже включён): ```yaml services: openvpn: image: hwdsl2/openvpn-server container_name: openvpn restart: always ports: - "1194:1194/udp" volumes: - openvpn-data:/etc/openvpn - ./vpn.env:/vpn.env:ro cap_add: - NET_ADMIN devices: - /dev/net/tun:/dev/net/tun sysctls: - net.ipv4.ip_forward=1 - net.ipv6.conf.all.forwarding=1 volumes: openvpn-data: name: openvpn-data ``` ## Обновление Docker-образа Для обновления Docker-образа и контейнера сначала [загрузите](#загрузка) последнюю версию: ```bash docker pull hwdsl2/openvpn-server ``` Если Docker-образ уже актуален, вы увидите: ``` Status: Image is up to date for hwdsl2/openvpn-server:latest ``` В противном случае будет загружена последняя версия. Удалите и пересоздайте контейнер, следуя инструкциям из раздела [Быстрый старт](#быстрый-старт). Ваши данные сохранены в volume `openvpn-data`. ## Счётчики использования Этот образ использует публичные счётчики скачиваний GitHub Release assets для анонимной агрегированной статистики использования. Эти числа приблизительны и не являются количеством уникальных пользователей или активных установок. Образ не отправляет telemetry payload и не использует частный сборщик. Он выполняет только best-effort запрос после того, как настройка достигает запуска OpenVPN с подключённым томом `/etc/openvpn`, а также при первом запуске другой сборки образа для этой постоянной установки. Чтобы отключить это, задайте `VPN_DISABLE_USAGE_COUNTS=1`. ## Технические детали - Базовый образ: `alpine:3.23` - OpenVPN: последняя версия из пакетов Alpine - EasyRSA: включён в образ при сборке - Шифр: AES-128-GCM - Аутентификация: SHA256 - Обмен ключами: tls-crypt (HMAC + шифрование) - Параметры DH: предопределённая группа ffdhe2048 (RFC 7919) - Сертификаты клиентов: срок действия 10 лет - Подсеть VPN: `10.8.0.0/24` - Подсеть VPN IPv6: `fddd:1194:1194:1194::/64` (при наличии IPv6 на сервере) ## Дополнительная литература 📚 Подробнее о защите вашей конфиденциальности в интернете читайте в книге [Privacy Tools in the Age of AI](https://books2read.com/privacy). ## Лицензия **Примечание:** Программные компоненты внутри предсобранного образа (такие как OpenVPN и EasyRSA) распространяются под соответствующими лицензиями, выбранными их правообладателями. При использовании любого предсобранного образа пользователь несёт ответственность за соблюдение всех соответствующих лицензий на программное обеспечение, содержащееся в образе. Copyright (C) 2026 Lin Song Эта работа распространяется под [лицензией MIT](https://opensource.org/licenses/MIT). Этот проект частично основан на работе [Nyr и участников проекта](https://github.com/Nyr/openvpn-install), распространяемой под [лицензией MIT](https://github.com/Nyr/openvpn-install/blob/master/LICENSE).