IPsec IKEv2 VPN на StrongSwan: настройка для филиалов

Почему IPsec IKEv2 для межофисного VPN

IPsec с протоколом IKEv2 — стандартное решение для связи филиалов через интернет. Преимущества перед альтернативами:

  • Аппаратное ускорение — AES-NI на современных процессорах обеспечивает гигабитное шифрование без нагрузки на CPU
  • Нативная поддержка — IPsec поддерживают все ОС, роутеры и файрволы
  • IKEv2 mobility — автоматическое восстановление туннеля при смене IP (MOBIKE)
  • Стандарт RFC — совместимость между вендорами (Cisco, Juniper, MikroTik, Linux)
  • Производительность — работа на уровне ядра, минимальные накладные расходы

StrongSwan — зрелая open-source реализация IPsec для Linux, поддерживающая IKEv1/IKEv2, X.509-сертификаты, EAP и интеграцию с RADIUS. Используется в корпоративных VPN-шлюзах.

Схема сети

Типичная топология для трёх филиалов:

Центральный офис (HQ):  203.0.113.1 / 10.0.0.0/24
Филиал 1 (Branch1):     198.51.100.1 / 10.1.0.0/24
Филиал 2 (Branch2):     192.0.2.1    / 10.2.0.0/24

HQ выступает хабом — филиалы подключаются к нему. Трафик между филиалами маршрутизируется через HQ. Для полной связности (mesh) каждый филиал также может установить прямые туннели друг к другу.

Установка и базовая настройка StrongSwan

Установите StrongSwan на все VPN-шлюзы:

# Debian/Ubuntu
sudo apt install strongswan strongswan-pki libcharon-extra-plugins

# CentOS/RHEL
sudo dnf install strongswan

Включите IP-форвардинг (обязательно для маршрутизации между сетями):

cat >> /etc/sysctl.d/99-vpn.conf <<'EOF'
net.ipv4.ip_forward = 1
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv6.conf.all.forwarding = 1
EOF

sudo sysctl --system

Настройте файрвол для IPsec:

# UFW
sudo ufw allow 500/udp   # IKE
sudo ufw allow 4500/udp  # NAT-T
sudo ufw allow proto esp  # ESP

# iptables
iptables -A INPUT -p udp --dport 500 -j ACCEPT
iptables -A INPUT -p udp --dport 4500 -j ACCEPT
iptables -A INPUT -p esp -j ACCEPT

# Masquerade для трафика между сетями
iptables -t nat -A POSTROUTING -s 10.0.0.0/8 -o eth0 -m policy --dir out --pol ipsec -j ACCEPT
iptables -t nat -A POSTROUTING -s 10.0.0.0/8 -o eth0 -j MASQUERADE

Создание PKI для IPsec

Для продакшена используйте сертификаты вместо PSK. Создайте собственный CA:

# Создание корневого CA
pki --gen --type rsa --size 4096 --outform pem > /etc/swanctl/private/ca-key.pem
pki --self --ca --lifetime 3650 \
    --in /etc/swanctl/private/ca-key.pem \
    --dn "C=RU, O=Company, CN=VPN Root CA" \
    --outform pem > /etc/swanctl/x509ca/ca-cert.pem

# Сертификат HQ-шлюза
pki --gen --type rsa --size 2048 --outform pem > /etc/swanctl/private/hq-key.pem
pki --req --type priv --in /etc/swanctl/private/hq-key.pem \
    --dn "C=RU, O=Company, CN=vpn-hq.company.ru" \
    --san vpn-hq.company.ru --san 203.0.113.1 \
    --outform pem > /tmp/hq.csr
pki --issue --cacert /etc/swanctl/x509ca/ca-cert.pem \
    --cakey /etc/swanctl/private/ca-key.pem \
    --in /tmp/hq.csr --lifetime 730 \
    --flag serverAuth --flag ikeIntermediate \
    --outform pem > /etc/swanctl/x509/hq-cert.pem

