Bir vpnc profili rouminqden sonra təmiz şəkildə yenidən qoşulur; üçü isə növbə ilə bir-birinin soketlərini, marşrutlarını və həlledici vəziyyətini pozur. Paketlə gələn yenidənqoşulma skripti bir tunel üçün yazılıb, ona görə də onlardan hər hansı biri söndükdə bütün profilləri yenidən başladır. Bunu düzəltmək üçün üç şey lazımdır: ayrı lokal portlar, hər profil üçün real xidməti yoxlayan bir yoxlama və iki qoşulmanı heç vaxt eyni vaxtda işə salmayan tək nizamlı zəncir.

Hər profilə öz lokal portunu verin

Standart lokal portda saxlanılan vpnc profili artıq işləyən profillə rəqabət aparır. İkinci qoşulma birinci portu tutduğu üçün uğursuz olur və jurnal sətri lokal toqquşma deyil, şlüz problemi kimi görünür. Bunun əvəzinə hər profil faylı üçün bir sətir yazın:

Local Port 0

Sıfır nüvənin qısamüddətli port seçməsinə imkan verir, beləliklə iki profil eyni vaxtda qurula bilər. Hər faylı xidmət etdiyi şlüz və qrupun adı ilə adlandırın, onu yalnız root üçün oxunaqlı saxlayın və paylaşılan standart fayl yerinə həmişə uyğun profillə qoşulun. Paylaşılan standart fayl kimsə profilin adını dəyişdikdən sonra skriptin səhv tuneli yenidən qoşmasının yoludur.

Profil faylları etimad məlumatı daşıyır, ona görə də icazələr təmizlik işi deyil, dizaynın hissəsidir. /etc/vpnc altında hamının oxuya bildiyi fayl qrup sirrini bütün lokal istifadəçilərə verir. Rejimi root sahibi ilə 0600-də saxlayın və skriptlərin faylı root kimi oxumasına şərait yaradın, sirləri arqumentlərə köçürməsinlər. Yoxlama skriptinin fayl məzmununu heç vaxt jurnala çıxarmamasının səbəbi də budur.

Tunelin ünvanını deyil, hər profil üçün bir xidməti yoxlayın

Tunelin öz ünvanına göndərilən əks-səda sorğusu əsasən interfeysin mövcud olduğunu sübut edir. O, arxasındakı hostun tuneli əsaslandıran tətbiqə hələ çatıb-çatmaması barədə heç nə demir. İnterfeys işlək qala bilər, halbuki ondan sonrakı marşrut artıq itib.

Hər profil üçün bir xidməti qısa TCP gözləmə müddəti ilə yoxlayın və yalnız yoxlaması uğursuz olan profili yenidən qoşun. İki saniyə ölü yolu yavaş yoldan ayırır və TCP yoxlaması yolun hər hansı yerində ICMP-yə icazə verilməsindən asılı deyil. Profillər arasında yalnız hədəfi və konfiq adını dəyişin:

#!/bin/bash
set -eu
if ! nc -z -w 2 10.63.7.20 8443; then
  /usr/sbin/vpnc-connect ops.conf
fi

Bunu /usr/local/bin/ensure-vpn-ops.sh kimi saxlayın, icra icazəsi verin və hər profil üçün yalnız yoxlama hədəfi ilə konfiq adını dəyişərək təkrarlayın. Protokol sualına cavab verən yoxlama, əks-sədanı atsa da istifadəçilərin əhəmiyyət verdiyi xidmətləri ötürməyə davam edən şlüzlərdən keçib qalır.

Yoxlamaları heç vaxt yarışmasınlar deyə zəncirləyin

Paketlə gələn yenidənqoşulma skripti yoxlamalarınızı ardıcıl çağıra bilər və ardıcıllıq bütün məsələnin özüdür. Birlikdə işləyən iki vpnc-connect çağırışı marşrut cədvəlini heç kimin idarə etmədiyi bir sıra ilə yenidən yazır və sağlam profil məhz beləcə öz marşrutunu itirir.

Çağırışları fonda işlətməyin, əsas interfeys üçün qısa oturuşma gecikməsi əlavə edin və zənciri root-un cron cədvəlindən planlaşdırın, çünki tunel marşrutlarını yalnız root yenidən yaza bilər:

#!/bin/bash
sleep 20
/usr/local/bin/ensure-vpn-ops.sh
/usr/local/bin/ensure-vpn-lab.sh

Sıranı yükləmə skripti ilə cron girişi arasında eyni saxlayın, çünki yükləmə zamanı fərqli sıra ilə işləyən zəncir faktiki olaraq başqa proqramdır. Bir profil digərinin marşrutlarından asılı olduqda asılılığı birinci qoyun və sonrakı yoxlamanın əvvəlki tunel hələ qalxarkən zərərsiz uğursuz olmasına icazə verin.

Jurnala baxın, sonra bir tuneli qəsdən pozun

Hər işə bir sətir yazın: profil, yoxlama hədəfi, nəticə və görülən iş. Bu olmadan hər dəqiqə tərpənən tunel heç vaxt düşməmiş tunel kimi görünür və yoxlama xətasını şlüz kəsintisindən ayırmaq mümkün olmur. Jurnal həm də zəncirin yalnız uğursuz olan profilə toxunduğunu sübut edir. Onu yenidən yükləmədən sonra da qalan bir yerə yazın, əks halda sübutlar proseslə birlikdə gedir.

Sonra bir tuneli qəsdən pozun və nə baş verdiyinə baxın. Tək bir profili dayandırın və hansı proseslərin və marşrutların hələ də qaldığını təsdiqləyin:

pgrep -a vpnc
ip -4 route show | grep -E '10[.]63|10[.]90'
tail -n 5 /var/log/ensure-vpn.log

Yalnız dayandırılmış profil yenidən qoşulmalı, digər sessiyalar isə həm proseslərini, həm də marşrutlarını saxlamalıdır. İki profil yenidən başlayırsa, zənciriniz gözləmədiyiniz yerdə paralel işləyir.

Nəzarətçinin etməməli olduğu şeylər

Hər şey uğursuz olanda hər şeyi yenidən başladan nəzarətçi sınaq zamanı sağlam görünür və texniki xidmət pəncərəsində kəsinti yaradır. Profil üzrə yenidən başladın, heç vaxt qlobal şəkildə yox.

Şlüz eyni protokol üçün dəstəklənən müştəri təklif edəndə onu üstün tutun və skriptə heç vaxt parol yazmayın və ya onu əmr sətrində ötürməyin, çünki profil faylı artıq sirri saxlayır. Tunel qalxdıqdan sonra bir tapşırıq adi istifadəçi kimi işləməlidirsə, bütün zənciri həmin hesab altında işlətmək yerinə skriptin içindən imtiyazları azaldın. Nəhayət, yenidən qoşulmadan sonra marşrutları bir daha oxuyun, çünki profil fərqli təyin edilmiş ünvanla qayıda və tunel ünvanına yönəlmiş heç bir yoxlamanın görməyəcəyi köhnə marşrut qoya bilər.

Əlaqəli məqalələr