Profil yang tadinya berjalan kini gagal dengan kesalahan opsi, dan baris yang dikutip pengurai tampak sepenuhnya wajar di layar. Itulah jebakannya: berkas konfigurasi adalah daftar baris fisik, masing-masing memuat satu kata kunci opsi dan argumennya, dan baris panjang yang dibungkus editor tampak identik dengan dua baris sampai Anda melihat byte-nya. Tidak ada yang terlibat dari jaringan, sertifikat, atau terowongan dalam kelas kegagalan ini. Dua baris yang tampak identik di layar bisa berbeda satu byte.

Kerjakan pemeriksaan di bawah ini secara berurutan dan berhenti pada yang pertama gagal. Masing-masing lebih murah daripada berikutnya, dan masing-masing menyingkirkan penjelasan yang berbeda.

Satu baris, satu direktif

Pengurai membaca satu baris, mengambil kata pertama sebagai opsi, dan memperlakukan sisanya sebagai argumen opsi itu. Baris seperti cert server.crt port 1194 karena itu bukan dua instruksi berurutan. Itu satu opsi cert dengan tiga argumen, dan yang ketiga bukan nama berkas yang diterima opsi tersebut. Membaca kesalahan sebagai pemisah baris yang hilang itu benar; membacanya sebagai direktif yang hilang tidak.

# malformed: one option, three arguments
cert server.crt port 1194

# intended: two options, one argument each
cert server.crt
port 1194

Dua baris yang dikoreksi itu adalah fragmen, bukan konfigurasi. Keduanya ada untuk menunjukkan di mana batasnya berada. Setiap direktif biasa dalam profil mengikuti aturan yang sama, dan baris yang menggabungkan dua di antaranya menghasilkan entah kesalahan argumen atau nilai yang tidak diharapkan opsi itu.

Buktikan bahwa pemisah baris itu nyata

Editor membungkus untuk tampilan. Sebagian juga menyisipkan pemisah keras saat Anda menempel, sebagian tidak, sehingga hasil visual yang sama bisa berasal dari dua berkas yang sangat berbeda. Tampilkan akhir baris dan hitung barisnya sebelum mengubah apa pun. Mengukur membutuhkan satu perintah; menebak membutuhkan satu malam.

cat -A /etc/openvpn/server/lab.conf | sed -n '10,20p'
awk 'NR>=10 && NR<=20 {printf "%d:%s\n", NR, $0}' /etc/openvpn/server/lab.conf

Pada keluaran pertama setiap pemisah baris nyata muncul sebagai penanda $, sehingga baris yang dibungkus tetapi tidak dipisah tidak menunjukkan penanda di tempat layar Anda membungkus. Perintah kedua mencetak baris bernomor, yang merupakan cara tercepat untuk membandingkan apa yang dilaporkan pengurai dengan apa yang ada di berkas.

Spasi tambahan juga tidak menciptakan direktif. Indentasi bersifat kosmetik, dan baris yang dimulai dengan spasi tetap merupakan opsi tunggal yang sama. Jika pesan kesalahan menunjuk nomor baris, bacalah baris persis itu alih-alih paragraf tempatnya berada.

Kutip jalur, bukan daftar direktif

Tanda kutip ada untuk argumen yang mengandung spasi, bukan untuk mengelompokkan opsi. Jalur sertifikat dengan spasi memerlukan tanda kutipnya sendiri; dua direktif yang berbagi sepasang tanda kutip tetap satu baris cacat.

cert "/etc/openvpn/pki/lab certs/server.crt"
key "/etc/openvpn/pki/lab certs/server.key"

Periksa nama opsi bersamaan dengan tata letaknya, karena baris yang digabung dapat menghasilkan token yang tampak masuk akal yang tidak pernah ada. Direktif port adalah port; profil yang memakai hal lain untuk gagasan yang sama akan gagal bahkan setelah batas baris diperbaiki. Ketika sebuah nama tampak asing, bandingkan dengan daftar opsi untuk versi yang Anda jalankan, bukan dengan contoh forum.

Pertahankan blok inline sebagai blok

Profil dapat membawa sertifikat dan kunci secara inline, dan blok itu adalah data, bukan konfigurasi. Baris PEM di dalam blok bukan opsi untuk diratakan, diindentasi ulang, atau digabung, dan penanda blok harus tetap pada barisnya sendiri.

Perlakukan blok inline sebagai wilayah buram: koreksi baris opsi di sekitarnya, biarkan isinya tidak tersentuh byte demi byte, dan jangan pernah menempelkannya ke utas dukungan publik. Jika alat pemformatan menulis ulang blok itu, pulihkan dari PKI Anda alih-alih memperbaikinya dengan tangan.

Perbaiki bagian terkecil, bukan templatnya

Perbaikan yang menggoda adalah mengganti seluruh berkas dengan konfigurasi dari tutorial yang „berfungsi”. Itu menukar satu baris cacat dengan serangkaian perubahan kebijakan yang tidak ditinjau siapa pun: parameter DH berbeda, pengaturan kompresi, pilihan sandi, pendengar ganda. Masalah aslinya kecil dan lokal, dan penggantinya bukan keduanya.

Salin profil ke berkas kerja yang terlindungi, koreksi batas baris di salinan itu, dan biarkan pemilik biasa layanan memuatnya. Lalu jalankan instans dan bacalah kesalahan pertama, jika ada, dari awal.

openvpn --config /etc/openvpn/server/lab.conf --verb 3 --log /tmp/parse.log
grep -n 'Options error' /tmp/parse.log

Ketika tahap penguraian lolos, kegagalan berikutnya akan menyangkut berkas, sertifikat, atau sandi alih-alih kosakata, dan itu kemajuan nyata. Simpan salinan kerja dan catatan satu baris tentang apa yang digabungkan; penempelan yang sama akan terjadi lagi pada orang lain di tim yang sama.

Artikel terkait