نادیده گرفتن client-config-dir پس از تبدیل شدن OpenVPN به سرویس
یک client-config-dir نسبی نسبت به پوشه کاری دیمن حل میشود. واحد را بخوانید، مجوزهای مسیر را بررسی کنید و سپس جستجو را در لاگ تأیید کنید.
تانل بالا میآید و کلاینت وصل میشود، اما آدرس ثابت و مسیرهای هلدادهشدهای که برای همان یک کاربر تعریف کرده بودید غایباند. لاگ نمیگوید “file not found”، و همین است که آدمها را به بازتولید گواهیها میفرستد. در بیشتر این موارد دیمن از پوشهای متفاوت با شلی که در آن تست کردید اجرا میشود، و client-config-dir هرگز آنگونه که فرض کردید حل نشد. راهحل اصلاح مسیر است، نه بازنشانی اعتبارنامهها.
پیش از دست زدن به پیکربندی، واحد را بخوانید
از فرایندی که واقعاً اجرا میشود شروع کنید، نه از فایلی که ویرایش کردید. از systemd خط اجرا، پوشه کاری و حسابی که به آن تنزل مییابد را بپرسید. همان سه پاسخ بیشتر خطاهای این دسته را توضیح میدهند:
systemctl show openvpn-server@server -p ExecStart -p WorkingDirectory -p User -p RootDirectoryWorkingDirectory خالی یعنی واحد در / شروع میشود، پس client-config-dir ccd نسبی در /ccd جستجو میشود. آن پوشه تقریباً هرگز وجود ندارد و دیمن نبودنش را مهلک نمیداند.
آن را با اجرای تعاملیای که هنگام تست به کار بردید مقایسه کنید، جایی که پوشه جاری شل شما احتمالاً پوشه پیکربندی بود. همان فایل، همان کلیدواژهها، دو نتیجه متفاوت.
مسیر نسبی نسبت به چه چیزی حل میشود
کلیدواژه نسبت به پوشه کاری فرایند در لحظه استفاده از گزینه حل میشود. معنایش “کنار فایل پیکربندیای که با --config پاس دادم” نیست. OpenVPN با کمال میل پیکربندی را از مسیری مطلق میخواند و باز هم مقادیر نسبی را جای دیگری حل میکند، و تله همینجاست. راهنمای OpenVPN 2.6 قاعده را زیر --client-config-dir و باز زیر --cd بیان میکند.
کلیدواژه cd پیش از خوانده شدن فایلهای دیگر آن زمینه را تغییر میدهد، پس واحدی که cd /etc/openvpn/server و سپس client-config-dir ccd را تنظیم میکند به /etc/openvpn/server/ccd حل میشود. اگر cd را اضافه میکنید، ترتیب دستورها را بررسی کنید و به یاد داشته باشید که بر هر ارجاع نسبی دیگر در همان فایل اثر میگذارد.
مسیر را با حساب دیمن بپیمایید
مسیر میتواند درست و در همان حال ناخوانا باشد. پس از کاهش امتیازها دیمن دیگر root نیست، بنابراین هر پوشه والد برای آن حساب به مجوز جستجو نیاز دارد و خود فایل کلاینت به مجوز خواندن. یک بیت اجرای غایب روی یک والد برای پنهان کردن فایل کافی است و خطا فقط به صورت کلاینتی ظاهر میشود که بیصدا استخر پیشفرض را میگیرد.
namei مجوز هر جزء را به ترتیب چاپ میکند، که از بررسی پوشهها یکییکی سریعتر است:
namei -l /etc/openvpn/server/ccd/client1سپس خواندن را به عنوان حساب سرویس بیازمایید، نه به عنوان خودتان:
runuser -u openvpn -- test -r /etc/openvpn/server/ccd/client1 && echo readableاگر واحد از chroot استفاده میکند، پوشه باید داخل زندان وجود داشته باشد و مسیر در پیکربندی پس از اعمال chroot تفسیر میشود. فایلی که روی میزبان بیرون زندان است از داخل نامرئی است.
جستجو را تأیید کنید، نه حدس بزنید
سطح لاگ را برای یک بار راهاندازی مجدد بالا ببرید و بخوانید سرور درباره گزینههای مخصوص کلاینت چه میگوید. در verb 4 دیمن پیکربندی واردشده برای هر کلاینت را گزارش میکند، پس نبودن خط شاهد مستقیم آن است که برای آن اتصال هیچ فایلی خوانده نشده است.
openvpn --config /etc/openvpn/server.conf --verb 4 --client-config-dir /etc/openvpn/server/ccdآن را در پیشزمینه روی پورتی دیگر اجرا کنید و یک کلاینت وصل کنید. این کار systemd را کاملاً از تصویر بیرون میبرد: اگر بازنویسیها اینجا ظاهر شوند و زیر سرویس نه، تفاوت در زمینه واحد است نه در فایل.
تصمیم بگیرید وقتی هیچ فایلی مطابقت ندارد چه باید بشود. بدون ccd-exclusive کلاینت فقط با تنظیمات استخر جهانی پذیرفته میشود، و همان شکست خاموشی است که بالا توصیف شد. با آن، فایل غایب به اتصال ردشده تبدیل میشود، و آن رد شدن آسانتر دیده میشود اما زیر بار سختتر اشکالزدایی میشود.
اصلاح کنید، راهاندازی مجدد کنید، بررسی کنید
پوشه را در پیکربندی مطلق کنید و همانطور نگه دارید. مسیرهای نسبی تنها زمانی ایمناند که واحد پوشه کاری را سنجاق کند، و سنجاق کردن یک قطعه متحرک اضافه است که کسی بعداً برش میدارد.
client-config-dir /etc/openvpn/server/ccd
ccd-exclusiveنمونه را راهاندازی مجدد کنید، یک کلاینت شناختهشده را دوباره وصل کنید و آدرسی را که گرفت همراه با مسیرهای هلدادهشده به آن بخوانید. اگر آدرس با خط ifconfig-push در فایل آن کلاینت میخواند، جستجو کار کرده است. اگر کلاینت هنوز در استخر عمومی میافتد، به شمارش خطوط لاگ برگردید: صفر واردسازی یعنی مسیر یا هویت اشتباه است، یک واردسازی با محتوای نادرست یعنی فایلی جز آنچه دیمن میخواند را ویرایش میکنید.
با بازگرداندن همزمان واحد و پیکربندی قبلی عقبنشینی کنید و سپس راهاندازی مجدد کنید. گواهیها برای هیچکدام از اینها نیاز به صدور دوباره ندارند، و برخورد با مشکل پوشه به عنوان مشکل اعتبارنامه همان چیزی است که اصلاح پنجدقیقهای را به پنجره نگهداری تبدیل میکند.