Kontainer aplikasi yang berbagi namespace jaringan kontainer VPN tidak punya antarmuka sendiri, jadi mudah menganggapnya tidak bisa mengirim apa pun saat tunnel gagal. Anggapan itu salah pada mode kegagalan yang penting. Jika proses VPN mati sementara namespace bertahan, aplikasi mempertahankan socket-nya dan namespace mempertahankan rutenya, dan lalu lintas berlanjut pada jalur yang masih terpasang. Kill switch sungguhan adalah kebijakan penyaringan eksplisit ditambah pengujian siklus hidup runtime, bukan dependensi saat mulai.

Mengapa berbagi namespace bukan kill switch

Berbagi namespace berarti aplikasi memakai antarmuka, alamat, dan tabel rute kontainer VPN. Itu menghapus jalur mandiri aplikasi ke jaringan selama namespace bersama utuh, dan tidak mengatakan apa pun tentang apa yang akan dilakukan namespace itu saat tunnel hilang.

Kondisi dependensi Compose dapat menunda mulai aplikasi sampai sebuah dependensi sehat. Itu hanya mencakup satu momen waktu dan tidak mencakup kegagalan berikutnya, jadi itu alat pengurutan mulai, bukan firewall keluar yang terus-menerus.

Apa yang sebenarnya terjadi saat kontainer keluar

Bedakan tiga peristiwa. Proses VPN di dalam kontainer bisa mati sementara kontainer tetap berjalan. Kontainer bisa berhenti atau dihapus, yang menghancurkan namespace. Kontainer bisa dibuat ulang, yang membangun namespace baru dan aturan baru.

Pada kasus pertama namespace tetap ada, rute default mungkin masih mengarah ke antarmuka fisik, dan aplikasi tetap mengirim langsung. Pada kasus kedua aplikasi dependen biasanya kehilangan konektivitas sepenuhnya, karena namespace-nya hilang. Pada kasus ketiga aplikasi bisa tersambung lagi ke namespace baru sebelum tunnel siap. Setiap kasus perlu pengujian berbeda, dan desain yang hanya mencakup pemutusan tertib hanya mencakup kasus yang paling tidak menarik.

Bangun kebijakan keluar yang eksplisit

Tulis kebijakan di dalam namespace bersama agar berlaku untuk paket aplikasi. Bentuknya adalah penolakan default dengan pengecualian sempit: loopback, antarmuka tunnel, serta alamat dan port titik akhir tertentu yang dibutuhkan transport tunnel.

Pengecualian titik akhir harus sudah ada sebelum tunnel naik, atau klien VPN tidak dapat menjangkau servernya. Itulah sebabnya kumpulan aturan mengizinkan transport luar secara eksplisit alih-alih mengizinkan antarmuka fisik secara umum. Tambahkan juga aturan IPv6 jika namespace punya konektivitas IPv6, karena kebijakan hanya IPv4 membiarkan keluarga alamat lain terbuka.

DNS juga termasuk dalam kebijakan. Jika aplikasi menyelesaikan nama melalui resolver yang hanya dapat dijangkau di dalam tunnel, aturan penolakan akan memutus penyelesaian saat tunnel mati, dan itu perilaku yang benar untuk kill switch. Putuskan dengan sadar apakah itu yang Anda inginkan.

Uji siklus hidup, bukan hanya pemutusan

Kirim permintaan baru yang tidak berbahaya saat tunnel sehat, lalu matikan proses VPN dan kirim lagi. Ulangi setelah kontainer berhenti, setelah restart, dan setelah dibuat ulang. Permintaan baru penting karena koneksi yang sudah ada bisa bertahan terhadap perubahan aturan yang memblokir koneksi baru.

Jangan mengandalkan pemeriksaan kesehatan atau pencarian IP keluar sebagai mekanisme pemblokiran. Pemeriksaan mengamati keadaan dan melaporkannya; kebijakan mengendalikan lalu lintas. Keduanya termasuk dalam penerapan yang sama, dan keduanya bukan pengganti.

Catat aturannya agar pengujian bertahan melewati pembaruan

Tulis hasil yang diharapkan untuk setiap kasus kegagalan ke dalam dokumentasi penerapan, bersama aturan yang menerapkannya. Catatan itu memungkinkan pengujian yang sama dijalankan setelah pembaruan image atau peningkatan runtime, ketika perilaku namespace atau rute default dapat berubah tanpa ada yang menyunting berkas compose.

Jaga jalur luar yang diperlukan titik akhir VPN terpisah dari keluar aplikasi tanpa batas, dan jaga DNS serta IPv6 di dalam cakupan yang dimaksud. Jika kebijakan mengizinkan seluruh antarmuka fisik demi kemudahan, kill switch-nya hilang. Dokumentasi jaringan Docker menjelaskan susunan namespace bersama yang menjadi dasar kebijakan itu, dan itulah rujukan yang diperiksa ketika perilaku runtime dipertanyakan.

Artikel terkait