Как работает StrongSwan #
- StrongSwan — реализация IPsec для Linux, которая позволяет строить защищённые VPN-туннели.
- Позволяет безопасно передавать данные между серверами, облаками и офисными сетями.
- Основные компоненты:
- charon — демон, который управляет туннелями и IKE
- XFRM в ядре — шифрует пакеты и применяет политики безопасности
- Работает по протоколу IPsec, с использованием IKEv2 для обмена ключами.
- Этапы работы:
- Установка IKE SA — договариваются алгоритмы шифрования и аутентификация (PSK или сертификаты).
- Создание CHILD SA — настраиваются туннельные ключи ESP для шифрования трафика.
- Шифрование пакетов — ядро Linux шифрует трафик, а на удалённой стороне расшифровывает.
- Для NAT используется UDP 4500 (NAT-T), IKE обычно стартует на UDP 500.
- Опция
forceencaps=yesзаставляет всегда использовать UDP 4500. - StrongSwan поддерживает автоматический подъем туннелей (
auto=start). - Динамическая проверка живости peer через DPD (Dead Peer Detection).
- Поддерживаются фрагментация пакетов и MOBIKE для смены IP.
- Конфигурация классическая:
/etc/ipsec.conf+/etc/ipsec.secrets. - Современный способ: swanctl с
/etc/swanctl/swanctl.conf. - Управление туннелями:
ipsec up <conn>— поднять туннельipsec down <conn>— опустить туннельipsec statusall— проверить статус
- Области применения: Site-to-Site VPN, облачные подключения, офис ↔ сервер, Bastion ↔ private network.
- Подходит для автоматизации через Ansible, Terraform, скрипты DevOps.
- StrongSwan обеспечивает прозрачное шифрование, туннель работает как обычный маршрут.
- Логирование и отладка через
charondebugпомогают видеть процесс установления туннелей. - Поддерживает современные алгоритмы шифрования: AES, SHA2, DH-группы.
- Позволяет строить надежные и стабильные VPN-соединения между Linux-серверами.
Настройка IPSecVPN на StrongSwan между инстансами Ubuntu (AWS) и Ubuntu (Azure) #
Предварительные требования #
- Два сервера Ubuntu: vm-aws-ubuntu2404 и vm-azure-ubuntu2404
- Разрешенные порты в Security Groups:
- UDP 500 - для IKE (начальное соединение)
- UDP 4500 - для NAT-T (основной трафик после установки)
- ESP 50 - протокол нужен только если сеть без NAT (опционально)
- Публичные и приватные IP адреса. В AWS\Azure все инстансы по умолчанию находятся за NAT Gateway
1. Установка StrongSwan #
На обеих VM выполнить:
sudo apt update && sudo apt upgrade -y
sudo apt install strongswan strongswan-pki libcharon-extra-plugins -y
2. Конфигурация для vm-aws-ubuntu2404 (LAN IP 10.130.0.30, WAN IP XX.XX.XX.XX) #
sudo nano /etc/ipsec.conf
# Глобальные настройки strongSwan
config setup
charondebug="ike 2, knl 2, cfg 2" # уровень логирования
uniqueids=no # разрешить несколько подключений
# с одинаковыми ID
# Основное соединение AWS ↔ Azure
conn aws-to-azure
# Локальная сторона за NAT (AWS)
left=%defaultroute # взять интерфейс и приватный IP, через который идёт default route
leftid=@aws # IKE identity для ipsec.secrets
leftsubnet=10.130.0.30/32 # приватный IP сервера AWS
# Удаленная сторона за NAT (Azure)
right=YY.YY.YY.YY # публичный IP сервера Azure
rightid=@azure # IKE identity для ipsec.secrets
rightsubnet=10.130.2.20/32 # приватный IP сервера Azure
# Режимы IKE/IPsec
keyexchange=ikev2 # использовать IKEv2
auto=start # автоматически поднимать туннель
authby=psk # аутентификация по PSK
ike=aes256-sha256-modp2048! # алгоритмы IKE SA
esp=aes256-sha256! # алгоритмы ESP
# DPD (проверка доступности peer)
dpdaction=restart # перезапустить туннель при обрыве
dpddelay=30s # каждые 30 сек проверка
dpdtimeout=120s # таймаут 120 сек
# Работа за NAT
fragmentation=yes # разрешить фрагментацию IKE
mobike=yes # поддержка смены IP
forceencaps=yes # форсировать NAT-T, ESP будет в UDP 4500 даже если NAT не обнаружен
keyingtries=%forever # бесконечно пытаться поднять туннель
sudo nano /etc/ipsec.secrets
@aws @azure : PSK "GtoKTy6Uu2wilwPakUDF7"
3. Конфигурация для vm-azure-ubuntu2404 (LAN IP 10.130.2.20, WAN IP YY.YY.YY.YY) #
sudo nano /etc/ipsec.conf
# Глобальные настройки strongSwan
config setup
charondebug="ike 2, knl 2, cfg 2"
uniqueids=no
# Основное соединение Azure ↔ AWS
conn azure-to-aws
# Локальная сторона за NAT (Azure)
left=%defaultroute # взять интерфейс и приватный IP, через который идёт default route
leftid=@azure
leftsubnet=10.130.2.20/32 # приватный IP сервера Azure
# Удаленная сторона за NAT (AWS)
right=XX.XX.XX.XX # публичный IP сервера AWS
rightid=@aws
rightsubnet=10.130.0.30/32 # приватный IP сервера AWS
keyexchange=ikev2
auto=start
authby=psk
ike=aes256-sha256-modp2048!
esp=aes256-sha256!
dpdaction=restart
dpddelay=30s
dpdtimeout=120s
fragmentation=yes
mobike=yes
forceencaps=yes
keyingtries=%forever
sudo nano /etc/ipsec.secrets
@azure @aws : PSK "GtoKTy6Uu2wilwPakUDF7"
4. Настройка маршрутизации, если роутим подсети (IP forwarding) #
На обеих VM выполнить:
# Включить пересылку IP-пакетов в ядре
echo "net.ipv4.ip_forward = 1" | sudo tee -a /etc/sysctl.conf
# Применяем изменения
sudo sysctl -p
5. Запуск и управление #
На обеих VM выполнить:
# Перезапуск StrongSwan
sudo systemctl restart strongswan-starter
sudo systemctl enable strongswan-starter
# Проверка статуса
sudo systemctl status strongswan-starter
# Запуск туннеля вручную если не запустился автоматически
sudo ipsec up aws-to-azure # на vm-aws-ubuntu2404
sudo ipsec down aws-to-azure
sudo ipsec up azure-to-aws # на vm-azure-ubuntu2404
sudo ipsec down azure-to-aws
sudo ipsec stop
sudo ipsec start
sudo ipsec restart
6. Диагностика и логи #
# Проверка статуса туннеля
sudo ipsec status
sudo ipsec statusall
# Подробные логи
sudo journalctl -u strongswan-starter -f
# Проверка пинга через vm-aws-ubuntu2404:
ping 10.130.2.20
# Проверка пинга через vm-azure-ubuntu2404:
ping 10.130.0.30
# Мониторинг трафика
sudo tcpdump -i any -n esp or udp port 500 or udp port 4500
# Проверка, проходит ли трафик через NAT
sudo tcpdump -i any -n udp port 4500
7. Если нужно завернуть целые подсети /24 #
sudo nano /etc/ipsec.conf
# На vm-aws-ubuntu2404
conn aws-to-azure
leftsubnet=10.130.0.0/24 # Вся подсеть
rightsubnet=10.130.2.0/24 # Вся подсеть
# На vm-azure-ubuntu2404
conn azure-to-aws
leftsubnet=10.130.2.0/24 # Вся подсеть
rightsubnet=10.130.0.0/24 # Вся подсеть
Важные моменты #
- NAT-Traversal: Когда StrongSwan видит, что left (приватный IP) не совпадает с leftid (публичный IP), он автоматически включает NAT-Traversal и инкапсулирует ESP в UDP 4500.
- AWS Source/Dest Check: Нужно отключить (
EC2:Actions-Networking-Change source/destination check), если необходимо маршрутизировать трафик для других машин в подсети. - Time Sync: Убедитесь, что время синхронизировано, важно для IKEv2 (
sudo timedatectl status). - Firewall: Проверьте, что локальный фаервол на Ubuntu (
ufw status) не блокирует порты.
После настройки вы должны иметь безопасное IPSec соединение между двумя VM с шифрованием трафика.
Проверка подключения #
root@vm-aws-ubuntu2404:~# sudo ipsec status
Security Associations (1 up, 0 connecting):
aws-to-azure[1]: ESTABLISHED 4 minutes ago, 10.130.0.30[aws]...YY.YY.YY.YY[azure]
aws-to-azure{1}: INSTALLED, TUNNEL, reqid 1, ESP in UDP SPIs: c4505178_i c37cb9da_o
aws-to-azure{1}: 10.130.0.30/32 === 10.130.2.20/32
root@vm-aws-ubuntu2404:~# sudo ipsec statusall
Status of IKE charon daemon (strongSwan 5.9.13, Linux 6.8.0-100-generic, x86_64):
uptime: 4 minutes, since Feb 06 21:17:32 2026
malloc: sbrk 2846720, mmap 0, used 1104784, free 1741936
worker threads: 11 of 16 idle, 5/0/0/0 working, job queue: 0/0/0/0, scheduled: 4
loaded plugins: charon aesni aes rc2 sha2 sha1 md5 mgf1 random nonce x509 revocation constraints pubkey pkcs1 pkcs7 pkcs12 pgp dnskey sshkey pem openssl pkcs8 fips-prf gmp agent xcbc hmac kdf gcm drbg attr kernel-netlink resolve socket-default connmark forecast farp stroke updown eap-identity eap-aka eap-md5 eap-gtc eap-mschapv2 eap-dynamic eap-radius eap-tls eap-ttls eap-peap eap-tnc xauth-generic xauth-eap xauth-pam tnc-tnccs dhcp lookip error-notify certexpire led addrblock unity counters
Listening IP addresses:
10.130.0.30
Connections:
aws-to-azure: %any...YY.YY.YY.YY IKEv2, dpddelay=30s
aws-to-azure: local: [aws] uses pre-shared key authentication
aws-to-azure: remote: [azure] uses pre-shared key authentication
aws-to-azure: child: 10.130.0.30/32 === 10.130.2.20/32 TUNNEL, dpdaction=start
Security Associations (1 up, 0 connecting):
aws-to-azure[1]: ESTABLISHED 4 minutes ago, 10.130.0.30[aws]...YY.YY.YY.YY[azure]
aws-to-azure[1]: IKEv2 SPIs: 7c7449a093716c79_i* f42dbc9e4aad55ae_r, pre-shared key reauthentication in 2 hours
aws-to-azure[1]: IKE proposal: AES_CBC_256/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/MODP_2048
aws-to-azure{1}: INSTALLED, TUNNEL, reqid 1, ESP in UDP SPIs: c4505178_i c37cb9da_o
aws-to-azure{1}: AES_CBC_256/HMAC_SHA2_256_128, 1165660025 bytes_i (846182 pkts, 25s ago), 747612774 bytes_o (555043 pkts, 25s ago), rekeying in 38 minutes
aws-to-azure{1}: 10.130.0.30/32 === 10.130.2.20/32