MyCottage.cc

Создание сервера
для объединения дома и офиса

strongSwan и Site-to-Site VPN

Современная конфигурация strongSwan через charon-systemd и swanctl: маршрутизация между объектами, UFW, проверка и безопасный запуск.

← К списку статей

Что делаем в этой части

В первой статье мы разобрали саму технологию Site-to-Site VPN. Здесь поднимаем центральный узел: арендуем VPS, ставим strongSwan, включаем маршрутизацию между офисами, готовим firewall и даём расширенный обезличенный пример конфигурации для трёх офисов. Удалённые пользовательские клиенты требуют отдельной PKI- и клиентской проверки и в этот пример не входят.

Зачем нужен VPS
Хаб должен иметь белый IPv4, стабильный канал и открытые UDP 500/4500. Один из вариантов — арендовать VPS на AEZA. Это партнёрская ссылка. Перед оплатой отдельно проверьте текущий тариф, локацию, наличие публичного IPv4 и правила использования сервиса.

Требования к VPS

ПараметрМинимумКомментарий
ОСUbuntu 24.04 LTS или Debian 12Актуальные пакеты strongSwan и nftables/ufw
CPU/RAM1 vCPU / 2 GB RAMХватает для небольшого hub-spoke контура
Диск30 GB NVMeЛоги, backup конфигов, state админки
Сетьбелый IPv4Без публичного адреса сайт-то-сайт будет сложнее поддерживать
ПортыUDP 500/4500IKEv2 и NAT-T; Cloudflare proxy эти UDP-порты не проксирует

Если домен находится в Cloudflare, DNS-запись для VPN лучше делать отдельной, например vpn.example.com, и ставить режим DNS only. Оранжевое облако подходит для сайта, но не для IKEv2/IPsec.

Пример адресного плана

УзелНазначениеПример
VPS hubstrongSwan server203.0.113.10, ID vpn.example.com
Office 1первый объектgateway 192.168.10.1, LAN 192.168.10.0/24
Office 2второй объектgateway 192.168.11.1, LAN 192.168.11.0/24
Office 3третий объектgateway 192.168.12.1, LAN 192.168.12.0/24

В примере нет вымышленной подсети «за VPS». Если у хаба действительно есть отдельная LAN или сервисная сеть, сначала настройте её интерфейс и маршруты, а затем явно добавьте эту сеть в traffic selectors и firewall.

Установка и базовая подготовка

Ниже используется один backend: charon-systemd с конфигурацией swanctl.conf. Не устанавливайте параллельно legacy starter для ipsec.conf.

apt update
apt remove -y strongswan-starter strongswan-charon
apt install -y curl ca-certificates ufw tcpdump charon-systemd strongswan-swanctl strongswan-pki
hostnamectl set-hostname vpn-hub

Дальше включаем forwarding и используем loose mode для reverse path filter. Режим 2 сохраняет проверку достижимости источника, но допускает асимметричный маршрут через другой интерфейс. Не отключайте фильтр глобально без отдельной диагностики.

cat >/etc/sysctl.d/99-vpn-forwarding.conf <<'EOF'
net.ipv4.ip_forward=1
net.ipv4.conf.all.rp_filter=2
net.ipv4.conf.default.rp_filter=2
EOF
sysctl --system

Рекомендуемые шифры и порты

Для совместимости с роутерами часто используют AES-256 / SHA-256 / DH14. Если все устройства поддерживают современные наборы, можно переходить на GCM/ECP. Главное правило: Phase 1 и Phase 2 должны совпадать на хабе и роутере.

УровеньСовместимый вариантБолее современный вариант
IKE / Phase 1aes256-sha256-modp2048aes256gcm16-prfsha384-ecp384
ESP / Phase 2aes256-sha256-modp2048aes256gcm16-ecp384
ПортыUDP 500 IKE, UDP 4500 NAT-T
Про PSK
PSK удобен для теста. В продакшене рекомендуется переход на сертификаты X.509 или минимум уникальный длинный PSK для каждого офиса.

