Docker-Compose StrongSwan установка: VPN для параноиков и перфекционистов

Какой VPN сервер установить на Ubuntu 24 для нативного подключения
Приветствую, коллеги! Сегодня поговорим о том, как развернуть StrongSwan через Docker-Compose и не поседеть раньше времени. За 15 лет в системном администрировании я повидал всякого: и костыли на костылях, и «временные решения», которые работают по сей день. Но StrongSwan в Docker — это та редкая штука, которая действительно работает как швейцарские часы.

Зачем вообще городить этот огород?

Знаете, я помню времена, когда настройка 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 будет быстрым и стабильным! 🚀

 

Поделитесь:

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Прокрутить вверх