ppp0 чи ppp1? Як назвати сесію PPP VPN для скриптів
pppd надає кожній сесії ім’я інтерфейсу та маркер профілю. Читайте обидва з хука, а не з ppp0. Фіксоване ім’я резервуйте лише тоді, коли відмова навмисна.
Хук-скрипт спрацьовує, читає ppp0 і застосовує маршрути до того інтерфейсу, який у цей момент носить це ім’я. Іноді це потрібний вам тунель; іноді — сесія, що підключилася хвилиною раніше. Наступне перепідключення зсуває номер, і той самий скрипт тихо налаштовує не той зв’язок. Рішення — брати інтерфейс із щойно виконаного виклику й нести поруч із ним потрібний профіль.
Простежте одну сесію від опцій до хука
Почніть там, де створюється сесія. xl2tpd запускає pppd із файлом опцій, указаним у pppoptfile цього тунелю, тож плагін, номер пристрою й будь-який маркер профілю визначаються там, а не в глобальному файлі. Менеджер з’єднань може генерувати власні опції, тобто редагування /etc/ppp/options не доводить, що потрібний вам тунель змінився. Коли з’єднання піднімається, pppd запускає скрипти сповіщень із диспетчера дистрибутива. Ці скрипти отримують ім’я інтерфейсу першим аргументом, а маркер профілю — шостим.
Середовище несе ті самі факти під іменами на кшталт IFNAME і PPP_IPPARAM, але їхня доступність залежить від встановленого диспетчера. Прочитайте диспетчер, перш ніж покладатися на змінну: одні дистрибутиви зберігають порядок аргументів upstream, інші фільтрують середовище перед викликом вашого скрипта. Скрипт, який використовує лише $1 і шостий аргумент, працює в обох випадках.
Читайте інтерфейс із виклику
Традиційний хук отримує інтерфейс першим. Це позиційне значення — ідентифікатор інтерфейсу, що описує сесію, яка запустила скрипт. Збережіть його в змінній на початку, а потім використовуйте цю змінну для маршрутів, правил брандмауера й розбирання.
ipparam office-vpn
Прикріплюйте маркер профілю там, де визначено опції, а не в скрипті. З цим рядком у файлі опцій тунелю кожна сесія, створена з цього файлу, несе office-vpn як шостий аргумент. Скрипт може розгалужуватися за маркером, діючи при цьому на реальному інтерфейсі. Тримайте ці дві речі окремо в коді, бо маркер стабільний, а інтерфейс виділяється на кожну сесію.
Запитуйте ім’я лише якщо відмова правильна
Фіксоване ім’я виглядає простіше за читання аргументів, але змінює поведінку при збої. Опція unit запитує номер для вихідного з’єднання, і pppd переходить до динамічного виділення, коли цей пристрій уже зайнятий. Ніщо в цьому результаті не резервує ppp0 для вашого профілю.
ifname ppp-office
Опція ifname поводиться інакше: якщо запитане ім’я вже використовується або його не можна призначити, pppd завершується, а не вибирає інше. Це вибір політики, а не косметичне перейменування. Використовуйте її, коли другий одночасний екземпляр того самого профілю має бути відхилений, і переконайтеся, що встановлений pppd і ваш менеджер з’єднань передають цю опцію.
Так чи інакше, ім’я, яке бачить скрипт, — це те, за яким треба діяти. Налаштоване ім’я не скасовує потреби читати виклик, бо перезапущена сесія все ще може подати інше ім’я, ніж попередня.
Узгодьте розбирання з налаштованою сесією
Маршрути й правила брандмауера переживають скрипт, що їх створив, тому розбирання має видаляти саме ті об’єкти, якими володіє сесія. Позначайте правила маркером профілю, а також інтерфейсом, і видаляйте за цією міткою. Якщо два тунелі можуть бути активними, видалення всього, що згадує ppp, — це спосіб, у який одне відключення ламає інше з’єднання.
Перевірте випадок, який виявляє помилку: підніміть другу сесію PPP, поки перша ще підключена, потім перепідключіть першу й подивіться, який інтерфейс повідомляє хук. Успішний запуск з однією сесією нічого не доводить про виділення імен. Повторіть із зупиненим VPN, щоб переконатися, що розбирання не залишає застарілого маршруту.
Зберігайте маркер, інтерфейс і шлях до хука в нотатках про розгортання. Коли після перезавантаження номер змінюється, ці три значення пояснюють, чому скрипт поводився інакше без жодних правок конфігурації.