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, каб пераканацца, што знос не пакідае састарэлага маршруту.
Трымайце маркер, інтэрфейс і шлях хука ў нататках па разгортванні. Калі пасля перазагрузкі нумар змяняецца, гэтыя тры значэнні тлумачаць, чаму скрыпт паводзіў сябе інакш без якіх-небудзь правак канфігурацыі.