Satu profil vpnc menyambung semula dengan bersih selepas perayauan; tiga daripadanya bergilir-gilir merosakkan soket, laluan dan keadaan penyelesai satu sama lain. Skrip sambung semula yang disertakan ditulis untuk satu terowong, jadi ia memulakan semula setiap profil setiap kali mana-mana satu daripadanya tidak berfungsi. Membaikinya memerlukan tiga perkara: port setempat berasingan, kuar yang menguji perkhidmatan sebenar bagi setiap profil, dan satu rantaian tersusun yang tidak pernah menjalankan dua sambungan serentak.

Beri setiap profil port setempatnya sendiri

Profil vpnc yang dibiarkan pada port setempat lalai bersaing dengan profil yang sudah berjalan. Sambungan kedua gagal semasa yang pertama memegang port, dan baris log kelihatan seperti masalah get laluan dan bukan konflik setempat. Sebaliknya tetapkan satu baris bagi setiap fail profil:

Local Port 0

Sifar membiarkan kernel memilih port sementara, jadi dua profil boleh diwujudkan serentak. Namakan setiap fail sempena get laluan dan kumpulan yang dilayaninya, kekalkan ia boleh dibaca oleh root sahaja, dan sentiasa sambung dengan profil yang sepadan dan bukan lalai yang dikongsi. Fail lalai yang dikongsi ialah cara skrip menyambung semula terowong yang salah selepas seseorang menamakan semula profil.

Fail profil membawa kelayakan, jadi kebenaran ialah sebahagian daripada reka bentuk dan bukan kerja mengemas. Fail yang boleh dibaca semua orang di bawah /etc/vpnc menyerahkan rahsia kumpulan kepada setiap pengguna setempat. Kekalkan mod pada 0600 dengan root sebagai pemilik, dan biarkan skrip membaca fail itu sebagai root dan bukannya menyalin rahsia ke dalam argumen. Itulah sebabnya skrip kuar tidak sepatutnya menulis kandungan fail ke dalam log.

Uji satu perkhidmatan bagi setiap profil, bukan alamat terowong

Permintaan gema ke alamat terowong itu sendiri kebanyakannya hanya membuktikan antara muka wujud. Ia tidak menyatakan sama ada hos di belakangnya masih mencapai aplikasi yang mewajarkan terowong itu. Antara muka boleh hidup sementara laluan di sebaliknya sudah hilang.

Uji satu perkhidmatan bagi setiap profil dengan tamat masa TCP yang pendek dan sambung semula hanya profil yang kuarnya gagal. Dua saat memisahkan laluan mati daripada laluan perlahan, dan kuar TCP tidak bergantung pada ICMP dibenarkan di mana-mana sepanjang laluan. Tukar hanya sasaran dan nama konfigurasi antara profil:

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

Simpan itu sebagai /usr/local/bin/ensure-vpn-ops.sh, jadikannya boleh laku, dan ulangi untuk setiap profil dengan hanya sasaran kuar dan nama konfigurasi ditukar. Kuar yang menjawab soalan protokol bertahan melalui get laluan yang menggugurkan gema tetapi masih memajukan perkhidmatan yang penting kepada pengguna.

Rantaikan kuar supaya ia tidak pernah berlumba

Skrip sambung semula yang disertakan boleh memanggil kuar anda secara berturutan, dan urutan itulah keseluruhan maksudnya. Dua panggilan vpnc-connect yang berjalan serentak menulis semula jadual penghalaan dalam susunan yang tiada siapa kawal, dan begitulah profil yang sihat kehilangan laluannya.

Kekalkan panggilan di hadapan, tambah jeda tenang yang pendek untuk antara muka di bawahnya, dan jadualkan rantaian daripada jadual cron root, kerana hanya root boleh menulis semula laluan terowong:

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

Kekalkan susunan yang sama antara skrip but dan entri cron, kerana rantaian yang berjalan dalam susunan berbeza semasa but pada dasarnya ialah program lain. Apabila satu profil bergantung pada laluan profil lain, letakkan kebergantungan dahulu dan biarkan kuar kemudiannya gagal tanpa bahaya semasa terowong terdahulu masih naik.

Pantau log, kemudian rosakkan satu dengan sengaja

Log satu baris bagi setiap jalan dengan profil, sasaran kuar, hasil dan tindakan yang diambil. Tanpanya, terowong yang berkelip setiap minit kelihatan sama seperti yang tidak pernah putus, dan pepijat kuar tidak dapat dibezakan daripada gangguan get laluan. Log juga membuktikan bahawa rantaian hanya menyentuh profil yang gagal. Tulis di tempat yang bertahan selepas but semula, atau buktinya pergi bersama proses.

Kemudian rosakkan satu terowong dengan sengaja dan lihat apa yang berlaku. Hentikan satu profil dan sahkan proses serta laluan mana yang masih ada:

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

Hanya profil yang dihentikan patut disambung semula, dan sesi lain patut mengekalkan kedua-dua proses dan laluan mereka. Jika dua profil dimulakan semula, rantaian anda berjalan selari di suatu tempat yang anda tidak jangkakan.

Apa yang pengawas tidak boleh lakukan

Pengawas yang memulakan semula segala-galanya setiap kali sesuatu gagal kelihatan sihat semasa ujian dan menyebabkan gangguan dalam tetingkap penyelenggaraan. Mulakan semula mengikut profil, tidak pernah secara global.

Utamakan klien yang diselenggara apabila get laluan menawarkan satu untuk protokol yang sama, dan jangan sekali-kali mengekod kata laluan secara keras dalam skrip atau memberikannya pada baris arahan, kerana fail profil sudah menyimpan rahsianya. Jika sesuatu tugas mesti berjalan sebagai pengguna biasa setelah terowong naik, turunkan keistimewaan dari dalam skrip dan bukannya menjalankan seluruh rantaian di bawah akaun itu. Akhir sekali, baca semula laluan selepas sambung semula, kerana profil boleh kembali dengan alamat yang diberi berbeza dan meninggalkan laluan usang yang tidak akan disedari oleh mana-mana kuar yang ditujukan ke alamat terowong.

Artikel berkaitan