Skrip memulai klien VPN pada lapisan yang dipilih penulis, dan lapisan itu jarang menjadi lapisan yang dibutuhkan pekerjaan. Baris perintah vendor, penelepon sistem operasi, dan maksud aplikasi seluler semuanya kembali pada titik berbeda dalam hidup koneksi. Mereka juga menangani rahasia secara berbeda, dan perbedaan itu menentukan apakah kata sandi terlihat oleh setiap pengguna di mesin. Pilih lapisan sebelum Anda menulis baris pertama skrip.

Lapisan 1: baris perintah vendor

Sebagian besar klien desktop menyediakan baris perintah yang menerima nama profil dan, terlalu sering, kata sandi. Klien lama Cisco menerima kata kerja connect dengan argumen pengguna dan kata sandi; macOS mengekspos layanan bawaan melalui networksetup; NetworkManager menjawab nmcli. Panggilan ini kembali saat perintah selesai, yang bukan momen yang sama saat terowongan menjadi bisa dipakai. Baca dokumentasi vendor untuk versi yang Anda terapkan, karena antarmuka ini berubah dan sebagian dihapus sepenuhnya.

nmcli connection up "Work VPN"
networksetup -connectpppoeservice "Work VPN"

Keuntungannya adalah vendor mengenal penyimpanan profilnya sendiri, sehingga panggilan memakai konfigurasi yang sama dengan yang akan dipakai GUI. Kerugiannya adalah setiap vendor menciptakan kata kerjanya sendiri, dan skrip untuk satu klien tidak berpindah ke klien lain. Anggap lapisan ini jalur terpendek ketika klien tetap dan versinya dipatok.

Lapisan 2: layanan milik sistem operasi

Di Windows, penelepon adalah bagian dari sistem operasi dan bekerja terhadap entri buku telepon alih-alih penyimpanan profil vendor. Itu membuatnya lebih portabel antar klien dan lebih mudah ditulis skripnya dari akun layanan. Itu juga berarti koneksi bisa ada di satu tempat dan tidak di tempat lain, yang membingungkan orang yang melihat daftar yang salah.

rasdial "Work VPN" user pass
Get-VpnConnection -Name "Work VPN" | Select-Object ConnectionStatus

Gunakan permukaan PowerShell ketika Anda perlu membuat atau menghapus entri alih-alih memanggilnya. Lapisan WMI dan cmdlet mengekspos objek yang sama dengan nama berbeda, dan penghapusan adalah operasi terpisah dari pemutusan. Skrip yang hanya memanggil akan meninggalkan entri usang setelah migrasi. Periksa ke penyimpanan mana otomasi Anda menulis sebelum berjanji pembersihan terjadi.

Remove-VpnConnection -Name "Old VPN" -Force
Get-VpnConnection

Di macOS padanannya adalah daftar layanan jaringan, tempat layanan yang ada disambungkan dengan nama alih-alih dibuat saat itu juga.

Kredensial bocor di setiap lapisan, jadi pilih salurannya

Apa pun yang Anda lewatkan di baris perintah muncul di tabel proses untuk setiap pengguna lokal, dan biasanya bertahan juga di riwayat shell. Alternatif yang didukung OpenVPN adalah membaca rahasia dari berkas dengan --askpass, dan berkas itu sendiri memerlukan izin yang sesuai dengan kepercayaan yang Anda berikan. Pipa bernama menghindari penulisan rahasia ke disk tetapi membiarkan proses mana pun yang dapat membukanya menulis di sana. Di Windows, simpan rahasia di pengelola kredensial, atau di berkas yang hanya dapat dibaca akun layanan, dan jangan pernah sebagai literal dalam berkas batch.

openvpn --config /etc/openvpn/work.conf --askpass /etc/openvpn/work.secret --auth-nocache --daemon
ls -l /etc/openvpn/work.secret

Aturan yang sama berlaku untuk token dan kode sekali pakai: jika otomasi membutuhkannya, otomasi memerlukan saluran yang bukan argumen baris perintah. Putar rahasia saat Anda mengganti mekanismenya, karena nilai lama telah tertinggal di suatu log. Skrip yang berfungsi dan bocor bukanlah skrip yang berfungsi.

Tunggu status, lalu awasi satu pemilik

Setiap panggilan ini kembali sebelum terowongan siap, jadi jajaki status yang diekspos klien atau uji tujuan di dalamnya dengan batas waktu. Menyalin berkas atau membuka koneksi basis data segera setelah panggilan koneksi adalah perlombaan, dan gagal secara berkala dengan cara yang tampak seperti gangguan jaringan.

ip link show tun0
nmcli -t -f GENERAL.STATE connection show "Work VPN"
curl -sS --max-time 5 https://app.internal.example/health -o /dev/null

Pemutusan memiliki masalah yang sama secara terbalik: proses bisa keluar sebelum rute hilang. Gunakan hook klien di tempat hook itu ada, seperti skrip up dan down dari OpenVPN atau ExecStartPost unit systemd, karena keduanya berjalan pada titik yang benar-benar Anda pedulikan. Hook berjalan dengan hak istimewa dari apa pun yang memanggilnya, jadi hook yang memulai ulang jaringan memerlukan aturan eksplisit alih-alih asumsi. Pertahankan tepat satu pemilik selama masa hidup koneksi.

Ketika dua pengawas sama-sama memulai dan menghentikan profil itu, hasilnya adalah lingkaran sambung ulang yang terbaca seperti gangguan penyedia. Runbook berakhir ketika lapisan terdokumentasi, rahasia punya saluran yang bukan argv, syarat tunggu adalah pemeriksaan status dengan batas waktu, dan satu proses memiliki siklus hidupnya.

Artikel terkait