# Аналогично для Branch1
pki --gen --type rsa --size 2048 --outform pem > branch1-key.pem
pki --req --type priv --in branch1-key.pem \
    --dn "C=RU, O=Company, CN=vpn-branch1.company.ru" \
    --san vpn-branch1.company.ru --san 198.51.100.1 \
    --outform pem > /tmp/branch1.csr
pki --issue --cacert /etc/swanctl/x509ca/ca-cert.pem \
    --cakey /etc/swanctl/private/ca-key.pem \
    --in /tmp/branch1.csr --lifetime 730 \
    --outform pem > branch1-cert.pem

Конфигурация HQ-шлюза (hub)

Файл /etc/swanctl/swanctl.conf на центральном шлюзе:

connections {
    branch1 {
        version = 2
        local_addrs = 203.0.113.1
        remote_addrs = 198.51.100.1
        
        local {
            auth = pubkey
            certs = hq-cert.pem
            id = vpn-hq.company.ru
        }
        remote {
            auth = pubkey
            id = vpn-branch1.company.ru
        }
        
        children {
            branch1-tunnel {
                local_ts = 10.0.0.0/24
                remote_ts = 10.1.0.0/24
                start_action = start
                close_action = restart
                dpd_action = restart
                esp_proposals = aes256gcm128-sha256-modp2048
            }
        }
        
        proposals = aes256-sha256-modp2048
        dpd_delay = 30s
        rekey_time = 24h
    }
    
    branch2 {
        version = 2
        local_addrs = 203.0.113.1
        remote_addrs = 192.0.2.1
        
        local {
            auth = pubkey
            certs = hq-cert.pem
            id = vpn-hq.company.ru
        }
        remote {
            auth = pubkey
            id = vpn-branch2.company.ru
        }
        
        children {
            branch2-tunnel {
                local_ts = 10.0.0.0/24,10.1.0.0/24
                remote_ts = 10.2.0.0/24
                start_action = start
                close_action = restart
                dpd_action = restart
                esp_proposals = aes256gcm128-sha256-modp2048
            }
        }
        
        proposals = aes256-sha256-modp2048
    }
}

Обратите внимание: local_ts для branch2 включает подсеть branch1 — это обеспечивает маршрутизацию трафика между филиалами через HQ.

Конфигурация филиала

Файл /etc/swanctl/swanctl.conf на шлюзе Branch1:

connections {
    to-hq {
        version = 2
        local_addrs = 198.51.100.1
        remote_addrs = 203.0.113.1
        
        local {
            auth = pubkey
            certs = branch1-cert.pem
            id = vpn-branch1.company.ru
        }
        remote {
            auth = pubkey
            id = vpn-hq.company.ru
        }
        
        children {
            to-hq-tunnel {
                local_ts = 10.1.0.0/24
                remote_ts = 10.0.0.0/24,10.2.0.0/24
                start_action = start
                close_action = restart
                dpd_action = restart
                esp_proposals = aes256gcm128-sha256-modp2048
            }
        }
        
        proposals = aes256-sha256-modp2048
        dpd_delay = 30s
    }
}

Запуск и проверка:

sudo systemctl restart strongswan
sudo swanctl --load-all
sudo swanctl --list-sas

# Проверка связности
ping -c 3 10.0.0.1  # HQ из Branch1

Поддержка динамического IP

Если у филиала динамический IP, используйте %any на стороне HQ:

connections {
    branch-dynamic {
        remote_addrs = %any
        
        remote {
            auth = pubkey
            id = vpn-branch1.company.ru
            # Аутентификация по сертификату, не по IP
        }
        # ...
    }
}

IKEv2 MOBIKE автоматически обновит туннель при смене IP без перезапуска.

Мониторинг и диагностика

Команды для мониторинга состояния VPN:

# Активные туннели
sudo swanctl --list-sas

