Хук подключения — это сессионная политика, а не фильтр пакетов
Хук client-connect срабатывает один раз за сессию и никогда не видит полезную нагрузку. Допуск — там, где есть сессии, а изменение содержимого — там, где есть запросы.
Кто-то хочет посмотреть, что клиенты отправляют через туннель, находит в документации хук подключения и начинает писать скрипт, который никогда не получит ни одного пакета. Хук настоящий и полезный, но единица его работы — сессия, а не байт. Выбор правильного компонента — это сравнение трёх мест, где может происходить работа, и решающий вопрос в том, какую единицу каждое из них действительно видит.
Что хук получает и чего он никогда не получает
Хук client-connect запускается один раз, когда аутентифицированный клиент устанавливает сессию, в контексте процесса сервера, с документированными аргументами и переменными окружения, такими как общее имя и назначенный адрес. Он может записать конфигурацию для клиента, принять решение о допуске, выделить внешний ресурс или зафиксировать, что соединение состоялось. Чего он не может — наблюдать трафик, потому что к моменту, когда первый пакет проходит через туннель, хук уже вернулся.
Это не ограничение, которое нужно обходить. Сессионный обратный вызов, который попытался бы обрабатывать поток, должен был бы работать всё время жизни соединения, а скриптовый контракт демона не рассчитан на такую форму. Спросите, для чего нужен хук, прежде чем решить, что он мешает.
Переподключения тоже важны. Клиент, который отвалился и подключился снова, — это новая сессия, поэтому всё, что выделяет хук, должно быть идемпотентным или сопряжённым с событием отключения, которое убирает за собой. Состояние, утекающее при каждом переподключении, — обычная первая ошибка в дизайне на основе хука.
Сессионная политика принадлежит хуку
Допуск — естественная работа хука. Вы знаете, кто подключился, откуда и с каким сертификатом, и можете решить, продолжать эту сессию или отказать. Это решение дешёвое, принимается один раз и не требует смотреть на единый байт нагрузки.
Назначение конфигурации укладывается в ту же форму. Хук может выбрать адрес клиента, передать параметры, подходящие этой личности, или записать фрагмент, который сервер читает для этого клиента. Поскольку решение принимается на сессию, оно остаётся понятным, когда что-то идёт не так и кому-то нужно объяснить, почему конкретный клиент получил конкретный адрес.
Запись — третье соответствие. Запись аудита о том, что сессия была допущена, с её идентичностью и временем, принадлежит именно здесь. Это не журнал трафика, и притворяться им не следует. Если позже кто-то спросит, что клиент делал внутри туннеля, ответ должен прийти откуда-то ещё.
Работа с пакетами принадлежит пути пакетов
Если требуется видеть или изменять байты на лету, компонент должен находиться на пути пересылки: правило брандмауэра с очередью, хук управления трафиком или пересыльщик в пространстве пользователя. Эти механизмы видят пакеты, и у них своё состояние, свои режимы отказа и свой профиль производительности.
Редактировать нагрузку на этом уровне труднее, чем читать её. Изменение одного байта может сделать недействительным поле длины, контрольную сумму или конечный автомат протокола, и туннель третьего уровня не защищает ни от чего из этого. Он означает лишь, что вы редактируете не внешние заголовки. Заложите эту ремонтную работу в бюджет, прежде чем кому-то обещать переписывание содержимого.
Захват на интерфейсе — самый дешёвый инструмент этой категории, и это наблюдение, а не редактор. Люди путают одно с другим, потому что и то и другое описывают как видение трафика, но захват даёт файл, а путь пакетов даёт решение.
Изменения приложения принадлежат приложению
Когда цель — изменить то, что содержит запрос, или то, как формируется ответ, правильное место — сам сервис или прокси, который намеренно завершает протокол. Эти компоненты уже понимают запросы, ответы и аутентификацию, которую ожидает приложение, и это ровно тот контекст, которого не хватает фильтру пакетов.
Трансляция адресов стоит внизу этого списка не зря. Она переписывает адреса и порты и оставляет нагрузку нетронутой, поэтому не является инструментом содержимого, как бы часто она ни появлялась в рецепте, который тоже упоминает содержимое.
Именно разделение этих границ делает дизайн объяснимым. Сессионная политика в хуке, обработка пакетов на пути пакетов и изменение приложения там, где протокол намеренно завершается: три предложения, которые служат и контрольным списком для обзора.
Где TLS всё ещё завершает разговор
Одно переживает всё вышесказанное: трафик внутри туннеля, несущий HTTPS, сохраняет собственное шифрование транспорта. Владение ключами VPN даёт вам внутренний IP-пакет и не даёт ключей сессии для сайта на другом конце.
Поэтому хук не может проверять содержимое даже в принципе, и поэтому путь пакетов видит шифротекст, если только развёртывание намеренно не завершает внутренний TLS. скриптовый контракт описывает, что даётся хуку; о нагрузке он не говорит ничего, потому что давать нечего.