swanctl.conf для 3 офисов

В hub-spoke схеме каждый офис видит остальные офисы через центральный VPS. Для каждого peer задаём свой remote.id и свою LAN в remote_ts. Так как адрес офиса может меняться, хаб работает ответчиком, а соединение инициирует роутер с известным адресом VPS.

# /etc/swanctl/swanctl.conf
connections {
  site-office1 {
    version = 2
    local_addrs = %any
    remote_addrs = %any
    proposals = aes256-sha256-modp2048
    dpd_delay = 30s
    local  { auth = psk; id = "vpn.example.com"; }
    remote { auth = psk; id = "office1-router"; }
    children {
      net {
        local_ts = 192.168.11.0/24,192.168.12.0/24
        remote_ts = 192.168.10.0/24
        esp_proposals = aes256-sha256-modp2048
        start_action = none
        dpd_action = clear
      }
    }
  }

  site-office2 {
    version = 2
    local_addrs = %any
    remote_addrs = %any
    proposals = aes256-sha256-modp2048
    dpd_delay = 30s
    local  { auth = psk; id = "vpn.example.com"; }
    remote { auth = psk; id = "office2-router"; }
    children {
      net {
        local_ts = 192.168.10.0/24,192.168.12.0/24
        remote_ts = 192.168.11.0/24
        esp_proposals = aes256-sha256-modp2048
        start_action = none
        dpd_action = clear
      }
    }
  }

  site-office3 {
    version = 2
    local_addrs = %any
    remote_addrs = %any
    proposals = aes256-sha256-modp2048
    dpd_delay = 30s
    local  { auth = psk; id = "vpn.example.com"; }
    remote { auth = psk; id = "office3-router"; }
    children {
      net {
        local_ts = 192.168.10.0/24,192.168.11.0/24
        remote_ts = 192.168.12.0/24
        esp_proposals = aes256-sha256-modp2048
        start_action = none
        dpd_action = clear
      }
    }
  }
}

secrets {
  ike-office1 { id = "office1-router"; secret = "CHANGE_ME_OFFICE1_LONG_RANDOM_PSK"; }
  ike-office2 { id = "office2-router"; secret = "CHANGE_ME_OFFICE2_LONG_RANDOM_PSK"; }
  ike-office3 { id = "office3-router"; secret = "CHANGE_ME_OFFICE3_LONG_RANDOM_PSK"; }
}

Шаблон добавления нового офиса

Для Office 4 добавляем новый peer, а сеть Office 4 включаем в local_ts остальных офисов. Если traffic selectors не совпадают с настройками роутеров, IKE SA может установиться, но новая сеть через туннель не пойдёт.

site-office4 {
  version = 2
  local_addrs = %any
  remote_addrs = %any
  proposals = aes256-sha256-modp2048
  dpd_delay = 30s
  local  { auth = psk; id = "vpn.example.com"; }
  remote { auth = psk; id = "office4-router"; }
  children {
    net {
      local_ts = 192.168.10.0/24,192.168.11.0/24,192.168.12.0/24
      remote_ts = 192.168.13.0/24
      esp_proposals = aes256-sha256-modp2048
      start_action = none
      dpd_action = clear
    }
  }
}

Road-Warrior не входит в этот пример

Удалённый клиент на ноутбуке или телефоне — отдельный сценарий. Для EAP-MSCHAPv2 нужны серверный сертификат, доверенный клиентом CA, пакет libcharon-extauth-plugins в Ubuntu 24.04, адресный пул, правила forwarding и отдельная проверка каждого типа клиента. Скачиваемый установщик ниже настраивает только три site-to-site офиса и не создаёт сертификаты или пользователей.

Почему здесь нет короткого фрагмента конфигурации
Конфигурация с именем сертификата без выпуска приватного ключа, цепочки доверия и импорта CA на клиент будет неполной. Публиковать её как готовую инструкцию небезопасно.

