Яку адресу пул видасть під час наступного перепідключення?
Адреси пулу підкоряються порядку, який не є випадковим: спершу запам’ятована адреса, потім вільна, найдовше невикористовувана. Прочитайте його, перш ніж закріплювати правило.
Правило, яке відповідало вчора, перестає відповідати сьогодні, бо клієнт повернувся з іншою адресою тунелю. Розподільник однак не випадковий, і знання його порядку перетворює цей сюрприз на передбачувану подію. Він віддає перевагу адресі, яку той самий клієнт мав раніше, відступає до вільної адреси, що найдовше простоювала, і забуває все, якщо не дати йому місця для запам’ятовування. Правила, що розраховують на оренду, відповідають далі до дня, коли тихо перестають.
Порядок, якого дотримується розподільник
За однієї сесії на common name розподільник спершу шукає адресу, яку той самий клієнт використовував раніше і яка зараз вільна. Якщо цієї адреси немає, він бере вільну адресу, що найдовше була неактивною. Коли для того самого імені ввімкнено паралельні сесії, перевага попередній адресі не діє, і натомість використовується перша вільна адреса, бо сесії розглядаються як окремі однорангові вузли.
| Situation | Address chosen | Practical effect |
|---|---|---|
| Reconnect, old address still free | The remembered address | Rules appear stable for days |
| Old address taken by another client | Least recently used free address | A working rule silently stops matching |
| Concurrent sessions, same name | First free address, per session | One identity can hold several leases |
Звідси одразу випливають два наслідки. Клієнт, який швидко перепідключається, зазвичай зберігає свою адресу, тому ніхто не помічає механізм, доки він не зміниться. А інший пристрій, що підключився в це коротке вікно, може зайняти адресу, поки вона ненадовго вільна, після чого перший клієнт отримує щось інше, і будь-яке правило, прив’язане до старого номера, хибне. Жодна з цих двох подій не створює рядка журналу, схожого на збій.
Чому оренда здається стабільною, а потім зміщується
Стабільність тут — емерджентна властивість перепідключень, що надходять раніше, ніж хтось інший займе адресу. Це не обіцянка, і вона не забезпечується, поки клієнт відключений. Плануйте зміну адреси, а не дивуйтеся їй. Пул, що ледь перевищує кількість пристроїв, робить колізії звичними, бо в відступу до найдавнішої вільної адреси майже немає з чого вибирати.
Пікова одночасність — це число, під яке треба проєктувати, а не кількість користувачів. Хтось, хто тестує з двох пристроїв одразу, або клієнт, який перепідключається до завершення старої сесії, на якийсь час займає дві оренди. Пул, розрахований лише за кількістю людей, породить саме ту плинність, у якій люди звинувачують сервер.
Файл постійності пам’ятає, але не резервує
Адресі, що переживає перезапуск служби, потрібен файл постійності. Він зберігає ім’я клієнта й адресу під час вимкнення та зчитує їх під час запуску служби, тому плановий перезапуск більше не перемішує всі правила, які ви написали.
ifconfig-pool-persist /etc/openvpn/ipp.txt
server 10.8.0.0 255.255.255.0
Чого він не робить — не утримує адресу, поки клієнт відсутній. У цей проміжок розподільник вільний віддати номер комусь іншому, і файл тоді фіксує застарілу перевагу, яку наступне підключення не може виконати. Ставтеся до нього як до підказки, що покращує поведінку під час перезапуску, а не як до статичної адресації.
Перевірте пул щодо кожної маршрутизованої підмережі, поки ви у файлі. Перекривний діапазон роздає адреси, до яких сервер не може маршрутизувати, а симптом — клієнт, який підключається, отримує адресу і нічого не досягає.
Як правильно закріпити адресу
Коли правилу брандмауера або запису DNS справді потрібна фіксована адреса, призначте її, а не сподівайтеся. Запис конфігурації для окремого клієнта може напряму передати адресу й маску, і цей запис прив’язаний до чинного імені клієнта.
# client-config-dir entry for "laptop-acme"
ifconfig-push 10.8.0.50 255.255.255.0
Тримайте фіксовані адреси поза динамічним пулом, щоб розподільник ніколи не віддав той самий номер іншій сесії. Потім перевірте топологію тунелю, бо вона змінює, скільки адрес пулу витрачає кожен клієнт: старіша схема «точка-точка» витрачає невеликий блок на клієнта, тоді як підмережева схема використовує по одній адресі. Пул, що здається щедрим за однієї топології, може вичерпуватися за іншої.
Підтвердьте результат на клієнті, а не довіряйте обліку сервера. Коли сесія повернеться, подивіться на адресу інтерфейсу й переданий маршрут, бо журнал на сервері може повідомляти запитану адресу, тоді як інтерфейс має іншу.
Віддалена адреса — окреме питання
Адреса в рядку remote у клієнта має бути досяжною до того, як з’явиться будь-який тунель. Якщо вписати туди адресу пулу, наприклад власну кінцеву точку тунелю сервера, клієнт намагатиметься дістатися цієї точки через тунель, якого ще не збудував, і результатом буде петля або тихий тайм-аут замість короткого шляху.
Використовуйте публічну кінцеву точку, яку надав оператор, і залиште пул для того, для чого він призначений: адрес усередині тунелю. Запис діапазону пулу, фіксованих призначень і шляху файлу постійності в одному місці позбавить наступну людину ставлення до кожної оренди як до довільної.