Вы подняли туннель, таймер пересогласования ключей отсчитывает время, а оба направления по-прежнему показывают ноль пакетов. Ничто в этой паре чисел не говорит о том, что пир отверг ваш туннель: установленная CHILD SA с пустыми счётчиками — это нормальное состояние ассоциации, с которой пока ничего не совпало. Задача — доказать, что пакет должен был совпасть, а затем найти точку, где он ушёл с пути, описанного селекторами. Сделайте это один раз, по порядку, и сохраняйте запрос одинаковым между прогонами.

Что на самом деле доказывает нулевой счётчик

CHILD SA — это пара селекторов плюс ключи и SPI, которые шифруют трафик, попадающий в эти диапазоны. Установить её означает лишь, что оба пира договорились об этих диапазонах и выведенных ключах; ядро будет держать её часами, даже если не придёт ни одного пакета. Поэтому вопрос никогда не в том, существует ли туннель, а в том, попал ли хоть один пакет, отправленный вашим тестом, в диапазоны, согласованные двумя пирами. Если не попал ни один, счётчики остаются нулевыми, и ассоциация истекает неиспользованной в конце своего времени жизни.

Это различие меняет то, что вы проверяете первым. Отклонённое предложение, сбой аутентификации или умирающая IKE SA проявляются в журнале или в списке SA, а не как тихий ноль. Туннель, который чисто согласуется, а затем простаивает, указывает скорее на сопоставление, маршрутизацию или источник тестового трафика.

Отправьте поток, который можете описать до отправки

Выберите пункт назначения внутри защищённой подсети и откройте к нему новое соединение; страница, загруженная час назад, может прийти из кеша, а ответ из кеша никогда не касается туннеля. Затем запишите четыре значения, пока запрос ещё гипотетический: адрес источника, который свяжет приложение, пункт назначения, семейство адресов и имя или пару селекторов наблюдаемой дочерней SA. Именно эта запись превращает плоский счётчик в проверяемое утверждение.

Адрес источника — это значение, которое люди пропускают, и именно оно чаще всего ломает тест. Ноутбук с проводным адресом, адресом Wi-Fi и адресом туннеля может связать любой из них в зависимости от поиска маршрута, и только один может лежать внутри согласованного диапазона. Используйте инструмент, позволяющий закрепить источник, например ping -I 10.1.0.5 10.2.0.9 или curl --interface 10.1.0.5, чтобы пакет не мог тихо выбрать другой адрес. Когда закреплённый прогон сдвигает счётчики, а незакреплённый нет, вы нашли проблему маршрутизации, а не проблему IPsec.

Какие числа читать и где они живут

В Linux ip -s xfrm state печатает каждую ассоциацию со строкой lifetime current:, сумма байтов и сумма пакетов в которой принадлежат только этой SA, а затем строку stats: со счётчиками повторов и ошибок. На пире strongSwan swanctl --list-sas печатает по одной строке in и одной строке out на каждую установленную дочернюю SA, и каждая заканчивается числом байтов и числом пакетов; старые инструменты stroke называют ту же пару bytes_i и bytes_o. Читайте два направления отдельно, потому что находкой является то, которое осталось плоским. Сложение их вместе скрывает именно ту асимметрию, которую вы ищете.

Оба представления привязаны к ассоциации, поэтому пересогласование устанавливает новую пару SPI, и ваша базовая линия возвращается к нулю без каких-либо поломок. Запишите SPI, который наблюдаете, до срабатывания таймера пересогласования, иначе сравните новую SA со старым числом. Если исходящее растёт, а входящее остаётся плоским, селектор совпал, но ответ так и не вернулся, и это переводит расследование на пересылку у пира и его собственную политику. Документация по настройке IKEv2 strongSwan описывает жизненный цикл дочерней SA и время пересогласования, стоящее за этими числами.

Точка наблюдения — это отдельная переменная от источника пакета. Аппаратное ускорение может увеличивать счётчики ассоциации, тогда как программный захват на интерфейсе не показывает ничего, потому что пакеты, обработанные в обход, пропускают хук, на котором сидит захват, и входящий трафик может расходиться так же. Когда эти два источника не согласуются, используйте счётчики, чтобы ответить, совпало ли что-нибудь, а захват — чтобы ответить, как выглядел пакет.

Маршрут, селекторы и место рождения пакета

Сравните три вещи рядом: маршрут, который ядро выбирает для вашего пункта назначения, политику, направляющую трафик в туннель, и пару селекторов, согласованную дочерней SA. ip route get 10.2.0.9 from 10.1.0.5 называет интерфейс и источник, которые использовало бы ядро, а это часто не та пара, которую вы предполагали. ip xfrm policy показывает шаблоны и селекторы, установленные локально, а swanctl --list-sas показывает, о чём договорился пир. Поиск, который отправляет пакет через физический интерфейс, вообще не доходит до политики, поэтому счётчики не могут сдвинуться.

Несовпадения бывают нескольких видов, которые со стороны счётчика выглядят одинаково. Пункт назначения IPv6 вне селектора IPv4, адрес источника из неправильной подсети и политика уже дочерней SA дают один и тот же ноль. Сначала устраните самую узкую причину, потому что расширение селектора только ради сдвига числа меняет то, что защищает туннель.

Затем есть источник пакета — ловушка, которую шлюз ставит для собственного оператора. Трафик, который шлюз порождает сам, сопоставляется с исходящей политикой, а пакет, который он пересылает за клиента, сопоставляется с политикой пересылки, поэтому ping с коробки может пройти по пути, которым не пойдёт ни один клиент.

Одно обратимое изменение и отчёт, который выдержит проверку

Измените один элемент, повторите тот же запрос и прочитайте те же счётчики. Очистка всех правил брандмауэра или замена всех селекторов сразу сдвинет число и уничтожит доказательства, которые говорили вам почему. Если второй прогон по-прежнему показывает ноль, вы исключили одну гипотезу вместо того, чтобы потратить день впустую.

Запишите находку в форме, которую сможет воспроизвести другой человек: имя дочерней SA, принятые диапазоны, закреплённый вами источник, проверенный пункт назначения, направление, оставшееся нулевым, и SPI, который вы читали. Это предложение отделяет ассоциацию, которой никто не пользовался, от удалённого приложения, которое получило трафик и отказало. Откатите изменение, если оно не сдвинуло счётчики, и сохраните запись; следующий человек начнёт там, где остановились вы. Ничего в туннеле не пришлось перестраивать, и в этом смысл проверки сопоставления до того, как трогать конфигурацию.

Похожие статьи