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

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

Почніть із підмережі, яка вже є

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

grep -nE '^(topology|server|ifconfig-pool|max-clients|client-config-dir)' /etc/openvpn/server/lab.conf
ip -4 addr show tun0

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

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

Додайте nopool і оголосіть діапазон

Допоміжне ключове слово приймає nopool, яке зберігає конфігурацію підмережі й вимикає автоматичний динамічний пул, як описує посібник OpenVPN 2.6. Далі явний рядок ifconfig-pool задає потрібний включний діапазон, а його мережева маска збігається з підмережею. Обидва рядки належать до одного блоку сервера, бо пул без своєї підмережі не має сенсу. Порядок між ними важливий лише для читабельності, адже помічник розгортає пару під час запуску сервісу.

topology subnet
server 10.70.0.0 255.255.255.0 nopool
ifconfig-pool 10.70.0.50 10.70.0.120 255.255.255.0

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

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

Тримайте фіксовані призначення поза динамічним діапазоном

Клієнтський ifconfig-push — інший механізм, ніж розподіл із пулу, і він має використовувати параметри, що відповідають активній топології. У режимі підмережі це одна адреса й мережева маска; переносити пару net30 лише тому, що вона трапилася в старому прикладі, — поширена помилка.

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

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

Застосуйте через життєвий цикл, потім перевірте

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

systemctl restart openvpn-server@lab
journalctl -u openvpn-server@lab -n 30 --no-pager
# on a fresh client
ip -4 addr show tun0

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

Перепідключіть клієнта, який мав адресу зі старого діапазону. Він має отримати адресу з нового діапазону, а будь-який стан рівня сеансу, прив'язаний до старої адреси, має зникнути. Якщо він зберігає стару адресу, її призначає щось інше, і пул — не той власник, про який ви думаєте.

Відкат зміни діапазону

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

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

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

Схожі статті