Вигнати одного клієнта OpenVPN: kill, deny чи відкликати сертифікат?
Три дії OpenVPN прибирають клієнта, але кожна завершує різне: живу сесію, одну спробу входу або право підключитися знову. Обирайте за ідентичністю.
У нотатках у вас є 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 hold | Where it came from | What it can act on |
|---|---|---|
| Common name | CLIENT_LIST, or the auth hook | kill, and credential revocation |
| Client ID | status on the management socket | client-kill, that one session |
| Tunnel address | ROUTING TABLE, client-connect environment | Nothing 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 і виправте шар облікових даних, коли відповідь має триматися довше за сесію.