persist-tun و persist-key در OpenVPN واقعاً چه چیزی را زنده نگه میدارند
هر دو گزینه یک راهاندازی مجدد نرم درون یک فرایند زنده را پوشش میدهند. آنها رابط را پس از توقف نگه نمیدارند و سیاست مسدود کردن ترافیک نیستند.
توقف سرویس رابط را حذف میکند، حتی وقتی persist-tun تنظیم شده باشد. این همان کارکرد گزینه مطابق مستندات است، نه یک خرابی. گزینه یک مسیر راهاندازی مجدد درون یک فرایند در حال اجرا را توصیف میکند، و systemctl stop آن مسیر نیست.
دو نام را با هم بخوانید و طراحی روشن میشود. یکی توصیفگر را نگه میدارد، دیگری ماده کلید را نگه میدارد، و هر دو به خاطر آنچه پس از کنار گذاشتن دسترسیها رخ میدهد وجود دارند.
دو منبع و راهاندازی مجددی که به آن تعلق دارند
OpenVPN راهاندازی مجدد خودش را در دو موقعیت معمول علامت میدهد. یک SIGUSR1 صریح این کار را میکند، و یک ping-restart که همتای مرده آن را برمیانگیزد همین کار را میکند. هر دو فرایند را زنده نگه میدارند و راهاندازی اتصال را دوباره اجرا میکنند، و اینجاست که گزینهها جای خود را به دست میآورند.
| Event | TUN/TAP device | Key and auth files | Addresses and routes | up/down hooks |
|---|---|---|---|---|
Soft reset, from SIGUSR1 or from a ping-restart the daemon sends itself | survives only with persist-tun | survive only with persist-key | survive with the device, otherwise rebuilt | run again only when restart hooks are enabled |
Configuration reload, SIGHUP | recreated | re-read from disk | rebuilt once the device returns | run again |
| Service stop | lost | re-read at the next start | removed | run at the next start |
تنها سطر راهاندازی مجدد نرم چیزی است که این دو گزینه تغییر میدهند، و کاری که از آن میگذرند بخش گران روی یک پیوند شلوغ است. باز کردن دوباره یک دستگاه، نشانیها و مسیرهای متصل به آن را از بین میبرد، و بازسازی آنها میتواند بستههایی را که هنگام آغاز راهاندازی مجدد در راه بودند بیندازد. توقف همان اشیاء را بدون هیچ گزینهای برای حفظ آنها نابود میکند.
چرا این گزینهها اصلاً وجود دارند
یک سرور سختشده OpenVPN معمولاً به عنوان root آغاز میشود، کلیدها و دستگاهش را باز میکند، سپس به کاربری بدون دسترسیهای ویژه میافتد. پس از آن افت، برخی عملیات به سادگی از دست میروند. خواندن یک فایل کلید با حالت 0600، ساختن یک رابط شبکه یا تغییر مسیرها همه میتوانند رد شوند.
بدون گزینههای persist، همتایی که به اندازه کافی ساکت بماند تا ping-restart را برانگیزد، دقیقاً همان عملیات را تحمیل میکرد. اتصال دوباره شکست میخورد حتی اگر هیچ چیز در پیکربندی تغییر نکرده بود. فرایند طوری به نظر میرسید که بیدلیل میمیرد، و گزارش خطای مجوز را به جای خطای شبکه نشان میداد.
با آنها، راهاندازی مجدد نرم آنچه را مرحله دارای دسترسیهای ویژه پیشتر به دست آورده دوباره به کار میگیرد. جادویی در کار نیست و فرایند از هیچ چیز جان سالم به در نمیبرد. به دست آوردن منابع صرفاً به تعویق میافتد.
اولین خطا را بخوانید، نه آخرین را
وقتی راهاندازی مجدد شکست میخورد، اولین خطا را به جای آخرین بخوانید. یک کلید محافظتشده، یک فایل auth، یک ioctl رابط و یک قلاب خارجی چهار منبع متفاوت هستند. نگه داشتن یکی چیزی درباره دسترسی به بقیه نمیگوید. قلابی که یک ابزار دیوار آتش را فرا میخواند هنوز به دسترسیهای ویژهای نیاز دارد که آن ابزار میطلبد.
قلابها کلید خودشان را دارند. راهنمای OpenVPN گزینههای persist را با up-restart جفت میکند، که تعیین میکند اسکریپتهای up و down پس از راهاندازی مجدد دوباره اجرا میشوند یا نه. بنابراین یک رابط که بالا مانده هیچ چیزی درباره بهروز شدن یکپارچهسازی resolver شما نمیگوید.
# which restart path just happened?
journalctl -u openvpn-client@office --since '10 min ago' | grep -E 'SIGUSR1|ping-restart|Restart pause|NOTE:'
# did the interface survive, and do its routes still exist?
ip -brief link show tun0
ip route show dev tun0
این جفت فرمان دو حالت خرابی را در چند ثانیه از هم جدا میکند. رابطی که وجود دارد ولی مسیرهایش غایب هستند یک مشکل قلاب یا مسیر است. رابطی که ناپدید شده یعنی فرایند واقعاً پایان یافته است.
رابط حفظشده یک kill switch نیست
اگر الزام این باشد که ترافیک هرگز از تونل بیرون نرود، یک دستگاه حفظشده آن را فراهم نمیکند. مسیرهای خانواده نشانی دیگر، یک مسیر پیشفرض دوم، و حالتی که فرایند کاملاً خارج میشود همه بیرون از دامنه گزینه میمانند.
دو الزام را جداگانه بررسی کنید. نگه داشتن شیء تونل میان اتصالهای دوباره آسودگی برای دیمن است. مسدود کردن خروج وقتی تونل پایین است یک سیاست دیوار آتش با قواعد و آزمون خودش است. درهم آمیختن آنها پیکربندیای میسازد که دفاعی به نظر میرسد و مانند اتصال دوباره با بهترین تلاش رفتار میکند.
پیش از تشخیص، رویداد را نام ببرید. یک راهاندازی مجدد نرم، یک تلاش اتصال ناموفق و یک توقف سرویس سه رویداد با سه رفتار هستند، و تنها اولی چیزی است که این گزینهها توصیف میکنند.