# Статистика трафика
sudo swanctl --list-sas --raw | grep bytes

# Журнал событий
sudo journalctl -u strongswan --since "1 hour ago" --no-pager

# Детальная диагностика (увеличьте verbosity)
sudo swanctl --log --level 2

Скрипт мониторинга с алертом при падении туннеля:

#!/bin/bash
# /opt/scripts/check-vpn.sh
TUNNELS=$(sudo swanctl --list-sas 2>/dev/null | grep -c "ESTABLISHED")
EXPECTED=2  # количество филиалов

if [ "$TUNNELS" -lt "$EXPECTED" ]; then
    echo "VPN ALERT: $TUNNELS/$EXPECTED tunnels active" | \
        mail -s "VPN Tunnel Down" admin@company.ru
    
    # Попытка переподключения
    sudo swanctl --initiate --child branch1-tunnel 2>&1
fi

Добавьте в systemd timer для проверки каждые 5 минут.

Отказоустойчивость и оптимизация

Для критичных соединений настройте резервный туннель через второго провайдера:

connections {
    branch1-primary {
        remote_addrs = 198.51.100.1
        # ... основной туннель через провайдер 1
        children {
            branch1-primary {
                local_ts = 10.0.0.0/24
                remote_ts = 10.1.0.0/24
                start_action = start
                priority = 100
            }
        }
    }
    
    branch1-backup {
        remote_addrs = 198.51.200.1  # второй IP филиала
        # ... резервный туннель через провайдер 2
        children {
            branch1-backup {
                local_ts = 10.0.0.0/24
                remote_ts = 10.1.0.0/24
                start_action = start
                priority = 200
            }
        }
    }
}

Оптимизация MTU для предотвращения фрагментации:

# На интерфейсах VPN-шлюзов
ip link set dev eth0 mtu 1500

# IPsec overhead: ~60 байт для ESP+IKEv2
# Рекомендуемый MTU для внутренних хостов: 1400
# Или настройте MSS clamping:
iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN \
    -m policy --dir in --pol ipsec \
    -j TCPMSS --set-mss 1360

Часто задаваемые вопросы

IKEv2 быстрее устанавливает соединение (4 сообщения вместо 9), поддерживает MOBIKE (автоматическое переключение при смене IP), имеет встроенный NAT-T и более безопасную модель аутентификации. IKEv1 следует использовать только для совместимости со старым оборудованием.

Да, Pre-Shared Key проще в настройке. Укажите auth = psk и задайте ключ в секции secrets. Однако для более чем двух узлов PSK неудобен: при компрометации одного ключа нужно менять на всех. Сертификаты позволяют отозвать один без влияния на остальные. Для тестов и малых сетей (2–3 узла) PSK допустим.

Настройте full-mesh топологию: каждый филиал устанавливает прямые туннели с каждым другим. Для 3 филиалов это 3 туннеля, для 5 — уже 10. При большом количестве филиалов используйте route-based VPN с протоколом динамической маршрутизации (OSPF/BGP поверх IPsec через VTI-интерфейсы).

С AES-NI на современном процессоре (Xeon, Ryzen) StrongSwan обеспечивает 1–5 Гбит/с шифрованного трафика на одном ядре. Для AES-256-GCM — около 3 Гбит/с. Основной bottleneck — ширина канала интернет-провайдера, а не шифрование. Для 100 Мбит/с канала между филиалами нагрузка на CPU будет менее 5%.

Нужна помощь с настройкой?

Специалисты АйТи Фреш помогут с внедрением и настройкой — 15+ лет опыта, обслуживание от 15 000 ₽/мес

📞 Связаться с нами
#IPsec VPN#IKEv2 StrongSwan#site-to-site VPN#VPN между офисами#StrongSwan настройка#IPsec туннель Linux#корпоративный VPN#VPN для филиалов
Комментарии 0

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

загрузка...