Bir vpnc profili dolaşımın ardından temiz biçimde yeniden bağlanır; üçü sırayla birbirlerinin soketlerini, rotalarını ve çözümleyici durumunu bozar. Paketle gelen yeniden bağlanma betiği tek bir tünel için yazılmıştır, bu yüzden içlerinden biri düştüğünde her profili yeniden başlatır. Bunu düzeltmek üç şey gerektirir: ayrı yerel portlar, her profil için gerçek bir hizmeti sınayan bir yoklama ve hiçbir zaman iki bağlantıyı aynı anda çalıştırmayan tek bir sıralı zincir.

Her profile kendi yerel portunu verin

Varsayılan yerel portta bırakılan bir vpnc profili, zaten çalışan profille yarışır. İkinci bağlantı, birincisi portu tutarken başarısız olur ve günlük satırı yerel bir çakışma değil, ağ geçidi sorunu gibi görünür. Bunun yerine her profil dosyası için bir satır ayarlayın:

Local Port 0

Sıfır, çekirdeğin geçici bir port seçmesine izin verir, böylece iki profil aynı anda kurulabilir. Her dosyayı hizmet ettiği ağ geçidi ve gruba göre adlandırın, yalnızca root tarafından okunabilir tutun ve her zaman paylaşılan bir varsayılan yerine eşleşen profille bağlanın. Paylaşılan varsayılan dosya, birisi bir profili yeniden adlandırdıktan sonra betiğin yanlış tüneli yeniden bağlamasının yoludur.

Profil dosyaları kimlik bilgileri taşır, bu yüzden izinler tasarımın parçasıdır, ev işlerinin değil. /etc/vpnc altında herkesin okuyabildiği bir dosya, grup sırrını her yerel kullanıcıya verir. Kipi 0600'de tutun ve sahibi root olsun; betiklerin sırları argümanlara kopyalaması yerine dosyayı root olarak okumasına izin verin. Bu yüzden bir yoklama betiği dosya içeriğini asla günlüğe yazmamalıdır.

Her profil için bir hizmeti yoklayın, tünel adresini değil

Tünelin kendi adresine gönderilen yankı isteği çoğunlukla arayüzün var olduğunu kanıtlar. Arkasındaki makinenin tüneli haklı çıkaran uygulamaya hâlâ ulaşıp ulaşmadığı hakkında hiçbir şey söylemez. Arayüz açıkken arkasındaki rota çoktan gitmiş olabilir.

Her profil için bir hizmeti kısa bir TCP zaman aşımıyla yoklayın ve yalnızca yoklaması başarısız olan profili yeniden bağlayın. İki saniye ölü bir yolu yavaş olandan ayırır ve TCP yoklaması yol boyunca bir yerde ICMP'ye izin verilmesine bağlı değildir. Profiller arasında yalnızca hedefi ve yapılandırma adını değiştirin:

#!/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 olarak kaydedin, çalıştırılabilir yapın ve her profil için yalnızca yoklama hedefini ve yapılandırma adını değiştirerek yineleyin. Protokol sorusunu yanıtlayan bir yoklama, yankıyı düşüren ama kullanıcıların önemsediği hizmetleri iletmeye devam eden ağ geçitlerinden sağ çıkar.

Yoklamaları asla yarışmayacak biçimde zincirleyin

Paketle gelen yeniden bağlanma betiği yoklamalarınızı sırayla çağırabilir ve sıra işin bütünüdür. Birlikte çalışan iki vpnc-connect çağrısı yönlendirme tablosunu kimsenin denetlemediği bir sırayla yeniden yazar ve sağlıklı bir profil rotasını böyle kaybeder.

Çağrıları ön planda tutun, alt arayüz için kısa bir oturma gecikmesi ekleyin ve zinciri root'un cron tablosundan zamanlayın, çünkü tünel rotalarını yalnızca root yeniden yazabilir:

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

Açılış betiği ile cron girdisi arasındaki sırayı aynı tutun, çünkü açılışta farklı sırayla çalışan bir zincir fiilen başka bir programdır. Bir profil diğerinin rotalarına bağlıysa bağımlılığı öne koyun ve önceki tünel hâlâ yükselirken sonraki yoklamanın zararsız biçimde başarısız olmasına izin verin.

Günlüğü izleyin, sonra birini bilerek bozun

Her çalıştırma için profil, yoklama hedefi, sonuç ve yapılan işlemle birlikte bir satır günlüğe yazın. Bu olmadan her dakika titreyen bir tünel, hiç düşmemiş olanla tamamen aynı görünür ve bir yoklama hatası ağ geçidi kesintisinden ayırt edilemez. Günlük ayrıca zincirin yalnızca başarısız olan profile dokunduğunu kanıtlar. Onu yeniden başlatmaya dayanan bir yere yazın, yoksa kanıtlar süreçle birlikte gider.

Sonra bir tüneli bilerek bozun ve ne olduğunu izleyin. Tek bir profili durdurun ve hangi süreçlerin ve rotaların hâlâ var olduğunu doğrulayın:

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

Yalnızca durdurulan profil yeniden bağlanmalı, diğer oturumlar hem süreçlerini hem de rotalarını korumalıdır. İki profil yeniden başlarsa zinciriniz beklemediğiniz bir yerde paralel çalışıyor demektir.

Bekçinin yapmaması gerekenler

Bir şey başarısız olduğunda her şeyi yeniden başlatan bekçi test sırasında sağlıklı görünür ve bir bakım penceresinde kesintiye yol açar. Profil bazında yeniden başlatın, asla genel olarak değil.

Ağ geçidi aynı protokol için bakımlı bir istemci sunuyorsa onu tercih edin ve betiğe asla parola gömmeğin ya da komut satırında geçirmeyin, çünkü profil dosyası sırrı zaten tutar. Tünel açıldıktan sonra bir görev sıradan kullanıcı olarak çalışmak zorundaysa, tüm zinciri o hesap altında çalıştırmak yerine ayrıcalıkları betiğin içinden düşürün. Son olarak, yeniden bağlanmadan sonra rotaları yeniden okuyun, çünkü bir profil farklı atanmış bir adresle dönebilir ve tünel adresine yönelik hiçbir yoklamanın asla fark etmeyeceği eski bir rota bırakabilir.

İlgili makaleler