یک لحظه لپ‌تاپ روی Wi-Fi اداری است، لحظه بعد به تلفنی وصل می‌شود، و نشانگر تونل پیش از آنکه جابه‌جایی پنجره‌ها تمام شود دوباره سبز است. نور سبز فقط می‌گوید که تونل دوباره متصل شد؛ اینکه سیاست مسیریابی و مسدودسازی در فاصله میان این دو چه کرد پرسش دیگری است. آن سیاست مجموعه‌ای از شرط‌های تطبیق است که هنگام آخرین نصب کامپایل شده و رابطی، نشانی‌ای و خانواده نشانی‌ای را نام می‌برد که گذار همین حالا حذفشان کرده است. بنابراین همان جابه‌جایی سه نتیجه می‌دهد که یکسان به نظر می‌رسند: مسدودسازی ادامه می‌یابد، سیاست بازیابی خودش را مسدود می‌کند، یا مسیری باز می‌شود که هیچ چیز پوشش نمی‌دهد.

هیچ چیز روی صفحه این سه حالت را جدا نمی‌کند، پس به‌جای اینکه بپرسید نشانگر چه رنگی نشان می‌دهد، بپرسید قواعد به کدام شناسه‌ها سنجاق شده بودند. در Linux یک قاعده می‌تواند نام یک رابط یا یک ipset پر شده از آن را بیاورد؛ در Android می‌توان به یک VpnService گفت کدام شبکه‌های زیرین را از طریق setUnderlyingNetworks دنبال کند. هر اتصال به پیوندی اشاره می‌کند که در شرف جایگزینی است، و هر یک باید بعد از آن دوباره ارزیابی شود.

گذار در واقع چه چیزی را بازنویسی می‌کند

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

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

ساختن دوباره تونل بیرونی بدون سوراخ کردن

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

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

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

ip route get 1.1.1.1
ip -6 route get 2606:4700:4700::1111

وقتی پیوند جدید IPv6 می‌آورد و قواعد نمی‌آورند

شبکه‌های همراه و مهمان غالباً پیشوند IPv6 جهانی می‌دهند، حتی وقتی LAN سیمی دفتر هرگز چنین نکرده است. سیاستی که فقط به‌صورت قواعد IPv4 نوشته شده — شکل پیش‌فرض بیشتر دستورهای دست‌ساز iptables و nftables — هیچ‌کدام از این را پوشش نمی‌دهد. تونل متصل می‌ماند، برنامه‌هایی با دسترسی IPv6 بیرون از آن می‌روند، و نشانگر نمی‌تواند تفاوت را نشان دهد چون تونل واقعاً بالاست. حالت آینه‌ای هم به همان اندازه رایج است: مجموعه قواعدی فقط برای IPv6 روی شبکه‌ای که v6 عرضه نمی‌کند هیچ کاری نمی‌کند.

آنچه پیوند عرضه می‌کند را با آنچه سیاست ذکر می‌کند، در دو سوی گذار مقایسه کنید. این فرمان‌ها همان واقعیت‌هایی را چاپ می‌کنند که کلاینت با آن‌ها کار می‌کند:

ip -4 route show default
ip -6 route show default
sudo nft list ruleset | grep -c 'ip6 '

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

حل‌کننده در میانه نشست دست به دست می‌شود

در سامانه‌های امروزی حل‌کننده‌ها به پیوندها بسته‌اند، پس پیوند جدید با مجموعه‌ای تازه از حل‌کننده‌ها و شاید نمایی متفاوت از split-DNS می‌آید. systemd-resolved برای هر پیوند یک scope نگه می‌دارد و بر پایه مسیر میان آن‌ها انتخاب می‌کند، در حالی که macOS حل‌کننده‌های scoped را از انبار پویا می‌خواند و ترتیب رابط‌ها را رعایت می‌کند. کلاینتی که حل‌کننده خودش را نصب می‌کند با حل‌کننده پیوند رقابت می‌کند، و قواعد اولویتی که کسی نگاهشان نمی‌کند برنده را تعیین می‌کنند. آن‌گاه ممکن است حل نام بشکند در حالی که فیلتر بسته دقیقاً همان کاری را می‌کند که برایش نوشته شده بود.

حل‌کننده‌ای را که فعال است بخوانید، نه آن را که پیکربندی شده. روی میزبان systemd زیرفرمان status نشان می‌دهد هر scope از کدام پیوند آمده و آیا نامی از private-DNS برقرار است:

resolvectl status --no-pager
resolvectl query intranet.example.com

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

گذار را تمرین کنید و سابقه را نگه دارید

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

استثناها گذر خودشان را لازم دارند، چون عبوری که در شبکه قدیمی توجیه داشت در شبکه جدید خودبه‌خود توجیه ندارد. چاپگری، یک NAS یا یک درگاه اسیر در LAN خانه در شبکه همراه همتایی ندارد، و استثنایی که به آن‌ها می‌رسید قاعده‌ای بی‌همتا می‌شود.

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

مقالات مرتبط