Вътрешно име все още се разпознава към VPN сървъра ден след затварянето на тунела, а файлът на резолвера продължава да се връща с този запис. Там, където състоянието се държи от resolvconf на Debian, този файл се сглобява от записи на доставчици и един от тях е остатъкът. Изтриването на записа отнема минута; доказването, че е безопасно да се изтрие, е истинската работа. Тези порти се изпълняват по ред и провалена порта прекратява процедурата, вместо да ви изпрати към следващата стъпка.

Потвърдете, че resolvconf държи състоянието

Първо определете собственика, защото същият симптом под systemd-resolved изисква различни команди и различно поправяне. Пакетът resolvconf държи база данни под /run/resolvconf и насочва /etc/resolv.conf към файла, който изгражда от тази база. Две проверки решават въпроса: целта на символната връзка и дали пакетът е инсталиран и активен. Цел под /run/systemd/resolve означава другия дизайн, при който нищо по-долу не важи.

dpkg -l resolvconf | tail -1
ls -l /etc/resolv.conf
systemctl is-active resolvconf.service

Ако връзката сочи другаде или пакетът липсва, спрете тук. Съвместима обвивка, която е заела името и се доставя от друг мениджър на резолвера, не притежава тази база.

Базата държи входове, не отговора

Базата държи входове, а файлът е изход, затова изброяването на входовете е единственият начин да видите коя програма е инсталирала записа, който искате да премахнете. Записите са кратки, а ключовете им са дръжките, които ще ви трябват по-късно. Прочетете ги, преди да решите кой е остарял, защото име, което изглежда като VPN интерфейс, може да принадлежи на друг клиент. Дръжте частните адреси и вътрешните домейни за търсене извън споделената диагностика; обикновено само ключът идентифицира записа.

sudo resolvconf --list
sudo resolvconf -i

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

Копирайте ключа от изхода, вместо да го преизграждате. Записът не се нарича tun0 само защото стар скрипт е използвал това име.

Докажете, че записът няма собственик

Записът е безопасен за изтриване, когато нито една жива връзка не го е инсталирала. Свържете ключа с връзката, която го е създала, после потвърдете, че тази връзка е изчезнала. Тази връзка е цялата порта и това е стъпката, която най-често се пропуска по пътя към командата за изтриване. Ако доказателствата са двусмислени, третирайте записа като жив и спрете.

Имената на процеси са слабо доказателство. OpenConnect извиква vpnc-script, затова проверката за процес vpnc не казва нищо за това кой запис е актуален. Нова връзка може също да използва повторно име на интерфейс, оставено от стара, което прави ключа да изглежда по-стар, отколкото е. Сравнете адреса на сървъра в записа с адресите на тунели, които все още са вдигнати, и спрете, ако съвпадат.

Нормалното прекъсване през управляващия мениджър е първото средство. То оттегля това, което тази връзка е инсталирала, и оставя другите доставчици непокътнати.

Проверете премахването и презаписването

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

sudo resolvconf -d "RECORD_KEY_FROM_THE_LIST"
sudo resolvconf --list
resolvectl query host.corp.example || getent hosts host.corp.example

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

resolvconf -u изпълнява само тези скриптове за обновяване. Той никога не идентифицира и не изтрива остарял запис, а преизграждането от остарели входове възпроизвежда същия нежелан файл.

Убита кука за прекъсване оставя записа след себе си

Еднократно почистване възстановява днешното състояние и следващото прекъснато изключване връща записа. Извървете пътя на разглобяването: куката за прекъсване на клиента, помощникът, който тази кука извиква, и какво се случва, когато някоя от двете бъде убита. Прекъснатото изключване е обичайният произход, защото куката изобщо не е стартирала. Запишете кода на изход на куката веднъж и ще знаете дали се проваля тихо.

Дръжте настройването и почистването под един собственик. Втори скрипт, който гадае имена на интерфейси, в крайна сметка ще изтрие записа на друга връзка, което е по-лошо от остарелия запис, с който сте започнали. Собственикът трябва също да решава кога записът е остарял, защото знае коя връзка го е инсталирала.

После изпробвайте жизнения цикъл: свържете се, прекъснете, избројте записите отново. Изчезването на записа сам по себе си е единственото доказателство, че поправката се държи.

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