client-config-dir diabaikan setelah OpenVPN menjadi layanan
client-config-dir relatif diselesaikan terhadap direktori kerja daemon. Baca unit, telusuri izin jalurnya, lalu pastikan pencariannya di log.
Terowongan Anda naik dan klien terhubung, tetapi alamat tetap dan rute yang didorong yang Anda tetapkan untuk satu pengguna itu hilang. Log tidak mengatakan “file not found”, dan itulah yang membuat orang pergi membuat ulang sertifikat. Pada sebagian besar kasus ini daemon berjalan dari direktori yang berbeda dari shell tempat Anda menguji, dan client-config-dir tidak pernah diselesaikan seperti yang Anda asumsikan. Perbaikannya adalah koreksi jalur, bukan pengaturan ulang kredensial.
Baca unit sebelum menyentuh konfigurasi
Mulailah dari proses yang benar-benar berjalan, bukan dari berkas yang Anda sunting. Tanyakan kepada systemd baris eksekusi, direktori kerja, dan akun yang dituju. Ketiga jawaban itu menjelaskan sebagian besar kegagalan di kelas ini:
systemctl show openvpn-server@server -p ExecStart -p WorkingDirectory -p User -p RootDirectoryWorkingDirectory yang kosong berarti unit dimulai di /, jadi client-config-dir ccd relatif dicari di /ccd. Direktori itu hampir tidak pernah ada, dan daemon tidak menganggap ketiadaannya fatal.
Bandingkan dengan peluncuran interaktif yang Anda pakai saat menguji, ketika direktori kerja shell Anda kemungkinan adalah direktori konfigurasi. Berkas yang sama, kata kunci yang sama, dua hasil berbeda.
Terhadap apa jalur relatif diselesaikan
Kata kunci diselesaikan terhadap direktori kerja proses pada saat opsi digunakan. Artinya bukan “di sebelah berkas konfigurasi yang saya berikan lewat --config”. OpenVPN akan dengan senang hati membaca konfigurasi dari jalur absolut dan tetap menyelesaikan nilai relatif di tempat lain, dan itulah tepatnya jebakannya. Panduan OpenVPN 2.6 menyatakan aturannya di bawah --client-config-dir dan sekali lagi di bawah --cd.
Kata kunci cd mengubah konteks itu sebelum berkas lain dibaca, sehingga unit yang menyetel cd /etc/openvpn/server lalu client-config-dir ccd diselesaikan menjadi /etc/openvpn/server/ccd. Jika Anda menambahkan cd, periksa urutan direktif dan ingat bahwa itu memengaruhi setiap referensi relatif lain di berkas yang sama.
Telusuri jalur sebagai akun daemon
Jalur bisa benar dan tetap tidak terbaca. Setelah hak istimewa diturunkan daemon bukan lagi root, jadi setiap direktori induk memerlukan izin penelusuran untuk akun itu, dan berkas klien sendiri memerlukan izin baca. Satu bit eksekusi yang hilang pada direktori induk cukup untuk menyembunyikan berkas, dan kesalahannya hanya muncul sebagai klien yang diam-diam mendapat kumpulan bawaan.
namei mencetak izin setiap komponen secara berurutan, yang lebih cepat daripada memeriksa direktori satu per satu:
namei -l /etc/openvpn/server/ccd/client1Lalu uji pembacaan sebagai akun layanan, bukan sebagai diri Anda sendiri:
runuser -u openvpn -- test -r /etc/openvpn/server/ccd/client1 && echo readableJika unit memakai chroot, direktori harus ada di dalam kurungan, dan jalur dalam konfigurasi ditafsirkan setelah chroot diterapkan. Berkas yang ada di host di luar kurungan tidak terlihat dari dalam.
Pastikan pencariannya, jangan menebak
Naikkan level log untuk satu restart dan baca apa kata server tentang opsi khusus klien. Pada verb 4 daemon melaporkan konfigurasi per klien yang diimpornya, jadi baris yang tidak ada adalah bukti langsung bahwa tidak ada berkas yang dibaca untuk koneksi itu.
openvpn --config /etc/openvpn/server.conf --verb 4 --client-config-dir /etc/openvpn/server/ccdJalankan itu di latar depan pada port cadangan dan hubungkan satu klien. Itu mengeluarkan systemd sepenuhnya dari gambar: jika penimpaan muncul di sini dan tidak di bawah layanan, bedanya adalah konteks unit, bukan berkasnya.
Putuskan apa yang harus terjadi ketika tidak ada berkas yang cocok. Tanpa ccd-exclusive klien diterima hanya dengan pengaturan kumpulan global, dan itulah kegagalan senyap yang dijelaskan di atas. Dengannya, berkas yang hilang menjadi koneksi yang ditolak, dan penolakan itu lebih mudah terlihat tetapi lebih sulit di-debug di bawah beban.
Perbaiki, mulai ulang, verifikasi
Jadikan direktori absolut dalam konfigurasi dan biarkan begitu. Jalur relatif hanya aman ketika unit mematok direktori kerja, dan mematoknya adalah bagian bergerak tambahan yang akan dihapus seseorang nanti.
client-config-dir /etc/openvpn/server/ccd
ccd-exclusiveMulai ulang instans, hubungkan kembali satu klien yang dikenal, dan baca alamat yang diterimanya bersama rute yang didorong kepadanya. Jika alamat itu cocok dengan baris ifconfig-push di berkas klien itu, pencariannya berhasil. Jika klien masih jatuh ke kumpulan umum, kembali ke hitungan baris log: nol impor berarti jalur atau identitasnya salah, satu impor dengan isi yang salah berarti Anda menyunting berkas lain daripada yang dibaca daemon.
Kembalikan dengan memulihkan unit dan konfigurasi sebelumnya bersama-sama, lalu mulai ulang. Sertifikat tidak perlu diterbitkan ulang untuk semua ini, dan memperlakukan masalah direktori sebagai masalah kredensial adalah cara perbaikan lima menit berubah menjadi jendela pemeliharaan.