Что делаем в этой части
В первой статье мы разобрали саму технологию Site-to-Site VPN. Здесь поднимаем центральный узел: арендуем VPS, ставим strongSwan, включаем маршрутизацию между офисами, готовим firewall и даём расширенный обезличенный пример конфигурации для трёх офисов. Удалённые пользовательские клиенты требуют отдельной PKI- и клиентской проверки и в этот пример не входят.
Требования к VPS
| Параметр | Минимум | Комментарий |
|---|---|---|
| ОС | Ubuntu 24.04 LTS или Debian 12 | Актуальные пакеты strongSwan и nftables/ufw |
| CPU/RAM | 1 vCPU / 2 GB RAM | Хватает для небольшого hub-spoke контура |
| Диск | 30 GB NVMe | Логи, backup конфигов, state админки |
| Сеть | белый IPv4 | Без публичного адреса сайт-то-сайт будет сложнее поддерживать |
| Порты | UDP 500/4500 | IKEv2 и NAT-T; Cloudflare proxy эти UDP-порты не проксирует |
Если домен находится в Cloudflare, DNS-запись для VPN лучше делать отдельной, например vpn.example.com,
и ставить режим DNS only. Оранжевое облако подходит для сайта, но не для IKEv2/IPsec.
Пример адресного плана
| Узел | Назначение | Пример |
|---|---|---|
| VPS hub | strongSwan server | 203.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 1 | aes256-sha256-modp2048 | aes256gcm16-prfsha384-ecp384 |
| ESP / Phase 2 | aes256-sha256-modp2048 | aes256gcm16-ecp384 |
| Порты | UDP 500 IKE, UDP 4500 NAT-T | |
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 офиса и не создаёт сертификаты или пользователей.
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 enablenftables.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 или ID | local id, remote id, PSK на роутере и хабе |
no matching peer config | роутер ожидает другой server ID | Remote ID на роутере должен быть vpn.example.com |
| туннель online, устройств не видно | FORWARD/firewall режет трафик | ufw route, nft list ruleset, gateway конечного устройства |
| поднялась только часть сетей | не совпали traffic selectors | local_ts/remote_ts и remote subnets на роутере |
| пакеты не доходят | Cloudflare proxy или закрыт UDP | DNS only, tcpdump -ni any udp port 500 or 4500 |
| после rekey трафик пропал | роутер не переинициировал CHILD SA | DPD, 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 и сертификатов.
Источники
- официальная документация strongSwan: Installation — выбор одного способа запуска daemon;
- официальная документация swanctl.conf —
remote_addrs, DPD,start_actionи структура конфигурации; - документация ядра Linux по
rp_filter— strict, loose и disabled modes; - состав пакета EAP-плагинов Ubuntu 24.04 — расположение
eap-mschapv2; - документация Ubuntu по nftables — действие
flush rulesetи взаимодействие с другими менеджерами правил.