Pengawas ping tidak bisa membedakan terowongan rusak dari yang sehat
Ping ke internet membuktikan lebih sedikit dari yang terlihat. Periksa terowongan dari dalam, hitung kegagalan sebelum bertindak, dan perlakukan peralihan server sebagai keputusan terpisah.
Tiga kondisi menentukan apakah pengawas membantu atau merugikan: apa yang bisa dibedakan oleh pemeriksaan, berapa kegagalan berturut-turut yang membenarkan tindakan, dan apakah tindakannya menyambung ulang atau beralih. Satu baris cron yang mem-ping alamat publik tidak menjawab satu pun dengan baik. Ia menyambung ulang terowongan yang sehat dan membiarkan terowongan yang rusak, dan melakukan keduanya tanpa catatan. Desain yang layak dipertahankan membuat ketiga pilihan itu eksplisit.
Pemeriksaan adalah bagian yang menentukan segala hal lainnya.
Apa yang sebenarnya dibuktikan oleh ping ke internet
Mem-ping resolver publik menunjukkan bahwa jalur internet lokal hidup. Itu tidak membuktikan terowongan membawa lalu lintas, dan pada profil terowongan penuh ping itu sendiri melewati terowongan, sehingga balasan yang sehat dan terowongan rusak bisa ada bersamaan sementara klien masih meneruskan paket. Jika profil mengirim pencarian nama melalui terowongan, kegagalan DNS terbaca sebagai tautan mati dan memulai penyambungan ulang yang tidak bisa memperbaiki apa pun.
Tidak satu pun dari dua arah galat itu muncul di kode keluar. Pengawas yang dibangun di atas sinyal itu adalah lemparan koin dengan jadwal cron.
Periksa sesuatu yang hidup di balik terowongan
ip -brief addr show tun0 ip route get 10.100.20.10 nc -z -w3 10.100.20.10 443
Periksa dari dalam, pemeriksaan termurah lebih dulu. Ada atau tidaknya antarmuka memberi tahu bahwa terowongan menyala; pencarian rute ke alamat internal yang dikenal memberi tahu bahwa lalu lintas akan masuk ke sana; pemeriksaan TCP ke host di sisi lain memberi tahu bahwa ada yang benar-benar menjawab. Hanya permintaan echo yang menyesatkan: banyak host internal senang menjawab TCP tetapi membuang ICMP, jadi pengawas berbasis ping terus menyambung ulang terowongan yang tidak pernah berhenti berfungsi.
Jaga pemeriksaan tetap terbatas waktunya dan beri status keluar tersendiri. Pemeriksaan yang menggantung tiga puluh detik mengubah pengawas menjadi pendeteksi gangguan dengan jeda bawaan.
Pilih antara satu baris dan satu perulangan
* * * * * nc -z -w5 10.100.20.10 443 || myvpn reconnect
Entri cron adalah satu baris tanpa memori, yang cocok untuk laptop yang menyambung ulang sekali lagi tidak memakan biaya. Perulangan terawasi menyimpan penghitung dan baru bertindak setelah beberapa kegagalan, yang mencegah tautan goyah memicu badai penyambungan ulang. Bagaimanapun, jalankan di bawah pengawas agar selamat dari crash dan menulis ke jurnal. Pilih berdasarkan apakah penyambungan ulang palsu penting, bukan berdasarkan versi mana yang lebih pendek.
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
Perulangan itu menghitung kegagalan berturut-turut alih-alih pecahan sepanjang jendela. Jendela membutuhkan jam dan memori sampel, dan sebagian besar bug pada pengawas buatan tangan hidup di aritmetika itu.
Peralihan server adalah keputusan berbeda
Mengganti server berbeda dari menyambung ulang. Robek dulu tautan lama, karena klien kedua yang mulai saat yang pertama masih memegang alamat akan bertabrakan. Hitung kegagalan berturut-turut sebelum beralih, batasi percobaan, dan periksa lagi setelah tautan baru menyala alih-alih memercayai status keluar perintah connect. Konfigurasi yang salah seharusnya tidak berputar melalui setiap server dalam perulangan.
Jangan periksa alamat publik server VPN itu sendiri dari dalam terowongan penuh. Pemeriksaan itu bergantung pada hal yang sedang diujinya, dan melaporkan sukses sementara jalur yang seharusnya divalidasi sudah hilang.
Catat pemeriksaan mana yang berjalan, apa yang dikembalikannya, dan tindakan apa yang menyusul. Catatan itu mengubah penyambungan ulang misterius menjadi peristiwa yang bisa didiagnosis.