IPsec Error CHILD_SA_NOT_FOUND: получен Delete для несуществующего SPI
Во время штатной работы туннеля IPsec в логах появляются следующие аномалии:
- Ошибки:
IPsec Error: CHILD_SA_NOT_FOUND: Delete received for non-existent SPI 0x...илиunable to find Child SA for delete payload. - Внезапная кратковременная потеря трафика в момент планового пересогласования ключей (Rekeying).
- Наличие зависших односторонних туннелей (пакеты отправляются, но расшифровка ответов не происходит).
1. Причины возникновения рассинхронизации SPI (RFC 7296)
Каждая Фаза 2 идентифицируется уникальным 32-битным числом — Security Parameter Index (SPI). Когда одна сторона удаляет устаревшую SA (после успешного рекеинга или по таймауту), она отправляет информационный пакет Informational Exchange (DELETE Payload) с указанием SPI. Если вторая сторона уже удалила эту SA локально или если между шлюзами возникла задержка доставки пакетов, шлюз фиксирует ошибку CHILD_SA_NOT_FOUND.
2. Просмотр активных SPI в ядре операционной системы
# Вывод всех зарегистрированных состояний SPI в Linux
ip xfrm state list
# Поиск конкретного проблемного SPI (например, c2b1a034)
ip xfrm state show spi 0xc2b1a0343. Устранение состояния гонки при Rekeying (Rekey Collision)
Если оба шлюза одновременно инициируют пересогласование ключей, создаются дублирующие SA, после чего одна из них удаляется с генерацией предупреждения.
Решение: распределите роли инициатора и ответчика через параметр rekey_margin в swanctl.conf:
connections {
site-to-site {
children {
sa-branch {
# Время жизни SA
life_time = 3600s
# Начать пересогласование за 10 минут до истечения
rekey_time = 3000s
# Случайный разброс времени старта рекея (предотвращает одновременный старт)
rand_time = 300s
}
}
}
}4. Принудительная синхронизация и очистка битых состояний
# Полный сброс всех состояний XFRM ядра (осторожно: кратковременно разорвет все туннели!)
ip xfrm state flush
ip xfrm policy flush
# Перезапуск согласования
swanctl --initiate --child sa-branch5. Настройка DPD (Dead Peer Detection) для своевременного клиринга
connections {
site-to-site {
dpd_delay = 15s
dpd_timeout = 45s
}
} Частые вопросы (FAQ)
Критична ли ошибка CHILD_SA_NOT_FOUND для работы туннеля?
В большинстве случаев единичные уведомления не критичны — они лишь информируют о том, что удаленный пир попытался удалить SA, которая уже была очищена локальным демоном. Однако массовые ошибки указывают на серьезную рассинхронизацию таблиц XFRM.
Что такое SPI в заголовке IPsec?
SPI (Security Parameters Index) — это уникальный 4-байтовый идентификатор в заголовке ESP, позволяющий шлюзу-получателю мгновенно сопоставить зашифрованный пакет с конкретными ключами и политиками безопасности.
Почему возникают 'зомби' SA в Linux XFRM?
Зомби-состояния возникают, когда управляющий демон IKE (charon) аварийно завершился или был перезапущен с ключом kill -9, не очистив предварительно созданные структуры в ядре.
Как автоматизировать очистку зависших состояний без перезапуска сети?
Используйте встроенную проверку DPD с действием 'dpdaction = restart' (или 'close'), что заставит демон штатно чистить старые SA перед созданием новых.