Terowong anda naik dan klien bersambung, tetapi alamat tetap dan laluan yang ditolak yang anda takrifkan untuk pengguna tunggal itu hilang. Log tidak menyebut “file not found”, dan itulah yang menghantar orang mencipta semula sijil. Dalam kebanyakan kes ini daemon berjalan dari direktori berbeza daripada shell tempat anda menguji, dan client-config-dir tidak pernah diselesaikan seperti yang anda andaikan. Pembetulannya ialah pembetulan laluan, bukan penetapan semula kelayakan.

Baca unit sebelum menyentuh konfigurasi

Mulakan dengan proses yang benar-benar berjalan, bukan fail yang anda sunting. Tanya systemd tentang baris pelaksanaan, direktori kerja dan akaun yang dituju. Ketiga-tiga jawapan itu menjelaskan kebanyakan kegagalan dalam kelas ini:

systemctl show openvpn-server@server -p ExecStart -p WorkingDirectory -p User -p RootDirectory

WorkingDirectory yang kosong bermakna unit bermula di /, jadi client-config-dir ccd relatif dicari di /ccd. Direktori itu hampir tidak pernah wujud, dan daemon tidak menganggap ketiadaannya sebagai maut.

Bandingkan dengan pelancaran interaktif yang anda gunakan semasa menguji, di mana direktori semasa shell anda mungkin direktori konfigurasi. Fail sama, kata kunci sama, dua hasil berbeza.

Terhadap apa laluan relatif diselesaikan

Kata kunci diselesaikan terhadap direktori kerja proses pada saat pilihan itu digunakan. Ia tidak bermaksud “di sebelah fail konfigurasi yang saya hantar dengan --config”. OpenVPN akan membaca konfigurasi dari laluan mutlak dengan senang hati dan masih menyelesaikan nilai relatif di tempat lain, dan itulah tepat perangkapnya di sini. Manual OpenVPN 2.6 menyatakan peraturan itu di bawah --client-config-dir dan sekali lagi di bawah --cd.

Kata kunci cd mengubah konteks itu sebelum fail lain dibaca, jadi unit yang menetapkan cd /etc/openvpn/server dan kemudian client-config-dir ccd diselesaikan kepada /etc/openvpn/server/ccd. Jika anda menambah cd, semak susunan arahan dan ingat ia mempengaruhi setiap rujukan relatif lain dalam fail yang sama.

Telusuri laluan sebagai akaun daemon

Laluan boleh betul tetapi masih tidak boleh dibaca. Selepas keistimewaan diturunkan daemon bukan lagi root, jadi setiap direktori induk memerlukan kebenaran carian untuk akaun itu, dan fail klien sendiri memerlukan kebenaran baca. Satu bit pelaksanaan yang hilang pada induk sudah cukup untuk menyembunyikan fail itu, dan ralat hanya muncul sebagai klien yang diam-diam mendapat kolam lalai.

namei mencetak kebenaran setiap komponen mengikut urutan, yang lebih pantas daripada memeriksa direktori satu demi satu:

namei -l /etc/openvpn/server/ccd/client1

Kemudian uji bacaan sebagai akaun perkhidmatan dan bukan sebagai diri anda:

runuser -u openvpn -- test -r /etc/openvpn/server/ccd/client1 && echo readable

Jika unit menggunakan chroot, direktori itu mesti wujud di dalam penjara, dan laluan dalam konfigurasi ditafsirkan selepas chroot digunakan. Fail yang ada pada hos di luar penjara tidak kelihatan dari dalam.

Sahkan carian itu dan jangan meneka

Naikkan tahap log untuk satu permulaan semula dan baca apa yang pelayan katakan tentang pilihan khusus klien. Pada verb 4 daemon melaporkan konfigurasi setiap klien yang diimportnya, jadi baris yang tiada adalah bukti langsung bahawa tiada fail dibaca untuk sambungan itu.

openvpn --config /etc/openvpn/server.conf --verb 4 --client-config-dir /etc/openvpn/server/ccd

Jalankan itu di latar hadapan pada port lapang dan sambungkan satu klien. Itu mengeluarkan systemd sepenuhnya daripada gambaran: jika override muncul di sini dan bukan di bawah perkhidmatan, perbezaannya ialah konteks unit, bukan fail.

Tentukan apa yang patut berlaku apabila tiada fail sepadan. Tanpa ccd-exclusive klien diterima hanya dengan tetapan kolam global, dan itulah kegagalan senyap yang diterangkan di atas. Dengannya, fail yang tiada menjadi sambungan yang ditolak, dan penolakan itu lebih mudah dilihat tetapi lebih sukar dinyahpepijat di bawah beban.

Betulkan, mula semula, sahkan

Jadikan direktori itu mutlak dalam konfigurasi dan biarkan begitu. Laluan relatif hanya selamat apabila unit memakukan direktori kerja, dan memaukannya ialah bahagian bergerak tambahan yang seseorang akan buang kemudian.

client-config-dir /etc/openvpn/server/ccd
ccd-exclusive

Mula semula instans, sambung semula satu klien yang dikenali dan baca alamat yang diterimanya bersama laluan yang ditolak kepadanya. Jika alamat itu sepadan dengan baris ifconfig-push dalam fail klien itu, carian berjaya. Jika klien masih jatuh ke kolam umum, kembali ke kiraan baris log: sifar import bermakna laluan atau identiti salah, satu import dengan kandungan salah bermakna anda menyunting fail lain daripada yang dibaca daemon.

Undur dengan memulihkan unit dan konfigurasi sebelumnya bersama-sama, kemudian mula semula. Sijil tidak perlu dikeluarkan semula untuk semua ini, dan melayan masalah direktori sebagai masalah kelayakan ialah cara pembetulan lima minit bertukar menjadi tetingkap penyelenggaraan.

Artikel berkaitan