Bitta vpnc profili roumingdan keyin toza qayta ulanadi; uchtasi navbat bilan bir-birining soketlari, marshrutlari va hal qiluvchi holatini buzadi. Paket bilan kelgan qayta ulanish skripti bitta tunnel uchun yozilgan, shuning uchun ulardan biri o‘chgan har safar har bir profilni qayta ishga tushiradi. Buni tuzatish uchun uchta narsa kerak: alohida lokal portlar, har bir profil uchun haqiqiy xizmatni sinovdan o‘tkazuvchi tekshiruv va hech qachon ikkita ulanishni bir vaqtda ishga tushirmaydigan bitta tartiblangan zanjir.

Har bir profilga o‘zining lokal portini bering

Standart lokal portda qoldirilgan vpnc profili allaqachon ishlab turgan profil bilan raqobatlashadi. Birinchisi portni ushlab turganda ikkinchi ulanish muvaffaqiyatsiz bo‘ladi va jurnal satri lokal to‘qnashuv emas, shlyuz muammosi kabi ko‘rinadi. Buning o‘rniga har bir profil fayli uchun bitta satr qo‘ying:

Local Port 0

Nol yadroga vaqtinchalik port tanlash imkonini beradi, shuning uchun ikkita profilni bir vaqtda o‘rnatish mumkin. Har bir faylni u xizmat qiladigan shlyuz va guruh nomi bilan nomlang, uni faqat root o‘qiy oladigan qilib saqlang va har doim umumiy standart o‘rniga mos keladigan profil bilan ulaning. Umumiy standart fayl — bu kimdir profil nomini o‘zgartirgandan keyin skript noto‘g‘ri tunnelni qayta ulaydigan yo‘l.

Profil fayllarida hisob ma’lumotlari bo‘ladi, shuning uchun ruxsatlar dizaynning bir qismi, uy ishlarining emas. /etc/vpnc ostida hamma o‘qiy oladigan fayl guruh sirini har bir lokal foydalanuvchiga beradi. Rejimni 0600 da saqlang va egasi root bo‘lsin, hamda skriptlar sirlarni argumentlarga ko‘chirish o‘rniga faylni root sifatida o‘qisin. Shuning uchun tekshiruv skripti hech qachon fayl mazmunini jurnalga yozmasligi kerak.

Har bir profil uchun bitta xizmatni tekshiring, tunnel manzilini emas

Tunnelning o‘z manziliga yuborilgan aks-sado so‘rovi asosan interfeys borligini isbotlaydi. U orqadagi xostoning tunnelni oqlaydigan ilovaga hali yetib borishini aytmaydi. Interfeys ishlab turgan bo‘lishi mumkin, ammo uning ortidagi marshrut allaqachon yo‘qolgan.

Har bir profil uchun bitta xizmatni qisqa TCP muddati bilan tekshiring va faqat tekshiruvi muvaffaqiyatsiz bo‘lgan profilni qayta ulang. Ikki soniya o‘lik yo‘lni sekin yo‘ldan ajratadi va TCP tekshiruvi yo‘lning biror joyida ICMP ruxsat etilganiga bog‘liq emas. Profillar orasida faqat maqsad va konfiguratsiya nomini o‘zgartiring:

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

Buni /usr/local/bin/ensure-vpn-ops.sh sifatida saqlang, bajariladigan qilib qo‘ying va har bir profil uchun faqat tekshiruv maqsadi va konfiguratsiya nomini o‘zgartirib takrorlang. Protokol savoliga javob beradigan tekshiruv aks-sadoni tashlab yuboradigan, ammo foydalanuvchilarga muhim xizmatlarni uzatishda davom etadigan shlyuzlardan omon o‘tadi.

Tekshiruvlarni hech qachon musobaqalashmaydigan qilib zanjirlang

Paketdagi qayta ulanish skripti tekshiruvlaringizni ketma-ket chaqirishi mumkin va ketma-ketlik — butun mantiq. Birgalikda ishlaydigan ikkita vpnc-connect chaqiruvi marshrutlash jadvalini hech kim nazorat qilmaydigan tartibda qayta yozadi va sog‘lom profil marshrutini aynan shunday yo‘qotadi.

Chaqiruvlarni old planda saqlang, pastki interfeys uchun qisqa barqarorlashuv kechikishini qo‘shing va zanjirni root ning cron jadvalidan rejalashtiring, chunki tunnel marshrutlarini faqat root qayta yozishi mumkin:

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

Yuklash skripti va cron yozuvi o‘rtasidagi tartibni bir xil saqlang, chunki yuklash paytida boshqa tartibda ishlaydigan zanjir aslida boshqa programmadir. Bir profil boshqasining marshrutlariga bog‘liq bo‘lsa, bog‘liqlikni birinchi qo‘ying va avvalgi tunnel hali ko‘tarilayotganda keyingi tekshiruv zararsiz muvaffaqiyatsiz bo‘lsin.

Jurnalni kuzating, so‘ng bittasini ataylab sindiring

Har bir ishga tushish uchun bitta satr yozing: profil, tekshiruv maqsadi, natija va ko‘rilgan chora. Busiz har daqiqada tebranadigan tunnel hech qachon yiqilmagandek ko‘rinadi va tekshiruv xatosini shlyuz uzilishidan ajratib bo‘lmaydi. Jurnal zanjir faqat muvaffaqiyatsiz bo‘lgan profilga tekkanini ham isbotlaydi. Uni qayta yuklashdan keyin ham qoladigan joyga yozing, aks holda dalillar jarayon bilan birga ketadi.

So‘ng tunnelni ataylab sindirib nima bo‘lishini ko‘ring. Bitta profilni to‘xtating va qaysi jarayonlar hamda marshrutlar hali borligini tasdiqlang:

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

Faqat to‘xtatilgan profil qayta ulanishi kerak, qolgan sessiyalar esa jarayonlarini ham, marshrutlarini ham saqlab qolishi kerak. Agar ikkita profil qayta ishga tushsa, zanjiringiz siz kutmagan joyda parallel ishlayapti.

Qo‘riqchi nima qilmasligi kerak

Biror narsa muvaffaqiyatsiz bo‘lganda hamma narsani qayta ishga tushadigan qo‘riqchi sinov paytida sog‘lom ko‘rinadi va texnik xizmat oynasida uzilishga sabab bo‘ladi. Profil bo‘yicha qayta ishga tushiring, hech qachon global tarzda emas.

Shlyuz ayni protokol uchun qo‘llab-quvvatlanadigan mijoz taklif qilsa, o‘shani tanlang va skriptga hech qachon parolni qattiq yozmang yoki uni buyruq satrida o‘tkazmang, chunki profil fayli sirni allaqachon saqlaydi. Tunnel ko‘tarilgandan keyin vazifa oddiy foydalanuvchi sifatida ishlashi kerak bo‘lsa, butun zanjirni o‘sha hisob ostida ishlatish o‘rniga skript ichidan imtiyozlarni kamaytiring. Nihoyat, qayta ulangandan so‘ng marshrutlarni qayta o‘qing, chunki profil boshqa tayinlangan manzil bilan qaytishi va tunnel manziliga qaratilgan hech bir tekshiruv sezmaydigan eskirgan marshrut qoldirishi mumkin.

O'xshash maqolalar