Скриптът на хука се задейства, чете 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, за да потвърдите, че разчистването не оставя остарял маршрут.

Пазете маркера, интерфейса и пътя до хука в бележките за внедряване. Когато номерът се смени след рестарт, тези три стойности обясняват защо скриптът се е държал различно без никаква промяна в конфигурацията.

Подобни статии