Öldürülmüş openconnect: marşrutlar və DNS hələ də tunelə baxır
Ölü openconnect prosesi marşrutları və resolver qeydlərini quraşdırılmış vəziyyətdə qoya bilər. Söndürmə yolunu addım-addım keçin, buildinizin sənədləşdirdiyi siqnalı göndərin və təmizləyin.
Tunel bağlıdır, amma maşın hələ də onun açıq olduğu kimi davranır: sorğu vaxtı bitənə qədər asılır, marşrut isə artıq mövcud olmayan interfeysə baxır. Bu, ayırma köməkçisini işə salmadan ölən openconnect prosesinin imzasıdır. Onun yaratdığı şəbəkə vəziyyəti hələ də quraşdırılıb və sistemdəki heç nə onu necə silməyi bilmir.
Maşını vəziyyətin yaradıldığı sıra ilə gəzin: proses, link, marşrut, resolver. Hər addım müştərinin həqiqətən getdiyini, yoxsa yalnız terminalınızdan ayrıldığını deyir və bu fərq ümumiyyətlə nəyisə təmir edib-etməyəcəyinizi müəyyənləşdirir.
Konfiqurasiya ilə deyil, proseslə başlayın
Marşruta toxunmazdan əvvəl terminal açın və hələ nəyin işlədiyini soruşun. pgrep -a openconnect hər nüsxəni arqumentləri ilə siyahıya alır, bu da pid faylını və ona verilən skripti göstərir. Gözləmədiyiniz bir proses fantom tuneli istənilən jurnaldan daha tez izah edir.
Heç nə işləmirsə, linkə baxın. ip link show tun0 interfeysin sağ qalıb-qalmadığını deyir və ip route show dev tun0 hələ ona bağlı marşrutları sadalayır. Sonra resolveri yoxlayın: resolvectl status. Onları dəyişməzdən əvvəl hər üç çıxışı qeyd edin, çünki sonradan köhnə qeydi yenidən ayırmağınız məhz həmin qeydə əsaslanır.
Yox olan interfeys adətən marşrutlarını özü ilə aparır. Linkdən sonra qalan marşrutlar adətən prosesin hələ canlı olduğunu və ya cihazın ikinci müştəriyə aid olduğunu bildirir.
Dəyişiklikləri geri qaytaran şey köməkçi skriptdir
openconnect interfeysi, marşrutları və ya resolver qeydlərini özü silmir. O, xarici köməkçini çağırır, /etc/vpnc/vpnc-script upstream builddə və /usr/share/vpnc-scripts/vpnc-script Debian və Ubuntu paketlərində, seçim isə -s. Tuneli quran skript onu dağıdan skriptin özüdür.
Proses həmin köməkçini çağırmadan çıxarsa, vəziyyət qalır. OpenConnect təlimatı skript olmadan marşrutlaşdırmanın və ad xidmətinin düzgün işləməyəcəyini açıq şəkildə bildirir və köməkçini çıxışda interfeys vəziyyətini sökən komponent kimi təsvir edir. Müştərini -s ilə işə salanda yol vacib olur.
Bu yola hansı siqnalın çatdığı versiyalar arasında dəyişib. 7.06 təlimatı SIGTERM-i skripti atlayan dərhal çıxış kimi qəbul edir. Cari buildlər INT və TERM-i təmiz dayanma kimi sənədləşdirir, burada sessiya bağlanır və köməkçi işləyir. Hər iki davranışı güman etmək əvəzinə əlinizdəki ikili faylın SIGNALS bölməsini oxuyun.
man openconnect | sed -n '/^SIGNALS/,/^LIMITATIONS/p'
Siqnalı buildinizin sənədləşdirdiyi kimi göndərin
Siqnalı bildikdən sonra prosesi naxışla deyil, pid ilə dayandırın.
pgrep -a openconnect
sudo kill -INT "$(cat /var/run/openconnect.pid)"
Sonra çıxış statusuna güvənmək əvəzinə birinci bölmədəki üç yoxlamanı təkrarlayın. ip link show tun0 uğursuz olmalı, ip route show dev tun0 heç nə çap etməməli və resolvectl status artıq VPN linkini sadalamamalıdır.
SIGHUP dayanma düyməsi deyil: əlaqəni kəsir, skripti işə salır və sessiyanı --cookie ilə bərpa oluna bilən vəziyyətdə saxlayır. SIGUSR2 dərhal yenidən qoşulmanı məcbur edir. SIGKILL təmizləməni tamamilə atlayır, bu məqalənin bəhs etdiyi vəziyyət də məhz budur.
resolv.conf-u dəyişdirmədən resolveri bərpa edin
Əksər Ubuntu sistemlərində /etc/resolv.conf systemd-resolved-ə simvolik keçiddir, redaktə etməli olduğunuz fayl deyil. Onu dəyişdirmək hər şəbəkə üçün ad həllini pozur, təkcə VPN üçün deyil. Bunun əvəzinə tunelin qeydiyyatını çıxarın:
resolvectl revert tun0
resolvectl query example.com
Sistem systemd-resolved əvəzinə resolvconf istifadə edirsə, hər interfeys üzrə qeyd linki atmaq əmri verilənə qədər qalır və resolvconf -d tun0 ekvivalent əməliyyatdır. Əmri seçməzdən əvvəl hansı resolverin işlədiyini yoxlayın.
Ölü linkin arxasındakı serverə hədəflənmiş sorğu vaxtı bitənə qədər asılır və bu gecikmə qalıq marşrutdan çox xarab DNS serveri kimi görünür.
Növbəti ayırmanı darıxdırıcı edin
pid faylının yolunu başlanğıcda və söndürmədə eyni saxlayın, hər dəfə --pid-file verməklə, və ya openconnect-i unit altında işlədin və onun KillSignal versiyanızın sənədləşdirdiyi siqnalla uyğunlaşdırın. Əvvəlcə ön planda sınaqdan keçirmək sizə köməkçinin çap etdiyi söndürmə mesajlarını göstərir.
Qoşulun, ayrılın və üç yoxlamanı bir dəfə işə salın. Təmiz çıxış nə VPN linki, nə VPN marşrutu, nə də VPN resolver qeydi qoyur. Üçündən biri sağ qalırsa, artıq hansı komponentin təmizləmədə uğursuz olduğunu bilirsiniz. Növbəti araşdırma o zaman asılmış sorğudan deyil, bu cavabdan başlayır.