Зачем вообще городить этот огород?
Знаете, я помню времена, когда настройка IPsec VPN превращалась в квест на выживание. Конфиги на три экрана, зависимости, которые конфликтуют друг с другом, и вечное «у меня работает, не трогай!». Docker-Compose решает эту проблему элегантно: изолированное окружение, воспроизводимая конфигурация и возможность откатиться за пару секунд. Красота!
StrongSwan — это Open Source IPsec-решение, которое не сольет ваши данные первому встречному. В отличие от некоторых проприетарных VPN-решений, здесь вы точно знаете, что происходит под капотом. А в Docker-контейнере это еще и просто до безобразия.
Предварительная подготовка (без этого никуда)
Прежде чем мы начнем колдовать с контейнерами, убедитесь, что у вас есть:
- Docker версии 20.10+ (свежак всегда лучше)
- Docker-Compose версии 2.0+ (единица уже устарела, товарищи)
- Сервер с белым IP (хостинг, VPS, или ваш домашний сервак с проброшенными портами)
- Root-доступ или sudo (без этого мы бессильны)
- Прямые руки (опционально, но желательно 😄)
Проверяем версии:
docker --version docker-compose --version
Если что-то отсутствует — гуглим «install docker ubuntu» (или вашу ОС) и ставим. Не буду тут повторять то, что миллион раз описано в официальной доке.
Практический пример #1: Базовая установка StrongSwan
Окей, хватит теории, давайте пилить! Создаем директорию для нашего VPN-сервера:
mkdir -p ~/strongswan-vpn && cd ~/strongswan-vpn
Теперь создаем файл docker-compose.yml. Я использую nano, но вы можете vim’ить, если вам так проще выйти из редактора (шутка для знающих 😉):
nano docker-compose.yml
Вставляем туда следующую конфигурацию:
version: '3.8'
services:
strongswan:
image: ikev2/strongswan:latest
container_name: strongswan-vpn
restart: always
privileged: true
ports:
- "500:500/udp"
- "4500:4500/udp"
environment:
- VPN_DOMAIN=vpn.yourdomain.com
- VPN_DNS=8.8.8.8,8.8.4.4
- VPN_SUBNET=10.10.10.0/24
volumes:
- ./config:/config
- /lib/modules:/lib/modules:ro
cap_add:
- NET_ADMIN
- SYS_MODULE
sysctls:
- net.ipv4.ip_forward=1
- net.ipv6.conf.all.forwarding=1
Что тут происходит? Давайте разберем:
privileged: true— даем контейнеру расширенные права (без этого IPsec не завелится)500/udp и 4500/udp— стандартные порты для IKEv2 (запомните их, пригодится)VPN_DOMAIN— ваш домен или IP (замените на свой!)NET_ADMIN— права на управление сетью (капибара сетевого стека)ip_forward=1— включаем роутинг (без этого пакеты никуда не пойдут)
Поднимаем контейнер:
docker-compose up -d
Проверяем, что всё взлетело:
docker-compose ps docker-compose logs -f strongswan
Если в логах видите «charon started» — поздравляю, первый уровень пройден! 🎉
Практический пример #2: Генерация сертификатов для клиентов
VPN без сертификатов — как пицца без сыра. Технически можно, но зачем? Заходим внутрь контейнера:
docker exec -it strongswan-vpn sh
Генерируем сертификат для клиента (например, для вашего смартфона):
cd /config/pki ./generate-cert.sh client myiphone
Скрипт создаст .p12 файл, который можно скормить iOS или Android. Выгружаем его наружу:
exit docker cp strongswan-vpn:/config/pki/myiphone.p12 ./
Теперь этот файл можно отправить себе на почту или через облако. Пароль от сертификата будет в логах контейнера — не потеряйте его!
Практический пример #3: Настройка split-tunnel (умный роутинг)
Не всегда нужно гнать весь трафик через VPN. Иногда хочется, чтобы Netflix шел напрямую (из-за гео-блокировок), а рабочие ресурсы — через защищенный туннель. Для этого редактируем конфиг:
nano config/ipsec.conf
Добавляем директиву rightsourceip с нужными подсетями:
conn ikev2-vpn
auto=add
compress=no
type=tunnel
keyexchange=ikev2
fragmentation=yes
forceencaps=yes
# Только корпоративные подсети через VPN
rightsubnet=10.0.0.0/8,172.16.0.0/12,192.168.0.0/16
ike=aes256-sha256-modp2048!
esp=aes256-sha256-modp2048!
leftid=@vpn.yourdomain.com
left=%any
leftcert=server-cert.pem
leftsendcert=always
leftsubnet=0.0.0.0/0
right=%any
rightid=%any
rightauth=eap-mschapv2
rightsourceip=10.10.10.0/24
rightdns=8.8.8.8,8.8.4.4
rightsendcert=never
eap_identity=%identity
Перезапускаем контейнер:
docker-compose restart
Вуаля! Теперь только корпоративный трафик идет через VPN, остальное — напрямую. Экономим пинг и избегаем геоблоков.
Практический пример #4: Мониторинг и логирование (для параноиков)
Хороший сисадмин всегда параноит. Это не баг, это фича! 😎 Настроим детальное логирование подключений:
nano config/strongswan.conf
Добавляем секцию логирования:
charon {
load_modular = yes
plugins {
include strongswan.d/charon/*.conf
}
# Детальное логирование
filelog {
/var/log/charon.log {
time_format = %b %e %T
ike_name = yes
append = no
default = 2
flush_line = yes
}
stderr {
ike = 2
knl = 2
cfg = 2
}
}
# DNS для клиентов
dns1 = 8.8.8.8
dns2 = 8.8.4.4
}
Рестартуем и смотрим логи в реальном времени:
docker-compose restart docker exec -it strongswan-vpn tail -f /var/log/charon.log
Теперь вы будете видеть все попытки подключения, ошибки аутентификации и прочие интересности. Когда в 3 часа ночи вас разбудит звонок «VPN не работает!» — эти логи спасут вашу карму.
Практический пример #5: Backup и восстановление за 30 секунд
Представьте: сервер лег, начальник орет, а у вас свидание через час. Нужно поднять VPN на новом сервере БЫСТРО. С Docker-Compose это элементарно, Ватсон!
Делаем бэкап (выполняем регулярно, например, через cron):
# Создаем архив с конфигами и сертификатами
tar -czf strongswan-backup-$(date +%Y%m%d).tar.gz \
docker-compose.yml \
config/
# Копируем в безопасное место
scp strongswan-backup-*.tar.gz user@backup-server:/backups/
Восстановление на новом сервере:
# Распаковываем бэкап tar -xzf strongswan-backup-20240123.tar.gz # Запускаем docker-compose up -d # Профит! ☕
Всё! За 30 секунд VPN снова в строю. Можете спокойно идти на свидание, пока начальник думает, что вы героически решали проблему полночи.
Типичные грабли (чтобы вы не наступили)
За годы работы я насобирал коллекцию классических факапов. Делюсь бесплатно:
Грабли #1: Забыли открыть порты в файрволе
# Ubuntu/Debian ufw allow 500/udp ufw allow 4500/udp # CentOS/RHEL firewall-cmd --permanent --add-port=500/udp firewall-cmd --permanent --add-port=4500/udp firewall-cmd --reload
Это же классика жанра! Контейнер работает, конфиг правильный, а подключиться не можем. Потому что файрвол блокирует. Каждый раз как в первый раз… 🤦
Грабли #2: NAT и проблемы с проходом пакетов
Если ваш сервер за NAT’ом (например, в домашней сети), нужно пробросить порты на роутере И включить NAT-T в конфиге:
# В docker-compose.yml уже есть, но на всякий случай: environment: - VPN_NAT=yes
Грабли #3: Клиенты не могут ходить в интернет через VPN
Забыли включить маскарадинг! Добавляем iptables-правило:
docker exec strongswan-vpn iptables -t nat -A POSTROUTING -s 10.10.10.0/24 -o eth0 -j MASQUERADE
Чтобы это правило сохранялось после перезагрузки, добавьте его в entrypoint-скрипт или используйте iptables-persistent.
Production-ready конфигурация (для серьезных парней)
Если вы делаете это для прода (а не для хоумлаба), вот чек-лист того, что еще нужно докрутить:
- SSL-сертификаты от Let’s Encrypt вместо самоподписанных (клиенты скажут спасибо)
- Fail2Ban для защиты от брутфорса
- Мониторинг через Prometheus + Grafana (красивые графики греют душу)
- Автоматический бэкап в S3/Backblaze каждые 6 часов
- Health-checks в docker-compose для автоматического перезапуска при падении
- Rate limiting для предотвращения DDoS
Вот пример продвинутого docker-compose.yml с health-check’ами:
version: '3.8'
services:
strongswan:
image: ikev2/strongswan:latest
container_name: strongswan-vpn
restart: unless-stopped
privileged: true
ports:
- "500:500/udp"
- "4500:4500/udp"
environment:
- VPN_DOMAIN=vpn.yourdomain.com
- VPN_DNS=1.1.1.1,1.0.0.1
- VPN_SUBNET=10.10.10.0/24
- VPN_NAT=yes
volumes:
- ./config:/config
- /lib/modules:/lib/modules:ro
cap_add:
- NET_ADMIN
- SYS_MODULE
sysctls:
- net.ipv4.ip_forward=1
- net.ipv6.conf.all.forwarding=1
- net.ipv4.conf.all.accept_redirects=0
- net.ipv4.conf.all.send_redirects=0
healthcheck:
test: ["CMD", "ipsec", "status"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
Troubleshooting (когда всё идет не по плану)
Что делать, когда что-то пошло не так? Вот мой алгоритм диагностики:
1. Проверяем статус контейнера
docker-compose ps docker-compose logs --tail=100 strongswan
2. Проверяем статус IPsec
docker exec strongswan-vpn ipsec status docker exec strongswan-vpn ipsec statusall
3. Смотрим сетевую конфигурацию
docker exec strongswan-vpn ip addr docker exec strongswan-vpn iptables -L -n -v docker exec strongswan-vpn ip route
4. Тестируем доступность портов
# С другого сервера nmap -sU -p 500,4500 your-vpn-server-ip # Или через netcat nc -u -v your-vpn-server-ip 500
5. Включаем debug-режим
Если совсем всё плохо, включаем максимально детальные логи:
docker exec strongswan-vpn ipsec stop docker exec strongswan-vpn ipsec start --debug-all
После этого в логах будет ВСЁ. Прям вообще всё. Готовьте терабайты дискового пространства 😄
Оптимизация производительности
Хотите выжать максимум из вашего VPN? Вот несколько трюков:
Используйте современные алгоритмы шифрования
AES-256-GCM быстрее, чем старые алгоритмы, и поддерживает аппаратное ускорение на современных процессорах:
# В ipsec.conf ike=aes256gcm16-sha256-modp2048! esp=aes256gcm16-sha256-modp2048!
Настройте MTU правильно
Проблемы с MTU — это классика VPN. Экспериментируйте со значениями:
# Обычно оптимальное значение 1400-1420 docker <a class="wpil_keyword_link" href="https://it-apteka.com/category/networks/" title="Сети" data-wpil-keyword-link="linked" data-wpil-monitor-id="54">network</a> inspect bridge | grep MTU
Включите TCP BBR для лучшей пропускной способности
# На хосте echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf sysctl -p
Заключение: почему это того стоит
Знаете, что мне нравится в этой связке Docker + StrongSwan? Она просто работает. Без магии, без костылей, без «а давай еще вот это подкрутим». Один раз настроил — и забыл. Ну, почти забыл — мониторинг никто не отменял 😉
За годы работы я видел кучу VPN-решений: от OpenVPN (классика, но тормозной) до проприетарных монстров за космические деньги. StrongSwan в Docker — это золотая середина: быстро, безопасно, бесплатно и воспроизводимо.
Особенно кайфую от того, что можно за пару минут поднять идентичную копию на другом сервере. Это спасало меня не раз, когда хостер внезапно «делал техработы» (читай:ронял железо).
Надеюсь, эта статья сэкономит вам пару седых волос и несколько нервных клеток. Если что-то пошло не так — пишите в комментах, разберемся. Мы же сисадмины, мы помогаем друг другу (особенно когда накосячили одинаково 😄).
Удачи в настройке, и пусть ваш VPN будет быстрым и стабильным! 🚀



