Перейти к основному содержимому

Настройка IPSec между серверами Ubuntu (AWS) и Ubuntu (Azure)

·1122 слов·6 минут
Блог о Сетях, Инфраструктуре и DevOps
Автор
Блог о Сетях, Инфраструктуре и DevOps
DevOps, Infrastructure Engineer, Expert Cyber Security

Как работает StrongSwan
#

  • StrongSwan — реализация IPsec для Linux, которая позволяет строить защищённые VPN-туннели.
  • Позволяет безопасно передавать данные между серверами, облаками и офисными сетями.
  • Основные компоненты:
    • charon — демон, который управляет туннелями и IKE
    • XFRM в ядре — шифрует пакеты и применяет политики безопасности
  • Работает по протоколу IPsec, с использованием IKEv2 для обмена ключами.
  • Этапы работы:
    1. Установка IKE SA — договариваются алгоритмы шифрования и аутентификация (PSK или сертификаты).
    2. Создание CHILD SA — настраиваются туннельные ключи ESP для шифрования трафика.
    3. Шифрование пакетов — ядро 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

Related

Настройка доступа на Linux сервер по SSH ключам
·387 слов·2 минут
Настройка GRE over IPSec
·1039 слов·5 минут
Как устроен IPSec VPN
·768 слов·4 минут