Usuwanie nieaktualnego rekordu VPN z bazy danych resolvconf
Na hoście, na którym Debian resolvconf zarządza stanem, usunięcie wpisu jest łatwe. Najpierw udowodnij, że rekord jest przestarzały i bez właściciela, a potem sprawdź przepisanie.
Nazwa wewnętrzna nadal rozwiązuje się na serwer VPN dzień po zamknięciu tunelu, a plik resolvera wciąż wraca z tym wpisem. Tam, gdzie Debian resolvconf zarządza stanem, ten plik jest składany z rekordów dostawców, a jeden z nich jest pozostałością. Usunięcie rekordu zajmuje minutę; udowodnienie, że można go bezpiecznie usunąć, to prawdziwa praca. Te bramy działają po kolei, a nieudana brama kończy procedurę zamiast wysyłać cię do następnego kroku.
Potwierdź, że resolvconf zarządza stanem
Najpierw zidentyfikuj właściciela, bo ten sam objaw pod systemd-resolved wymaga innych poleceń i innej naprawy. Pakiet resolvconf trzyma bazę danych w /run/resolvconf i wskazuje /etc/resolv.conf na plik, który buduje z tej bazy. Dwa odczyty rozstrzygają sprawę: cel dowiązania symbolicznego i to, czy pakiet jest zainstalowany i aktywny. Cel w /run/systemd/resolve oznacza inną konstrukcję, w której nic poniżej nie obowiązuje.
dpkg -l resolvconf | tail -1
ls -l /etc/resolv.conf
systemctl is-active resolvconf.service
Jeśli dowiązanie wskazuje gdzie indziej albo pakietu brakuje, zatrzymaj się tutaj. Otoczka zgodności, która pożyczyła nazwę i jest dostarczana przez innego menedżera resolvera, nie jest właścicielem tej bazy.
Baza danych zawiera wejścia, a nie odpowiedź
Baza danych zawiera wejścia, a plik jest wyjściem, więc wypisanie wejść to jedyny sposób, by zobaczyć, który program zainstalował wpis, którego chcesz się pozbyć. Rekordy są krótkie, a ich klucze to uchwyty, których będziesz potrzebować później. Przeczytaj je, zanim zdecydujesz, który jest przestarzały, bo nazwa wyglądająca jak interfejs VPN może należeć do innego klienta. Trzymaj prywatne adresy i wewnętrzne domeny wyszukiwania poza wspólną diagnostyką; sam klucz zwykle identyfikuje rekord.
sudo resolvconf --list
sudo resolvconf -i
Pierwsze polecenie wypisuje dostarczone rekordy bez ich przetwarzania, a drugie wymienia interfejsy, które obecnie dostarczają konfigurację DNS. Klucze są zwykle budowane z nazwy interfejsu i programu dostarczającego. Podręcznik resolvconf opisuje bazę danych, do której odnoszą się te klucze.
Skopiuj klucz z wyjścia, zamiast budować go od nowa. Wpis nie nazywa się tun0 tylko dlatego, że stary skrypt użył tej nazwy.
Udowodnij, że rekord nie ma właściciela
Rekord można bezpiecznie usunąć, gdy nie zainstalowało go żadne aktywne połączenie. Powiąż klucz z połączeniem, które go utworzyło, a następnie potwierdź, że tego połączenia już nie ma. Ta korelacja to cała brama i to krok najczęściej pomijany w drodze do polecenia usuwania. Jeśli dowody są niejednoznaczne, traktuj rekord jako aktywny i zatrzymaj się.
Nazwy procesów to słaby dowód. OpenConnect wywołuje vpnc-script, więc sprawdzenie procesu vpnc nic nie mówi o tym, który rekord jest bieżący. Nowe połączenie może też ponownie użyć nazwy interfejsu pozostawionej przez stare, co sprawia, że klucz wygląda na starszy, niż jest. Porównaj adres serwera w rekordzie z adresami tuneli, które wciąż działają, i zatrzymaj się, jeśli się zgadzają.
Zwykłe rozłączenie przez menedżera będącego właścicielem to pierwsze lekarstwo. Wycofuje ono to, co zainstalowało to połączenie, i zostawia innych dostawców nietkniętych.
Sprawdź usunięcie i przepisanie
Gdy rekord jest potwierdzony jako przestarzały, usuń go dokładnym kluczem, a potem odczytaj wynik, zamiast go zakładać. Polecenie zmienia stan resolvera dla każdej aplikacji na hoście, więc uruchom je w oknie, które kontrolujesz. Ujmij klucz w cudzysłów, bo zawiera znaki, które powłoka inaczej by rozwinęła. Symbol zastępczy w bloku oznacza klucz skopiowany z listy, a nie dosłowny ciąg.
sudo resolvconf -d "RECORD_KEY_FROM_THE_LIST"
sudo resolvconf --list
resolvectl query host.corp.example || getent hosts host.corp.example
Usuwanie uruchamia skrypty aktualizacji, gdy aktualizacja jest włączona; gdy aktualizacje są wyłączone, odkłada aktualizację, więc usunięty rekord i przepisany plik to dwa osobne zdarzenia. Przeczytaj listę ponownie i potwierdź, że klucza nie ma, zanim spojrzysz na plik. Następnie zapytaj o jedną nazwę, która nadal powinna się rozwiązywać przez pozostałych dostawców, i o jedną nazwę publiczną, i porównaj obie z tym, co widziałeś przed zmianą. Jeśli prywatna nazwa całkowicie przestanie się rozwiązywać, ten rekord nadal ją niósł.
resolvconf -u uruchamia tylko te skrypty aktualizacji. Nigdy nie identyfikuje ani nie usuwa przestarzałego rekordu, a odbudowa z przestarzałych wejść odtwarza ten sam niechciany plik.
Zabity hak rozłączenia zostawia rekord
Jednorazowe czyszczenie przywraca dzisiejszy stan, a następne przerwane wyłączenie przywraca rekord. Przejdź ścieżkę demontażu: hak rozłączenia klienta, pomocnik, który ten hak wywołuje, i to, co się dzieje, gdy któryś z nich zostanie zabity. Przerwane wyłączenie to zwykłe źródło, bo hak w ogóle nie zadziałał. Zarejestruj raz kod wyjścia haka i będziesz wiedzieć, czy zawodzi po cichu.
Trzymaj konfigurację i czyszczenie u jednego właściciela. Drugi skrypt, który zgaduje nazwy interfejsów, w końcu usunie rekord innego połączenia, co jest gorsze niż przestarzały wpis, od którego zacząłeś. Właściciel powinien też decydować, kiedy rekord jest przestarzały, bo wie, które połączenie go zainstalowało.
Potem przećwicz cykl życia: połącz się, rozłącz się, ponownie wypisz rekordy. Samoistne zniknięcie wpisu to jedyny dowód, że naprawa się utrzymuje.