
VPN-сервер IPsec на основе Docker, поддерживающий IPsec/L2TP, Cisco IPsec и IKEv2, с автоматической генерацией учётных данных и настройкой клиентов для нескольких платформ.
English | 简体中文 | 繁體中文 | Русский
Docker-образ для запуска сервера IPsec VPN с поддержкой IPsec/L2TP, Cisco IPsec и IKEv2.
Основан на Alpine 3.23 или Debian 12 с использованием Libreswan (программное обеспечение IPsec VPN) и xl2tpd (демон L2TP).
IPsec VPN шифрует сетевой трафик, поэтому никто между вами и VPN-сервером не сможет перехватывать ваши данные во время их передачи через Интернет. Это особенно полезно при использовании незащищённых сетей, например в кофейнях, аэропортах или гостиничных номерах.
Возможности:
linux/amd64, linux/arm64, linux/arm/v7Также доступно:
Используйте эту команду для настройки сервера IPsec VPN в Docker:
docker run \
--name ipsec-vpn-server \
--restart=always \
-v ikev2-vpn-data:/etc/ipsec.d \
-v /lib/modules:/lib/modules:ro \
-p 500:500/udp \
-p 4500:4500/udp \
-d --privileged \
hwdsl2/ipsec-vpn-server
Данные для входа в VPN будут сгенерированы случайным образом. См. раздел Получение данных для входа в VPN.
В качестве альтернативы вы можете настроить IPsec VPN без Docker. Чтобы узнать больше о том, как использовать этот образ, прочитайте разделы ниже.
dockerПримечание: Продвинутые пользователи могут использовать этот образ на macOS с помощью Docker for Mac. Перед использованием режима IPsec/L2TP может потребоваться один раз перезапустить контейнер с помощью docker restart ipsec-vpn-server. Этот образ не поддерживает Docker for Windows.
Получите доверенную сборку из реестра Docker Hub:
docker pull hwdsl2/ipsec-vpn-server
В качестве альтернативы можно скачать из Quay.io:
docker pull quay.io/hwdsl2/ipsec-vpn-server
docker image tag quay.io/hwdsl2/ipsec-vpn-server hwdsl2/ipsec-vpn-server
Поддерживаемые платформы: linux/amd64, linux/arm64 и linux/arm/v7.
Продвинутые пользователи могут собрать образ из исходного кода на GitHub.
Доступны два предварительно собранных образа. Образ на базе Alpine используется по умолчанию и имеет размер всего около ~19 MB.
Примечание: Чтобы использовать образ на базе Debian, замените каждое hwdsl2/ipsec-vpn-server на hwdsl2/ipsec-vpn-server:debian в этом README. В настоящее время эти образы несовместимы с системами Synology NAS.
Обычно рекомендуется использовать последнюю версию Libreswan 5, которая является версией по умолчанию в этом проекте. Однако если вы хотите использовать более старую версию Libreswan 4, вы можете собрать Docker-образ из исходного кода:
git clone https://github.com/hwdsl2/docker-ipsec-vpn-server
cd docker-ipsec-vpn-server
# Указать версию Libreswan 4
sed -i 's/SWAN_VER=5\..*/SWAN_VER=4.15/' Dockerfile Dockerfile.debian
# Сборка образа на базе Alpine
docker build -t hwdsl2/ipsec-vpn-server .
# Сборка образа на базе Debian
docker build -f Dockerfile.debian -t hwdsl2/ipsec-vpn-server:debian .
Примечание: Все переменные для этого образа являются необязательными, что означает, что вам не нужно указывать ни одну переменную — и вы сможете получить работающий сервер IPsec VPN «из коробки»! Для этого создайте пустой файл env с помощью touch vpn.env, а затем перейдите к следующему разделу.
Этот Docker-образ использует следующие переменные, которые можно объявить в файле env (см. пример):
VPN_IPSEC_PSK=your_ipsec_pre_shared_key
VPN_USER=your_vpn_username
VPN_PASSWORD=your_vpn_password
Это создаст учетную запись пользователя для входа в VPN, которую можно использовать на нескольких ваших устройствах*. IPsec PSK (предварительно общий ключ) задаётся переменной окружения VPN_IPSEC_PSK. Имя пользователя VPN задаётся в VPN_USER, а пароль VPN указывается в VPN_PASSWORD.
Поддерживаются дополнительные пользователи VPN, и их можно при желании объявить в вашем файле env следующим образом. Имена пользователей и пароли должны быть разделены пробелами, а имена пользователей не могут повторяться. Все пользователи VPN будут использовать один и тот же IPsec PSK.
VPN_ADDL_USERS=additional_username_1 additional_username_2
VPN_ADDL_PASSWORDS=additional_password_1 additional_password_2
Переменные выше используются только для режимов IPsec/L2TP и IPsec/XAuth («Cisco IPsec»). Для IKEv2 см. Настройка и использование IKEv2 VPN.
Примечание: В файле env НЕ помещайте "" или '' вокруг значений и не добавляйте пробелы вокруг =. НЕ используйте внутри значений следующие специальные символы: \ " '. Надёжный IPsec PSK должен состоять как минимум из 20 случайных символов.
Примечание: Если вы измените файл env после того, как Docker-контейнер уже создан, необходимо удалить и создать контейнер заново, чтобы изменения вступили в силу. См. раздел Обновление Docker-образа.
Продвинутые пользователи могут при желании указать DNS-имя, имя клиента и/или собственные DNS-серверы.
Продвинутые пользователи могут при желании указать DNS-имя для адреса сервера IKEv2. DNS-имя должно быть полным доменным именем (FQDN). Пример:
VPN_DNS_NAME=vpn.example.com
Вы можете указать имя для первого клиента IKEv2. Используйте только одно слово, без специальных символов, кроме - и _. По умолчанию используется vpnclient, если имя не указано.
VPN_CLIENT_NAME=your_client_name
По умолчанию клиенты используют Google Public DNS при активном VPN. Вы можете указать собственные DNS-серверы для всех режимов VPN. Пример:
VPN_DNS_SRV1=1.1.1.1
VPN_DNS_SRV2=1.0.0.1
Для получения дополнительных сведений и списка популярных публичных DNS-провайдеров см. Использование альтернативных DNS-серверов.
По умолчанию пароль не требуется при импорте конфигурации клиента IKEv2. Вы можете защитить файлы конфигурации клиента случайным паролем.
VPN_PROTECT_CONFIG=yes
Примечание: Переменные выше не влияют на режим IKEv2, если IKEv2 уже настроен в Docker-контейнере. В этом случае вы можете удалить IKEv2 и настроить его снова с пользовательскими параметрами. См. Настройка и использование IKEv2 VPN.
Создайте новый Docker-контейнер из этого образа (замените ./vpn.env на ваш собственный файл env):
docker run \
--name ipsec-vpn-server \
--env-file ./vpn.env \
--restart=always \
-v ikev2-vpn-data:/etc/ipsec.d \
-v /lib/modules:/lib/modules:ro \
-p 500:500/udp \
-p 4500:4500/udp \
-d --privileged \
hwdsl2/ipsec-vpn-server
В этой команде используется параметр -v команды docker run, чтобы создать новый Docker volume с именем ikev2-vpn-data и смонтировать его в /etc/ipsec.d внутри контейнера. Данные, связанные с IKEv2 (такие как сертификаты и ключи), будут сохраняться в этом томе. Позже, если вам потребуется заново создать Docker-контейнер, просто укажите тот же том снова.
Рекомендуется включить IKEv2 при использовании этого образа. Однако если вы предпочитаете не использовать IKEv2 и подключаться к VPN только через режимы IPsec/L2TP и IPsec/XAuth («Cisco IPsec»), удалите первый параметр -v из команды docker run, приведённой выше.
Примечание: Продвинутые пользователи также могут запускать контейнер без привилегированного режима.
Если вы не указали файл env в команде docker run выше, значение VPN_USER по умолчанию будет vpnuser, а VPN_IPSEC_PSK и VPN_PASSWORD будут сгенерированы случайным образом. Чтобы получить их, просмотрите журналы контейнера:
docker logs ipsec-vpn-server
Найдите в выводе следующие строки:
Connect to your new VPN with these details:
Server IP: your_vpn_server_ip
IPsec PSK: your_ipsec_pre_shared_key
Username: your_vpn_username
Password: your_vpn_password
Вывод также будет содержать сведения для режима IKEv2, если он включён.
(Необязательно) Сохраните сгенерированные данные для входа в VPN (если они есть) в текущий каталог:
docker cp ipsec-vpn-server:/etc/ipsec.d/vpn-gen.env ./
cp vpn.env.example vpn.env
# При необходимости отредактируйте vpn.env, затем:
docker compose up -d
docker logs ipsec-vpn-server
Пример docker-compose.yml (уже включён):
volumes:
ikev2-vpn-data:
services:
vpn:
image: hwdsl2/ipsec-vpn-server
restart: always
env_file:
- ./vpn.env
ports:
- "500:500/udp"
- "4500:4500/udp"
privileged: true
hostname: ipsec-vpn-server
container_name: ipsec-vpn-server
volumes:
- ikev2-vpn-data:/etc/ipsec.d
- /lib/modules:/lib/modules:ro
Прочитать на других языках: English, 简体中文, 繁體中文, Русский.
Настройте ваш компьютер или устройство для использования VPN. Пожалуйста, обратитесь к следующим инструкциям (на английском языке):
Настройка и использование IKEv2 VPN (рекомендуется)
Настройка клиентов IPsec/L2TP VPN
Настройка клиентов IPsec/XAuth («Cisco IPsec»)
Прочитайте 📖 книгу о VPN, чтобы получить доступ к дополнительному контенту.
Наслаждайтесь собственным VPN! ✨🎉🚀✨
Пользователи Windows: для режима IPsec/L2TP требуется одноразовое изменение реестра, если VPN-сервер или клиент находится за NAT (например, домашним роутером).
Одна и та же учетная запись VPN может использоваться на нескольких ваших устройствах. Однако из-за ограничения IPsec/L2TP, если вы хотите подключить несколько устройств из-за одного NAT (например, домашнего роутера), необходимо использовать режим IKEv2 или IPsec/XAuth.
Если вы хотите добавить, изменить или удалить учетные записи пользователей VPN, сначала обновите файл env, затем удалите и заново создайте Docker-контейнер, следуя инструкциям из следующего раздела. Продвинутые пользователи могут использовать bind mount для файла env.
Для серверов с внешним файрволом (например, EC2/GCE) откройте UDP-порты 500 и 4500 для VPN. Пользователям Aliyun см. #433.
Клиенты настроены использовать Google Public DNS при активном VPN. Если вы предпочитаете другого DNS-провайдера, прочитайте этот раздел.
Чтобы обновить Docker-образ и контейнер, сначала загрузите последнюю версию:
docker pull hwdsl2/ipsec-vpn-server
Если Docker-образ уже обновлён, вы увидите:
Status: Image is up to date for hwdsl2/ipsec-vpn-server:latest
В противном случае будет загружена последняя версия. Чтобы обновить Docker-контейнер, сначала запишите все ваши данные для входа в VPN. Затем удалите контейнер Docker с помощью docker rm -f ipsec-vpn-server. После этого создайте его заново, следуя инструкциям из раздела Как использовать этот образ.
Режим IKEv2 имеет преимущества по сравнению с IPsec/L2TP и IPsec/XAuth («Cisco IPsec») и не требует IPsec PSK, имени пользователя или пароля. Подробнее можно прочитать здесь.
Сначала проверьте журналы контейнера, чтобы увидеть сведения о IKEv2:
docker logs ipsec-vpn-server
Примечание: Если вы не можете найти сведения о IKEv2, возможно, IKEv2 не включён в контейнере. Попробуйте обновить Docker-образ и контейнер, следуя инструкциям из раздела Обновление Docker-образа.
Во время настройки IKEv2 создаётся клиент IKEv2 (с именем по умолчанию vpnclient), а его конфигурация экспортируется в /etc/ipsec.d внутри контейнера. Чтобы скопировать файл(ы) конфигурации на Docker-хост:
# Проверить содержимое /etc/ipsec.d в контейнере
docker exec -it ipsec-vpn-server ls -l /etc/ipsec.d
# Пример: копирование файла конфигурации клиента из контейнера
# в текущий каталог на Docker-хосте
docker cp ipsec-vpn-server:/etc/ipsec.d/vpnclient.p12 ./
Следующие шаги: Настройте ваши устройства для использования IKEv2 VPN.
Вы можете управлять клиентами IKEv2 с помощью вспомогательного скрипта. Ниже приведены примеры. Чтобы настроить параметры клиента, запустите скрипт без аргументов.
# Добавить нового клиента (с параметрами по умолчанию)
docker exec -it ipsec-vpn-server ikev2.sh --addclient [имя клиента]
# Экспортировать конфигурацию для существующего клиента
docker exec -it ipsec-vpn-server ikev2.sh --exportclient [имя клиента]
# Показать список существующих клиентов
docker exec -it ipsec-vpn-server ikev2.sh --listclients
# Показать справку
docker exec -it ipsec-vpn-server ikev2.sh -h
Примечание: Если возникает ошибка «executable file not found», замените ikev2.sh выше на /opt/src/ikev2.sh.
В некоторых случаях может потребоваться изменить адрес сервера IKEv2. Например, чтобы перейти на использование DNS-имени или после изменения IP-адреса сервера. Чтобы изменить адрес сервера IKEv2, сначала откройте bash-оболочку внутри контейнера, затем следуйте этим инструкциям. Обратите внимание, что журналы контейнера не будут показывать новый адрес сервера IKEv2, пока вы не перезапустите Docker-контейнер.
В некоторых случаях может потребоваться удалить IKEv2 и настроить его заново с пользовательскими параметрами.
Предупреждение: Вся конфигурация IKEv2, включая сертификаты и ключи, будет безвозвратно удалена. Это нельзя отменить!
Вариант 1: Удалить IKEv2 и настроить его снова с помощью вспомогательного скрипта.
Обратите внимание, что это переопределит переменные, указанные в файле env, такие как VPN_DNS_NAME и VPN_CLIENT_NAME, а журналы контейнера больше не будут показывать актуальную информацию для IKEv2.
# Удалить IKEv2 и удалить всю конфигурацию IKEv2
docker exec -it ipsec-vpn-server ikev2.sh --removeikev2
# Настроить IKEv2 снова с пользовательскими параметрами
docker exec -it ipsec-vpn-server ikev2.sh
Вариант 2: Удалить ikev2-vpn-data и создать контейнер заново.
docker rm -f ipsec-vpn-server.ikev2-vpn-data: docker volume rm ikev2-vpn-data.См. Расширенное использование (на английском).
Запущены два сервиса: Libreswan (pluto) для IPsec VPN и xl2tpd для поддержки L2TP.
Конфигурация IPsec по умолчанию поддерживает:
Необходимые порты: 500/udp и 4500/udp (IPsec)
Примечание: Компоненты программного обеспечения внутри предварительно собранного образа (например, Libreswan и xl2tpd) распространяются по лицензиям, выбранным их правообладателями. Как и в случае использования любого готового образа, пользователь образа несёт ответственность за то, чтобы использование этого образа соответствовало всем применимым лицензиям для программного обеспечения, содержащегося внутри.
Copyright (C) 2016-2026 Lin Song 
Основано на работе Thomas Sarlandie (Copyright 2012)

Эта работа распространяется по лицензии Creative Commons Attribution-ShareAlike 3.0 Unported License
Требуется указание авторства: пожалуйста, указывайте моё имя в любых производных работах и сообщайте мне, как вы её улучшили!
| На базе Alpine | На базе Debian |
|---|
| Имя образа | hwdsl2/ipsec-vpn-server | hwdsl2/ipsec-vpn-server:debian |
| Сжатый размер | ~ 19 MB | ~ 62 MB |
| Базовый образ | Alpine Linux 3.23 | Debian Linux 12 |
| Платформы | amd64, arm64, arm/v7 | amd64, arm64, arm/v7 |
| Версия Libreswan | 5.3.1 | 5.3.1 |
| IPsec/L2TP | ✅ | ✅ |
| Cisco IPsec | ✅ | ✅ |
| IKEv2 | ✅ | ✅ |
env и добавьте пользовательские параметры IKEv2, такие как VPN_DNS_NAME и VPN_CLIENT_NAME, затем создайте контейнер заново. См. раздел Как использовать этот образ.