Memulai ulang layanan pada OpenVPN up: hook mengalahkan tun0.device
Unit perangkat melacak antarmuka, bukan koneksi. Pilih up atau route-up untuk kondisi yang dibutuhkan layanan, lalu kirim mulai ulang yang tidak memblokir.
Menghubungkan layanan dependen ke tun0.device tampak seperti berlangganan tunnel, dan bukan begitu. Unit perangkat mencerminkan bahwa antarmuka ada, yang bisa tetap benar selama koneksi gagal dan penyambungan ulang yang menyusul. Layanan lalu bertindak pada saat yang salah, atau tidak pernah, tergantung apakah antarmuka menghilang di antaranya. Hook yang menggambarkan peristiwa yang benar-benar Anda pedulikan adalah yang dipanggil OpenVPN, bukan yang disimpulkan systemd.
Putuskan kondisi mana yang dibutuhkan layanan sebelum memilih pemicu, karena ketiga kandidat tidak dapat dipertukarkan.
Apa yang sebenarnya dilacak unit perangkat
systemd membuat unit perangkat dari pandangan kernel tentang antarmuka jaringan, sehingga tun0.device menjadi aktif saat antarmuka muncul dan tidak aktif saat dihapus. Dengan persist-tun, mulai ulang lunak menjaga antarmuka tetap di tempatnya, sehingga unit tidak pernah berkedip dan tidak ada yang terikat padanya dipicu. Bahkan tanpa persistensi, unit tidak mengatakan apa pun tentang rute, DNS, atau apakah ujung jauh menjawab.
Itu menjadikannya pengganti yang buruk untuk 'VPN sudah siap'. Pendengar yang hanya membutuhkan alamat lokal mungkin puas dengan keberadaan antarmuka, sementara layanan yang memanggil aplikasi di jaringan jauh membutuhkan rute dan keterjangkauan, yang tidak dapat diungkapkan unit perangkat.
up, route-up, dan up-restart berarti hal yang berbeda
up berjalan setelah perangkat TUN/TAP dibuka dan antarmuka dikonfigurasi, yang merupakan saat yang tepat bagi pendengar yang mengikat alamat yang ditetapkan. route-up berjalan setelah rute dipasang, tunduk pada penundaan rute yang dikonfigurasi, dan cocok untuk pekerjaan yang membutuhkan tahap rute selesai. Keduanya tidak membuktikan bahwa aplikasi jauh menjawab. Memilih di antara keduanya adalah pertanyaan tentang apa yang dibutuhkan layanan, bukan tentang hook mana yang terdengar lebih selesai.
Dengan persist-tun, mulai ulang menggunakan kembali perangkat, sehingga up tidak berjalan lagi kecuali up-restart diatur. Opsi itu mengaktifkan skrip up untuk siklus hidup mulai ulang yang didokumentasikan, dan lingkungannya berkurang dibandingkan dengan start pertama. Skrip yang mengasumsikan lingkungan penuh berfungsi pada koneksi pertama dan gagal pada koneksi berikutnya.
Kirim tindakan tanpa menunggunya
Hook yang memanggil systemctl restart secara sinkron dapat mengalami deadlock terhadap unit yang urutannya menunggu tunnel. systemctl --no-block try-restart vpn-dependent.service mengantrekan tugas dan kembali, yang mencegah hook memblokir koneksi yang sedang ditanggapinya. try-restart hanya bekerja pada unit yang berjalan, sedangkan restart juga memulai unit yang tidak aktif; pilih dengan sengaja, bukan karena kebiasaan.
Mengantrekan bukan verifikasi. Hook mengembalikan sukses begitu tugas diterima, jadi pemeriksaan harus terjadi di jurnal unit target atau pada keadaan pendengarnya yang sebenarnya.
Kebijakan mulai ulang hidup di unit, bukan di hook
Unit oneshot dengan RemainAfterExit=yes tetap aktif setelah perintahnya keluar, dan permintaan start kedua tidak melakukan apa pun karena systemd menganggapnya sudah dimulai. Itu adalah sifat yang perlu dirancang, bukan cacat yang diakali dengan panggilan start berulang. Jika tindakan harus berjalan per koneksi, unit memerlukan bentuk yang memungkinkannya.
After= mengurutkan unit, dan BindsTo= mengikat masa hidup, tetapi keduanya tidak berarti 'mulai ulang ini setiap kali VPN tersambung kembali'. Unit yang terikat ke tunnel berhenti saat tunnel berhenti; unit itu tidak memulai ulang dirinya saat tunnel kembali kecuali ada sesuatu yang memulainya lagi.
Uji tiga penyambungan ulang, bukan satu
Boot dingin, mulai ulang klien penuh, dan penyambungan ulang lunak masing-masing melatih jalur berbeda. Penyambungan ulang lunak adalah yang menyingkap up-restart yang hilang, lingkungan yang berkurang, atau unit perangkat yang tidak pernah menjadi tidak aktif. Jalankan ketiganya dan konfirmasi kedua arah: layanan bertindak saat tunnel naik, dan tidak memulai ulang pada perubahan tautan yang tidak terkait seperti roaming Wi-Fi.
Pertahankan jalur pemulihan independen saat layanan dependen membawa akses administrasi Anda sendiri. Hook yang memulai ulang hal yang Anda gunakan untuk terhubung adalah perubahan yang dapat mengunci Anda di luar.