Хтось хоче подивитися, що клієнти надсилають через тунель, знаходить у документації гак підключення і починає писати скрипт, який ніколи не отримає жодного пакета. Гак справжній і корисний, але одиниця його роботи — сесія, а не байт. Вибір правильного компонента — це порівняння трьох місць, де може відбуватися робота, і вирішальне питання в тому, яку одиницю кожне з них справді бачить.

Що гак отримує і чого він ніколи не отримує

Гак client-connect запускається один раз, коли автентифікований клієнт встановлює сесію, у контексті процесу сервера, з документованими аргументами та змінними середовища, такими як спільне ім'я і призначена адреса. Він може записати конфігурацію для клієнта, ухвалити рішення про допуск, виділити зовнішній ресурс або зафіксувати, що з'єднання відбулося. Чого він не може — спостерігати трафік, бо на момент, коли перший пакет перетинає тунель, гак уже повернувся.

Це не обмеження, яке треба обходити. Сесійний зворотний виклик, який спробував би обробляти потік, мав би працювати весь час життя з'єднання, а скриптовий контракт демона не розрахований на таку форму. Запитайте, для чого гак, перш ніж вирішити, що він заважає.

Перепідключення також важливі. Клієнт, який відпав і підключився знову, — це нова сесія, тому все, що виділяє гак, має бути ідемпотентним або поєднаним із подією відключення, яка прибирає за собою. Стан, що витікає при кожному перепідключенні, — звичайна перша помилка в дизайні на основі гака.

Сесійна політика належить гаку

Допуск — природна робота гака. Ви знаєте, хто підключився, звідки і з яким сертифікатом, і можете вирішити, чи продовжувати цю сесію, чи відмовити. Це рішення дешеве, ухвалюється один раз і не вимагає дивитися на жоден байт навантаження.

Призначення конфігурації вкладається в ту саму форму. Гак може вибрати адресу клієнта, передати параметри, доречні для цієї особи, або записати фрагмент, який сервер читає для цього клієнта. Оскільки рішення ухвалюється на сесію, воно залишається зрозумілим, коли щось іде не так і комусь треба пояснити, чому конкретний клієнт отримав конкретну адресу.

Запис — третя відповідність. Запис аудиту про те, що сесію допущено, з її ідентичністю та часом, належить саме тут. Це не журнал трафіку, і вдавати ним не слід. Якщо згодом хтось запитає, що клієнт робив усередині тунелю, відповідь має прийти з іншого місця.

Робота з пакетами належить шляху пакетів

Якщо потрібно бачити або змінювати байти на льоту, компонент має бути на шляху пересилання: правило брандмауера з чергою, гак керування трафіком або пересилач у просторі користувача. Ці механізми бачать пакети, і в них свій стан, свої режими відмови і свій профіль продуктивності.

Редагувати навантаження на цьому рівні важче, ніж читати його. Зміна одного байта може зробити недійсним поле довжини, контрольну суму або скінченний автомат протоколу, і тунель третього рівня не захищає ні від чого з цього. Він означає лише, що ви редагуєте не зовнішні заголовки. Закладіть цю ремонтну роботу в бюджет, перш ніж комусь обіцяти переписування вмісту.

Захоплення на інтерфейсі — найдешевший інструмент цієї категорії, і це спостереження, а не редактор. Люди плутають одне з одним, бо і те, і те описують як бачення трафіку, але захоплення дає файл, а шлях пакетів дає рішення.

Зміни застосунку належать застосунку

Коли мета — змінити те, що містить запит, або те, як формується відповідь, правильне місце — сам сервіс або проксі, який навмисно завершує протокол. Ці компоненти вже розуміють запити, відповіді та автентифікацію, якої очікує застосунок, і це саме той контекст, якого бракує фільтру пакетів.

Трансляція адрес стоїть унизу цього списку недарма. Вона переписує адреси та порти й залишає навантаження недоторканим, тому не є інструментом вмісту, хоч би як часто вона з'являлася в рецепті, який теж згадує вміст.

Саме розділення цих меж робить дизайн пояснюваним. Сесійна політика в гаку, обробка пакетів на шляху пакетів і зміна застосунку там, де протокол навмисно завершується: три речення, які слугують і контрольним списком для огляду.

Де TLS усе ще завершує розмову

Одне переживає все сказане: трафік усередині тунелю, що несе HTTPS, зберігає власне шифрування транспорту. Володіння ключами VPN дає вам внутрішній IP-пакет і не дає ключів сесії для сайту на іншому кінці.

Тому гак не може переглядати вміст навіть у принципі, і тому шлях пакетів бачить шифротекст, якщо розгортання навмисно не завершує внутрішній TLS. скриптовий контракт описує, що дається гаку; про навантаження він не каже нічого, бо давати нічого.

Схожі статті