Тунель працуе, вы закрываеце запасны тэрмінал, і VPN падае без аднаго націску клавішы ў кліенце. У кліенце AnyConnect для Linux заяўленая прычына — улік сеансаў, а не маршрутызацыя: кліент запісвае, якія сеансы ўваходу існавалі ў момант падняцця тунеля, і лічыць заканчэнне любога з іх падставай яго разбурыць. Праверкі ніжэй выконваюцца па парадку, і першая няўдалая паказвае, ці маеце вы справу з гэтымі паводзінамі наогул. Нішто ў звычайным вывадзе кліента не згадвае тэрмінал, таму першы інстынкт, вінаваціць канцэнтратар, звычайна марная праца.

Не пачынайце з рэдагавання сістэмных файлаў. Кожны крок альбо тлумачыць абрыў, альбо прыбірае кандыдата, і танныя крокі ідуць першымі.

Аддзяліце абрыў сеанса ад абрыву сеткі

Падключыцеся зноў адразу пасля раз'яднання. Тунель, які вяртаецца за секунды, у той жа сетцы, без новых уліковых даных, паказвае на лакальны трыгер, такі як закрыты сеанс, а не на мёртвы канал, роўмінг Wi-Fi або таймаўт бяздзейнасці на канцэнтратары. Тунель, які завісае на Connecting або не ўсталёўваецца, пакуль вы не зменіце сетку, гэта іншы артыкул.

Запішыце, што было адкрыта ў момант падняцця тунеля: тэрмінал, з якога вы запусцілі кліент, любая другая абалонка, графічны ўваход і любы сеанс SSH з іншай машыны. Гэты спіс хутка спатрэбіцца, а ўзнаўляць яго па памяці пасля наступнага абрыву ненадзейна.

Праверце, што кліент запісаў у момант падключэння

Кліент не даследуе бацькоўскія працэсы або ўласнасць тэрмінала. Ён здымае здымак мноства сеансаў уваходу, якія існавалі ў момант падключэння, і пазней параўноўвае гэтае мноства; калі элемент знікае, параўнанне не праходзіць, і тунель ідзе разам з ім. Таму закрыццё акна, з якога вы падключыліся, можа быць бясшкодным, а закрыццё старонняга запаснога тэрмінала забівае злучэнне: важна, ці быў гэты сеанс у зыходным мностве. Праверка гэта параўнанне мностваў, а не падлік, таму замена сеанса можа быць такой жа фатальнай, як страта аднаго.

Пералічыце, што кліент бачыў, перш чым нешта змяніць:

who
w
last -n 10
sudo ls -l /run/utmp

Кожны радок з who гэта запіс працэсу карыстальніка ў utmp. Калі ваш сеанс з'яўляецца двойчы, аднойчы для графічнага ўваходу і аднойчы для тэрмінала, абодва запісы існавалі ў момант падключэння і абодва з'яўляюцца кандыдатамі.

Выдаліце з utmp толькі свой запіс

Апублікаваны абыходны шлях робіць сеанс, які вы збіраецеся выкарыстаць, нябачным у utmp да запуску кліента. Невялікая праграма на C праходзіць па getutent(), знаходзіць запіс, чыё ut_line роўнае TTY стандартнага ўводу, і затым перазапісвае гэты запіс. Парадак наўмысны: setutent(), прачытаць запіс, скапіяваць яго ut_id, усталяваць ut_type у DEAD_PROCESS, ачысціць палі карыстальніка і радка, запісаць назад праз pututline(), затым endutent().

Скампілюйце яе, затым запусціце ад імя root з абалонкі, якая будзе запускаць кліент:

sudo ./utmpremove && /opt/cisco/anyconnect/bin/vpn -s connect vpn.example.edu

Дзве прычыны няўдач тлумачаць большасць паведамленняў пра тое, што інструмент нічога не робіць. Ён дзейнічае на TTY, далучаным да стандартнага ўводу, таму запуск са скрыпта або задання cron без тэрмінала не пакідае яму што супастаўляць. І /run/utmp не даступны для запісу звычайным карыстальнікам, таму запуск без root маўкліва няўдалы, калі не праверыць код выхаду.

Пераканайцеся, што тунель перажывае закрыццё

Праверце механізм замест здагадак. Падключыцеся з сеанса, які маеце намер трымаць, адкрыйце другі тэрмінал, зачыніце другі, затым пацвердзіце, што тунель яшчэ працуе, з дапамогай vpn state і позірку на спіс інтэрфейсаў. Калі тунель перажыў, трыгерам быў пэўны тып сеанса, а не кожны сеанс, і вы знайшлі сеанс, які павінен заставацца адкрытым.

Калі ён усё яшчэ падае, назіраны сеанс быў у іншым месцы, найчасцей гэта графічны ўваход, які спарадзіў ваш тэрмінал, і выдаленне аднаго запісу TTY не дапаможа. Паўтарыце назіранне з поўным спісам з першага кроку, а не дадавайце болей хірургіі.

Калі перазапіс utmp гэта няправільны адказ

utmp гэта супольны ўлік, а не прыватная табліца. Перазапіс запісу сеанса, які яшчэ жывы, прымушае who, w і некаторыя аўдытарскія інструменты паказваць яго няпоўна, а праграма, якая пазней зачыніць той жа запіс, можа цалкам збаіць. Трымайце інструмент абмежаваным вашым сеансам, захоўвайце копію зыходнага файла і не ператварайце яго ў службу загрузкі, што выдаляе кожны запіс.

Калі ваш сайт збірае ўлік сеансаў для адпаведнасці, абыходны шлях супярэчыць гэтаму патрабаванню, і падтрыманы адказ гэта версія кліента або іншы спосаб доступу, а не папраўлены utmp. Для большасці людзей найменш інвазіўнае рашэнне проста запускаць кліент з сеанса, які застанецца адкрытым увесь дзень, і не чапаць гэтае акно.

Перш чым зачыніць тыкет, запішыце, за якім сеансам назіраў кліент у момант падняцця тунеля. Менавіта гэты адзін радок ператварае таямнічае раз'яднанне ва ўзнаўляльную ўмову для наступнага чалавека на машыне.

Падобныя артыкулы