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

Яка ідентичність у вас насправді

Файл стану версії 3 — звичайна відправна точка. Секція CLIENT_LIST несе common name, реальну адресу, лічильники байтів і час підключення; секція ROUTING TABLE зіставляє віртуальну адресу з common name і позначкою часу останнього посилання. Common name — це стійка ідентичність. Віртуальна адреса — це призначення, а реальна адреса за NAT може змінюватися між сесіями, поки на сервері нічого не змінюється.

Інтерфейс керування показує схожу картину через свою команду status і додає ID клієнта для кожної сесії. Саме цього ID чекає client-kill, і це не тунельна адреса. Якщо потрібно знати, який common name отримав яку адресу в момент підключення, середовище скрипта client-connect має обидва разом із довіреною зовнішньою адресою, але цей скрипт виконується як користувач OpenVPN і потребує шляху до журналу, у який можна писати.

What you holdWhere it came fromWhat it can act on
Common nameCLIENT_LIST, or the auth hookkill, and credential revocation
Client IDstatus on the management socketclient-kill, that one session
Tunnel addressROUTING TABLE, client-connect environmentNothing durable, the address is recycled

Убити зараз, відмовити під час входу, відкликати назавжди

Обидві команди видалення в інтерфейсі керування — це дії сесії. kill приймає common name або реальну адресу та порт; client-kill приймає ID клієнта і негайно завершує цей екземпляр. Жодна не є блокуванням: вигнаний клієнт із чинним сертифікатом і паролем підключається знову за секунди, що добре, коли ви перевикористовуєте тестовий peer, і марно, коли ноутбук украли.

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

Довготривале видалення лежить нижче за все це. Відкличте сертифікат і переконайтеся, що crl-verify вказує на список, який сервер справді перезавантажує, вимкніть конфігураційний файл, специфічний для клієнта, у каталозі ccd або вимкніть обліковий запис у тому backend, який опитує хук автентифікації. Відкликання теж не миттєве: з налаштуваннями reneg-sec за замовчуванням встановлена сесія може працювати до переузгодження, тож дія сесії й дія облікових даних доповнюють одна одну, а не замінюють.

Чи вільний сокет керування?

Інтерфейс керування обслуговує одного клієнта за раз. Якщо GUI або демон моніторингу вже тримає з'єднання, ваш скрипт не може приєднатися поруч, і залежно від клієнта ви можете витіснити наявний, а не чисто завершитися помилкою. Його пароль іде відкритим текстом цим сокетом, тому йому місце на локальній адресі або unix-сокеті, ніколи на публічному інтерфейсі.

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

Послідовність, яку я виконую на живому сервері

Підключіться, прочитайте поточний стан, дійте за щойно прочитаним ID і прочитайте його знову. Значення, скопійовані з документа, — найчастіший спосіб убити не ту людину.

status                     # note the client ID and common name
client-kill 3              # end that session now
kill Test-Client           # alternative: by common name
status                     # confirm the session is gone

Ім'я та число вище — заповнювачі, а ID використовуються повторно після відключення інших клієнтів. Переконайтеся, що рядка немає, перш ніж записати щось як зроблене, і перевірте, що кількість підключених клієнтів змінилася на один, а не на кілька.

Переконайтеся, що він залишився зовні

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

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

Схожі статті