رد کردن VPN خانه با systemd ExecCondition
رد کردن عمدی و فرمان آمادهسازی معیوب دو نتیجه متفاوتاند. کدهای خروج راهنما را تعریف کنید، سپس جابهجایی میان شبکهها را آزمایش کنید.
VPN شبکه خانگی کاری ندارد وقتی لپتاپ از قبل روی همان شبکه نشسته است. میانبر فریبنده فرمان آمادهسازیای است که با کد غیرصفر خارج میشود؛ این کار واحد را شکست میدهد و هر پیشخوان را خراب نشان میدهد. systemd برای دقیقاً همین شکل تصمیم دستوری دارد و رد کردن عمدی را از خطای واقعی جدا میکند. درست انجام دادنش بیشتر به نوشتن این موضوع مربوط است که هر کد خروج چه معنایی دارد.
چرا پیششرط شکستخورده شکل اشتباه است
ExecStartPre خروج غیرصفر را شکست در راهاندازی میداند، که برای فرمانی که سرویس را آماده میکند درست است. استفاده از آن بهعنوان شرط، تصمیم سیاستی را از وابستگی خراب جدانشدنی میکند. ExecCondition وجود دارد تا یک واحد بتواند بدون آنکه شکستخورده علامت بخورد از راهاندازی امتناع کند.
این تمایز ساعت سه بامداد اهمیت دارد، وقتی هیچکس نمیخواهد واحدی قرمز را که مطابق طراحی رفتار میکرد بررسی کند. واحد شکستخورده خطاهای واقعی را هم میان خطاهای عمدی پنهان میکند.
اول قرارداد کدهای خروج را بنویسید
قرارداد را پیش از اسکریپت بنویسید. خروج صفر یعنی ادامه، خروج یک یعنی رد کردن فرمانهای راهاندازی باقیمانده، و خروج 255 یعنی خود شرط نتوانسته اجرا شود. کدهای میان دو و 254 هم معمولاً به معنای رد کردن هستند، که وقتی راهنما کد خطای تصادفی برمیگرداند فراموش کردنش آسان است. فایل drop-in زیر راهنما را به نام واقعی واحد متصل میکند.
[Service]
ExecCondition=/usr/local/libexec/should-start-home-vpnپیش از فرض کردن معنای پیشفرض، واحد مؤثر را از نظر تنظیمات بهارثرسیده SuccessExitStatus یا stop-post بررسی کنید. سپس هر سه نتیجه را عمداً آزمایش کنید.
نشانه شبکه اثبات مکان نیست
نشانی قابلدسترسی روتر یا یک MAC شناختهشده میتواند شبکه درست را نشان دهد، و هیچکدام آن را اثبات نمیکند. شبکهای دیگر میتواند همان نشانی را بازاستفاده کند، داده ARP میتواند کهنه باشد، و شناسهها را میتوان جعل کرد. کاوش را بهعنوان بهینهسازیای سازگار با سیاست ببینید، نه بهعنوان نتیجه احراز هویت.
از پیش تصمیم بگیرید عدمقطعیت چه معنایی دارد. راهاندازی VPN هنگام تردید برای کلاینتی که صرفاً نمیتوانست متصل شود ایمن است؛ رد کردن آن هنگام تردید ایمن نیست. کاوش را محدود کنید و بهجای فرض کردن نخستین رابط فهرست، رابط فعال را بخوانید. کاوشی که معلق میماند از کاوشی که «نه» پاسخ میدهد بدتر است، چون واحد منتظر آن میماند.
آن مفروضات را کنار فایل واحد ثبت کنید تا نفر بعدی بداند راهنما چه باوری دارد. توضیحی در بالای اسکریپت ارزانترین جای نگهداشتن آنهاست.
جابهجایی میان شبکهها را مدیریت کنید
شرط هنگام راهاندازی سرویس اجرا میشود و بعداً دوباره ارزیابی نمیشود. واحد ردشده پس از رفتن لپتاپ به کافه همچنان ردشده میماند، و تونل در حال اجرا پس از بازگشت لپتاپ به خانه برپا میماند. چرخه عمر تغییر شبکه را با مکانیزمی جداگانه به تصمیم شروع و توقف پیوند دهید.
systemctl cat home-vpn.serviceچهار حالت را آزمایش کنید: راهاندازی در خانه، راهاندازی بیرون، کاوشی که نمیتواند اجرا شود، و جابهجایی میان شبکهها در حالی که واحد فعال است. دلیل رد کردن را در ژورنال قابل مشاهده نگه دارید تا تصمیم عمدی هرگز مانند شکست احراز هویت به نظر نرسد. مرجع سرویس معنای خروج و کمترین نسخه را مستند میکند.