Systemd در برابر NetworkManager: چه کسی VPN را هنگام بوت راه میاندازد؟
سه سازوکار میتوانند همان پروفایل Ubuntu را بالا بیاورند، هر یک با محرک متفاوت. آنها را مقایسه کنید، یک مالک نگه دارید و تکراری را بازنشسته کنید.
دو ماشین Ubuntu از یک تصویر، یک پروفایل VPN، نتایج متضاد هنگام ورود: روی یکی تونل پیش از ظهور میزکار بالا است و روی دیگری هرگز بالا نمیآید. پروفایل در اینجا متغیر نیست. تفاوت در این است که به کدام یک از سه جزء دستور داده شده آن را راه بیندازد، و این سه یک کلید را با هم شریک نیستند.
مقایسه آنها کنار هم از حدس زدن سریعتر است. هر یک به شکلی قابل تشخیص شکست میخورد، و همین مقایسه را ارزشمند میکند.
سه راهانداز با سه محرک متفاوت
سرویس بستهبندیشده openvpn قدیمیترین مسیر است. اسکریپت init آن فهرست راهاندازی خودکار را از /etc/default/openvpn میخواند. اگر آن فهرست کامنت شده یا خالی مانده باشد، اسکریپت هر پیکربندیای را که در آن پوشه پیدا کند راه میاندازد، نه فقط همان یکی که شما افزودهاید. یک فایل که برای یک تونل افزوده شده میتواند بیصدا چند تا را بالا بیاورد.
| Starter | What triggers it | Typical failure |
|---|---|---|
| Init script and templated units | Boot, plus anything in the autostart list | Starts every config, not the one you meant |
| NetworkManager secondary | Activation of the base Wi-Fi or Ethernet profile | Nothing happens until that base link comes up |
| Hand-written unit or wrapper | Whatever its WantedBy and ExecStart say | Runs a different binary or environment than your shell |
ردیف دوم همانی است که مردم اشتباه پیکربندی میکنند. NetworkManager پروفایل واردشده را نگه میدارد و آن را راه میاندازد، اما فقط بهعنوان ثانویه یک اتصال دیگر، یعنی محرک به پیوند شبکه تعلق دارد نه به VPN.
هزینه راهاندازی و دامنه را مقایسه کنید
مسیر اسکریپت init یک خط هزینه دارد و همه پیکربندیهای دستگاه را پوشش میدهد. این برای روتر درست و برای لپتاپی که به شبکههای مختلف وصل میشود نادرست است. مسیر NetworkManager هزینه یک جستوجوی UUID را دارد و تونل را به یک اتصال پایه میبندد. در شبکه محل کار بالا میآید و در شبکه هتل پایین میماند.
یک unit دستنویس بیشترین هزینه را دارد و بیشترین کنترل را میخرد، از جمله ترتیب نسبت به سرویسهای دیگر. دامنه عامل تعیینکننده است. اگر دستگاه یک شبکه و یک تونل دارد، سرویس بستهبندی صادق و قابل پیشبینی است. اگر تونل باید از یک شبکه Wi-Fi مشخص پیروی کند، ثانویه تنها یکی از سه است که آن شرط را بدون اسکریپتنویسی اضافه بیان میکند.
یک مالک انتخاب کنید و بقیه را بردارید
پروفایلی که دو مالک آن را راه میاندازند، زمانبندیای تولید میکند که بین بوتها تغییر میکند، و این از هر یک از سازوکارها بهتنهایی بدتر است. مالک را انتخاب کنید، سپس مسیر رقیب را عمداً غیرفعال کنید نه تصادفی.
# who is configured to start something?
grep -v '^#' /etc/default/openvpn
systemctl list-units 'openvpn*'
nmcli -g connection.secondaries connection show 'Work Wi-Fi'
# NetworkManager: attach the tunnel to the base link by UUID
TUNNEL=$(nmcli -g UUID connection show 'Corp Tunnel')
nmcli connection modify 'Work Wi-Fi' +connection.secondaries "$TUNNEL"
اگر مسیری که بازنشسته میشود همان مسیر بستهبندیشده است، به ترتیب درست انجامش دهید: AUTOSTART را روی none بگذارید، systemctl daemon-reload را اجرا کنید تا unitهای تولیدشده فهرست جدید را بردارند، سپس نمونه قالبی را که دیگر نمیخواهید غیرفعال کنید. نادیده گرفتن بارگذاری مجدد، unitهای قدیمی را فعال نگه میدارد و به نظر میرسد تغییر هیچ اثری نداشته است.
توقفی که معلق میماند مسئلهای جداگانه با پاسخی محدود است. TimeoutStopSec محدود میکند systemd چه مدت پیش از فرستادن SIGKILL صبر کند. فایل drop-in جای درست تنظیم آن است، چون ویرایش unit بستهبندیشده تغییر را در ارتقای بعدی از دست میدهد.
بررسی کنید واقعاً چه چیزی راه افتاده است
دستگاه را دوباره بوت کنید و شواهد را بخوانید، نه اینکه به فایل پیکربندی اعتماد کنید. unitی که مالک تونل است وضعیت فعال و مهر زمانی شروعی متناسب با بوت نشان میدهد و رابط VPN پیش از ورود شما وجود خواهد داشت.
systemctl is-enabled openvpn-client@office
systemctl status openvpn-client@office --no-pager
nmcli -f GENERAL.STATE,connection.secondaries connection show 'Work Wi-Fi'
ip -brief link show tun0
یک بررسی دیگر هم اینجا جا دارد: تأیید کنید ExecStart مربوط به unit به همان باینریای اشاره میکند که فکر میکنید. کلاینت کامپایلشده محلی یا بسته snap اغلب به یک مسیر صریح یا پوشش snap run نیاز دارد، چون systemd ترتیب جستوجوی پوسته شما را به ارث نمیبرد. مقایسه command -v openvpn با فایل unit این را در چند ثانیه روشن میکند.
مالک انتخابشده را در یادداشتهای دستگاه، کنار نام پروفایل بنویسید. نفر بعدی که تونل گمشدهای را عیبیابی کند از همان خط شروع میکند نه اینکه مقایسه را تکرار کند.