Bir ping bekçisi bozuk tünel ile sağlam tüneli ayıramaz
İnternete gönderilen ping göründüğünden azını kanıtlar. Tüneli içeriden denetleyin, eyleme geçmeden önce hataları sayın ve sunucu değişimini ayrı bir karar olarak ele alın.
Bir bekçinin yardımcı mı yoksa zararlı mı olduğunu üç koşul belirler: yoklamanın neyi ayırt edebildiği, kaç ardışık hatanın eylemi haklı çıkardığı ve eylemin yeniden bağlanma mı yoksa geçiş mi olduğu. Genel bir adrese ping atan bir cron satırı bunların hiçbirine iyi yanıt vermez. Sağlam tünelleri yeniden bağlar, bozuk tünelleri olduğu gibi bırakır ve ikisini de hiçbir kayıt tutmadan yapar. Saklamaya değer tasarım bu üç seçimi açık hale getirir.
Yoklama, geri kalan her şeye karar veren parçadır.
İnternete gönderilen ping gerçekte neyi kanıtlar
Genel bir çözümleyiciye ping atmak yerel internet yolunun canlı olduğunu gösterir. Bu, tünelin trafik taşıdığını kanıtlamaz ve tam tünel profilinde pingin kendisi tünelden geçer, bu yüzden sağlam bir yanıt ile bozuk bir tünel, istemci hâlâ paket iletiyorken bir arada bulunabilir. Profil ad sorgularını tünelden gönderiyorsa, DNS hatası ölü bir bağlantı olarak okunur ve hiçbir şeyi düzeltemeyecek bir yeniden bağlanma başlatır.
Hatanın iki yönünden hiçbiri çıkış kodunda görünmez. Bu sinyal üzerine kurulmuş bir bekçi, cron çizelgesi olan bir yazı tura atmadır.
Tünelin arkasında yaşayan bir şeyi denetleyin
ip -brief addr show tun0 ip route get 10.100.20.10 nc -z -w3 10.100.20.10 443
İçeriden denetleyin, en ucuz kontrol önce. Arayüz varsa tünel ayaktadır; bilinen bir iç adrese rota sorgusu, trafiğin oraya gireceğini söyler; karşı taraftaki bir konağa TCP denemesi, gerçekten bir şeyin yanıt verdiğini söyler. Yalnızca echo istekleri yanıltır: birçok iç konak TCP'ye seve seve yanıt verir ama ICMP'yi düşürür, bu yüzden ping temelli bir bekçi hiç çalışmayı bırakmamış bir tüneli sürekli yeniden bağlar.
Yoklamayı zamanda sınırlı tutun ve ona ayrı bir çıkış durumu verin. Otuz saniye asılı kalan bir yoklama, bekçiyi içine gecikme yerleştirilmiş bir kesinti algılayıcısına dönüştürür.
Tek satır ile bir döngü arasında seçim yapın
* * * * * nc -z -w5 10.100.20.10 443 || myvpn reconnect
Bir cron girdisi, hafızası olmayan tek bir satırdır; bu, fazladan bir yeniden bağlanmanın hiçbir maliyeti olmadığı bir dizüstü bilgisayara uyar. Gözetimli bir döngü sayaç tutar ve ancak birkaç kaçırmadan sonra eyleme geçer; bu da dengesiz bir bağlantının yeniden bağlanma fırtınası çıkarmasını önler. Her durumda, çökmeden sağ çıkması ve günlüğe yazması için onu bir gözetleyici altında çalıştırın. Hangi sürümün kısa olduğuna göre değil, gereksiz bir yeniden bağlanmanın önemli olup olmadığına göre seçin.
failures=0 while sleep 30; do if nc -z -w5 10.100.20.10 443; then failures=0 else failures=$((failures+1)); fi if [ $failures -ge 3 ]; then myvpn reconnect; failures=0; fi done
O döngü, pencere başına bir oran yerine ardışık hataları sayar. Bir pencere saat ve örnek belleği gerektirir ve elle yazılmış bekçilerdeki hataların çoğu tam o aritmetikte yaşar.
Geçiş başka bir karardır
Sunucu değiştirmek yeniden bağlanmaktan farklıdır. Önce eski bağlantıyı koparın, çünkü birinci hâlâ adresi tutarken başlayan ikinci istemci çakışır. Değiştirmeden önce ardışık hataları sayın, denemeleri sınırlayın ve yeni bağlantı ayaktayken yeniden denetleyin; connect komutunun çıkış durumuna güvenmek yerine. Yanlış bir yapılandırma bir döngü içinde her sunucuyu dolaşmamalıdır.
VPN sunucusunun kendi genel adresini tam bir tünelin içinden denetlemeyin. O kontrol, test ettiği şeye bağlıdır ve doğrulaması gereken yol artık yokken başarı bildirir.
Hangi yoklamanın çalıştığını, ne döndürdüğünü ve hangi eylemin geldiğini kaydedin. Bu kayıt, gizemli bir yeniden bağlanmayı teşhis edilebilir bir olaya dönüştürür.