Один поднят, ноль подключается: что считает эта строка strongSwan
Старый заголовок считает ассоциации IKE, а не подсети или дочерние SA, поэтому сначала читайте загруженные определения и установленные дочерние элементы.
Прочитайте строку состояния, где сказано Security Associations (1 up, 0 connecting), и она выглядит как отчёт об одном работающем туннеле. Две подсети одновременно пропускают через него трафик, поэтому число будто лжёт. Оно не лжёт; оно считает ассоциации IKE, и одна из них может вмещать несколько дочерних. Прочитайте инвентари, прежде чем трогать предложение или маршрут.
Почему заголовок и трафик не совпадают
Старый вывод stroke называет свой итог ассоциациями безопасности и берёт его из менеджера ассоциаций IKE. Каждая установленная ассоциация IKE добавляет одну, независимо от того, сколько CHILD SA находится под ней. Один родитель IKEv2 обычно несёт несколько дочерних, по одному на пару селекторов трафика, а согласованные селекторы дочернего могут покрывать больше одного адреса или префикса. Поэтому число адресов в вашей конфигурации не имеет фиксированной связи с числом в заголовке.
Современный вывод иногда показывает итог вместо старой формулировки “up”, а демон под управлением swanctl вообще не управляется старыми настройками stroke. Не считайте данностью ни формулировку, ни правило подсчёта между версиями.
Сравните три инвентаря, прежде чем что-то менять
Начните с того, что загружено, затем с того, что согласовано, затем с того, что действительно перемещает пакеты. Это три разных вопроса, и у каждого своя команда.
swanctl --list-conns
swanctl --list-sas
Первый перечисляет определения соединений, которые демон принял. Второй перечисляет установленные ассоциации IKE с их дочерними, и именно там появляется настоящая иерархия. Определение, которое есть в файле, но отсутствует в первом списке, никогда не загружалось, и никакое число повторных попыток инициатора это не исправит. Если вместо этого вы запускаете старый интерфейс, эквивалентная пара — ipsec statusall и тот же список swanctl, в зависимости от того, какой плагин владеет конфигурацией. Не смешивайте инструменты между двумя демонами на одном хосте и не ждите одного согласованного ответа.
swanctl --list-sas --raw | head -40
ip -s xfrm state
Сырая форма держит идентификаторы и селекторы видимыми для сравнения, а список состояния ядра показывает, что стек считает установленным. Когда демон и ядро расходятся, либо демон перезапустился вокруг существующего дочернего, либо объект ядра был удалён из-под него.
Читайте иерархию, а не итог
Иллюстративный установленный родитель с двумя дочерними выглядит как один узел с двумя дочерними под ним, каждый помечен своим состоянием и режимом. Выведите фактический вывод и посчитайте дочерние сами, вместо того чтобы читать сводку, которую кто-то вставил с панели.
swanctl --list-sas
swanctl --list-conns --raw | grep -A4 'accounting'
Один родитель с двумя установленными дочерними — это здоровый туннель на две подсети. Один родитель с одним установленным и одним отсутствующим дочерним — другая ситуация, и селекторы отсутствующего дочернего — это то, что нужно сравнить с предложением удалённой стороны. Во время обновления ключей старый дочерний и его замена могут ненадолго появиться вместе. Сохраняйте отметку времени вместе со снимком, потому что подсчёт, сделанный в середине обновления, выглядит как дублирование, а сделанный после — как потеря.
Загружено, установлено и трафик, который проходит
Дочерний в установленном состоянии имеет согласованные параметры и запись в ядре. Но он не обязательно перенёс пакет: селекторы могут быть уже ожидаемого трафика, а маршрут может отправить этот трафик в другое место ещё до того, как туннель его увидит. Отправьте поток, соответствующий согласованным селекторам, с авторизованного хоста, а затем читайте счётчики дочернего, а не заголовок. Счётчик, который остаётся на нуле, пока вы генерируете подходящий трафик, указывает на маршрутизацию или политику, а не на IKE.
swanctl --initiate --child accounting
swanctl --list-sas --raw | grep -E 'bytes|packets'
Запуск именованного дочернего — это намеренное действие с видимым результатом, и оно отделяет “соединение простаивает, потому что никто не просил” от “соединение не может подняться”. Политика ловушки по требованию ведёт себя точно как первый случай, поэтому прочитайте настройку запуска соединения, прежде чем называть это неисправностью.
Когда счёт действительно неверен
Если определения нет в загруженном инвентаре, посмотрите на загрузку конфигурации и на то, какой экземпляр демона работает. Если оно загружено, но никогда не согласуется, сравните предложения, контекст аутентификации и селекторы с партнёром, по одному дочернему за раз. Меняйте по одному элементу за попытку и записывайте идентификатор, который изменили. Откатить предложение — мелочь, когда знаешь какое; это догадка после трёх правок, которые так и не разделили.
Сначала исправьте неверное прочтение. Большинство сообщений о “пропавшем” втором туннеле заканчиваются двумя установленными дочерними под одним родителем, и единственное, что когда-либо было сломано, — это строка сводки, которой люди доверяли вместо иерархии.