Підготовка клієнта OpenVPN з етапами, що зупиняються на помилці
П'ять етапів не дають скрипту підготовки залишити половину встановлення: перевірте вхідні дані, підготуйте набір, замініть атомарно, активуйте одного власника, сплануйте виведення з експлуатації.
Скрипти підготовки, які повідомляють про помилку й продовжують роботу, гірші за скрипти, які ніколи не запускаються. Налаштування клієнта торкається захищених ключів, ідентичності на шлюзі та служби, яка, можливо, вже обслуговує трафік. Кожному з цього потрібна умова зупинки, а скрипт має знати, якого етапу він досяг, коли зупинився.
Розглядайте все як одну транзакцію з п'ятьма контрольними точками й змусьте кожну контрольну точку самостійно відмовлятися від продовження.
Виправте вхідні дані, перш ніж торкатися файлової системи
Почніть з явного договору: одна ідентичність, одне джерело профілю, один передбачуваний власник служби. Перевірте, що профіль існує, що сертифікат і ключ, на які він посилається, читабельні й що цільовий каталог належить очікуваному пакунку. Шлях, який розв'язується, не є доказом того, що матеріал за ним повний.
Відхиляйте порожні змінні одразу. Неустановлена $DEVICE, яка розгортається в ніщо, перетворює install -m 400 $KEY /etc/openvpn/client/ на копію, націлену на каталог, і збій приходить пізніше як служба, що не може прочитати свій ключ.
Зберіть набір профілів у підготовчому каталозі
Спочатку збудуйте повний набір у закритому місці: профіль, CA, клієнтський сертифікат, ключ і кожен помічник, який викликає профіль. Копіюйте через install -m 400 -o root -g root, щоб права задавалися під час створення, а не після. Потім перевірте посилання всередині профілю, бо відносний рядок ca або key розв'язується відносно робочого каталогу юніта, щойно служба запускається. У живий каталог не має бути записано нічого, доки весь набір не пройде перевірку.
Запишіть несекретний відбиток того, що створив цей запуск, наприклад sha256sum office.conf, збережений поруч із маркером версії. Саме це єдине значення дає змогу повторному запуску відрізнити оновлення від бездіяльності.
Замінюйте атомарно й зберігайте попередній набір
Перемістіть підготовлений набір на місце однією операцією там, де файлова система це дозволяє, і збережіть переглянутий попередній набір під іменем з часовою позначкою. Часткова копія, що залишає новий профіль поруч зі старим ключем, створює службу, яка автентифікується з неправильною ідентичністю і не записує нічого корисного про причину. Якщо заміна не може бути атомарною, упорядкуйте переміщення так, щоб профіль прибув останнім.
Коли ціль уже існує, явно вирішіть, чи це оновлення, чи ідентичний повтор, чи конфлікт із профілем іншого пристрою. Тихо перезаписати профіль, що належить іншій ідентичності, — це шлях, яким дві машини починають ділити один сертифікат. Натомість відмовтеся від запуску й назвіть конфліктного власника.
Активуйте одного власника й доведіть це
Виберіть один шлях активації — екземпляр systemd або NetworkManager — і використовуйте його послідовно. Запуск некерованого процесу openvpn поруч з увімкненим юнітом дає два тунелі, конкуруючі оновлення DNS і жодної ясної відповіді, на який із них спрямована команда зупинки. Після активації перевірте systemctl is-active openvpn-client@office, потім маршрут до віддаленого префікса, потім resolvectl status для резолвера, встановленого тунелем. Завершіть, досягнувши одного ресурсу, заради якого тунель існує.
Працюючий процес і зелений значок у лотку — це факти процесу, а не доказ того, що ідентичність і політика трафіку пережили передачу.
Повторний запуск і виведення з експлуатації — різні робочі процеси
Другий запуск має збігатися до тих самих перевірених файлів і того самого власника, а не створювати другий обліковий запис або другий демон. Виведення з експлуатації — це власна процедура: зупиніть точного власника, заархівуйте або видаліть локальний профіль згідно з політикою й відкличте ідентичність на шлюзі. Видалення локального файлу ключа не відкликає копію, яка вже залишила машину.
Зберігайте шлях відновлення, що не залежить від тунелю, наприклад доступ до консолі або другий маршрут керування. Зміна підготовки, яка замикає вас ззовні машини, — це невдала зміна, навіть коли кожен етап повідомив про успіх.
Скрипт, який варто зберегти, — це транзакція навколо власності й доказів. Короткий список привілейованих команд копіювання — не те саме.