رسیدن به یک پیشوند خصوصی از طریق VPN الزامی است که مدت دارد: تا زمانی که آن اتصال قابل استفاده است برقرار می‌ماند و با پایان اتصال پایان می‌یابد. اسکریپت ورود نمی‌تواند این را بیان کند، زیرا ورود و بالا آمدن تونل دو لحظهٔ متفاوت‌اند و تونلی که هنگام ورود وجود دارد ممکن است همانی نباشد که یک دقیقه بعد ترافیک را حمل می‌کند. تصمیم نخست این نیست که کدام فرمان اجرا شود. این است که کدام مؤلفه مالک پیشوند است.

پیشوند به یک مالک نیاز دارد، نه به یک لحظه

با نوشتن الزام به‌صورت جمله‌ای با نهاد شروع کنید: برسید 10.77.0.0/24 از طریق VPN دفتر در حالی که آن اتصال برقرار است. آن جمله پیشوند، اتصال و شرط را نام می‌برد و بی‌درنگ دو جایگزین رایج را رد می‌کند: قلاب ورود و نام یک رابط مانند ppp0 یا utun2.

نام‌های رابط در زمان اجرا تعیین می‌شوند و میان اتصال‌های دوباره پایدار نیستند. قلابی که با نامی که هفتهٔ گذشته دیده مطابقت کند یا شلیک نمی‌کند یا به رابط کس دیگری شلیک می‌کند. هر دو نتیجه به‌صورت یک باگ مسیریابی ظاهر می‌شوند، نه به‌صورت فرض کهنه‌ای که هستند. همین ایراد بر هر اسکریپتی وارد است که به نامی گره خورده که تنها تا زمانی که یک تونل مشخص برقرار است وجود دارد.

از منبع پشتیبانی‌شدهٔ قصد مسیر استفاده کنید

دروازه، یک پروفایل مدیریت‌شده یا سازوکار مسیر مستندِ کلاینت مالک، جای درست این کار است، هرگاه آن سازوکار بتواند الزام را بیان کند. اینکه کدام اعمال می‌شود به پروتکل و ارائه‌دهنده بستگی دارد و کلیدها میان آن‌ها جابه‌جا نمی‌شوند، پس مقداری که یک پروفایل OpenVPN را پیکربندی می‌کند چیزی دربارهٔ کلاینت بومی L2TP یا IKEv2 به شما نمی‌گوید.

MechanismCan carry extra prefixesWho owns the lifetime
Gateway-pushed routesOften, if the gateway is configured for itThe connection
Managed profile settingsDepends on the client and profile formatThe profile
Provider tunnel settingsYes, as included and excluded routesThe provider process
Manual commandYes, onceNobody

برای توسعه‌دهندگان تونل بسته، تنظیمات تونل IPv4 اپل مسیرهای شامل و خارج‌شده را به‌صراحت آشکار می‌کند و IPv6 هم همتای خود را دارد. این‌ها APIهایی هستند که ارائه‌دهنده به کار می‌برد، نه دلیلی بر اینکه هر پنل VPN بومی فهرست مسیر دلخواه را به مدیر ارائه می‌دهد. اگر ترکیب کنونی نمی‌تواند پیشوندهای مورد نیاز شما را بیان کند، گام بعدی مسیر پیکربندی پشتیبانی‌شده از سوی اپراتور است، نه برنامهٔ دیگری که به امید رفتار بهتر نصب شود.

عمر مفید شامل پاک‌سازی است

گاهی یک کمک‌کنندهٔ بیرونی واقعاً لازم است و در آن صورت «مسیر را اضافه کن» کوچک‌ترین بخش کار آن است. باید بداند به کدام اتصال خدمت می‌کند و آن اتصال از کدام رابط استفاده می‌کند، صبر کند تا وضعیت شبکهٔ مربوطه آرام بگیرد، در دو اجرای پیاپی خودتوان (idempotent) بماند، و چیزی را که خودش نصب نکرده پاک نکند.

آخرین بند همان است که درد دارد. کمک‌کننده‌ای که هر مسیر منطبق با پیشوند دفتر را حذف می‌کند، دیر یا زود مسیری را حذف خواهد کرد که خودش اضافه نکرده است. قطعی حاصل به گردن کلاینت VPN می‌افتد، چون کلاینت همان بخشی است که کاربر می‌بیند. تصمیم‌گیری دربارهٔ اینکه کمک‌کننده مالک چه چیزی است پیش از نوشتن آن، ارزان‌تر از توضیح بعدی است که چرا یک زیرشبکهٔ محلی از پاسخ دادن بازماند.

مسابقهٔ اتصال دوباره

یک اتصال دوبارهٔ سریع را در نظر بگیرید. نشست A قطع می‌شود، نشست B بالا می‌آید و مسیرش را نصب می‌کند، و آنگاه پاک‌سازی به‌تأخیرافتادهٔ A سرانجام اجرا می‌شود. اگر آن پاک‌سازی مسیرها را بر اساس پیشوند بردارد، وضعیت معتبر B را هم با خود می‌برد و اتصالی که یک ثانیه پیش کار می‌کرد اکنون به هیچ‌جا مسیریابی می‌شود.

این یک مسابقهٔ مالکیت است و افزودن خواب به اسکریپت تنها تغییر می‌دهد که کدام طرف آن را ببرد. راه‌حل این است که پاک‌سازی را مشروط به هویت کنیم: رابط و نشستی را که کمک‌کننده نصب کرده با موارد هنوز جاری مقایسه کنید و فقط هنگام تطابق حذف کنید.

چه چیزی را آزمایش کنید و یک مسیر چه کاری نمی‌تواند بکند

پذیرش باید چهار گذار را پوشش دهد: نخستین اتصال، اتصال دوباره به رابطی متفاوت، تلاش اتصالی که شکست می‌خورد، و قطع نهایی. پس از هر یک، مسیری را بخوانید که سامانه واقعاً برای نشانی‌ای در سمت دور انتخاب کرده، نه مسیری که انتظار داشتید.

route -n get 10.77.0.5
netstat -rn -f inet

موارد دشوار را در همان دور بگنجانید: IPv6 در جایی که لازم است، پیشوندی محلی که با پیشوند دور هم‌پوشانی دارد، و مسیر به خود نقطهٔ پایانی عمومی VPN که باید تا زمانی که تونل برقرار است کار کند. سپس بنویسید یک مسیر چه چیزی نیست. بسته‌ها را انتخاب می‌کند؛ در سمت دور اجازه نمی‌دهد و مسیر بازگشت نمی‌سازد، و این‌ها الزاماتی جدا با مالکان جدا باقی می‌مانند.

نتیجه‌ای که می‌خواهید پیشوندی است که در هر گذار از مالک اتصال پشتیبانی‌شده‌اش پیروی می‌کند، نه فرمانی که تصادفاً یک بار روی ماشینی که در آن نوشته شد موفق شد.

مقالات مرتبط