Firewall на сервере: UFW

Открыть UDP-порты недостаточно. Для hub-spoke обязательно разрешить routed forwarding между VPN-подсетями.

До включения UFW подставьте реальный SSH-порт сервера вместо 22, если он изменён.

ufw allow 22/tcp
ufw allow 500/udp
ufw allow 4500/udp
ufw route allow from 192.168.10.0/24 to 192.168.11.0/24
ufw route allow from 192.168.11.0/24 to 192.168.10.0/24
ufw route allow from 192.168.10.0/24 to 192.168.12.0/24
ufw route allow from 192.168.12.0/24 to 192.168.10.0/24
ufw route allow from 192.168.11.0/24 to 192.168.12.0/24
ufw route allow from 192.168.12.0/24 to 192.168.11.0/24
ufw --force enable
Не смешивайте firewall-инструменты
Этот сценарий управляет правилами через UFW. Не добавляйте рядом самостоятельный nftables.conf с flush ruleset: такая команда очищает существующий набор правил и может удалить правила UFW или отрезать SSH-доступ.

Применение и проверка

systemctl enable --now strongswan
swanctl --load-all
swanctl --list-conns
swanctl --list-sas
ip xfrm policy
ss -lunp | grep -E ':500|:4500'

Отладка и типичные ошибки

СимптомЧаще всего причинаЧто проверить
AUTH_FAILEDне совпал PSK или IDlocal id, remote id, PSK на роутере и хабе
no matching peer configроутер ожидает другой server IDRemote ID на роутере должен быть vpn.example.com
туннель online, устройств не видноFORWARD/firewall режет трафикufw route, nft list ruleset, gateway конечного устройства
поднялась только часть сетейне совпали traffic selectorslocal_ts/remote_ts и remote subnets на роутере
пакеты не доходятCloudflare proxy или закрыт UDPDNS only, tcpdump -ni any udp port 500 or 4500
после rekey трафик пропалроутер не переинициировал CHILD SADPD, reconnect, swanctl --terminate --ike ...
journalctl -u strongswan --no-pager -n 200
journalctl -u strongswan --follow
tcpdump -ni any udp port 500 or udp port 4500
iptables -L ufw-user-forward -n -v
nft list ruleset

Проверку между LAN запускайте с устройства внутри офиса, а не с VPS. Например, с хоста Office 1:

ping 192.168.11.10

Автоматический скрипт установки

Обезличенный пример требует явно передать домен, адреса и три уникальных PSK. При значениях CHANGE_ME, ошибке firewall, службы или загрузки конфигурации он завершается с ошибкой.

export VPN_DOMAIN="vpn.example.com"
export VPN_PUBLIC_IP="203.0.113.10"
export SSH_PORT="22" # укажите фактический порт SSH
export OFFICE1_ID="office1-router"
export OFFICE1_LAN="192.168.10.0/24"
export OFFICE1_PSK="$(openssl rand -hex 32)"
export OFFICE2_ID="office2-router"
export OFFICE2_LAN="192.168.11.0/24"
export OFFICE2_PSK="$(openssl rand -hex 32)"
export OFFICE3_ID="office3-router"
export OFFICE3_LAN="192.168.12.0/24"
export OFFICE3_PSK="$(openssl rand -hex 32)"
sudo -E bash install-strongswan-hub-example.sh

Чек-лист перед запуском

  • VPS имеет белый IPv4, UDP 500/4500 открыты.
  • DNS для VPN в режиме DNS only, если используется Cloudflare.
  • ip_forward=1; для этого примера rp_filter=2 и результат проверен по счётчикам firewall.
  • В каждом офисе уникальные Remote ID и PSK.
  • Traffic selectors зеркально совпадают с remote subnets на роутерах.
  • Firewall разрешает routed forwarding между офисными сетями.
  • Есть backup swanctl.conf, secrets и сертификатов.

Источники