Pi به عنوان کلاینت VPN: یک مدیر یا یک اسکریپت سفارشی؟
مقایسه یک پروفایل NetworkManager با یک اسکریپت کلاینت دستنویس روی Raspberry Pi، شامل تونل کامل، DNS، IPv6 و رفتار هنگام افتادن تونل.
یک Raspberry Pi که فقط باید ترافیک خروجی خودش را محافظت کند دو طراحی واقعبینانه دارد: بگذارید مدیر شبکه مالک تونل باشد، یا اسکریپتی نگه دارید که مالک آن است. هر دو میتوانند ترافیک را حمل کنند. آنها در جاهای متفاوتی شکست میخورند، و خرابیای که میتوانید ساعت دو بامداد از راه دور تشخیص دهید همانی است که ارزش انتخاب دارد. آنها را از نظر مالکیت، از نظر معنای تونل کامل وقتی IPv6 و DNS وارد میشوند، و از نظر آنچه در لحظه افتادن تونل رخ میدهد مقایسه کنید.
دو مالک برای یک تونل
طراحی A یک پروفایل درون مدیر شبکه سیستم است: یک پروفایل OpenVPN واردشده یا یک اتصال بومی WireGuard که هنگام بوت توسط همان سرویسی که Ethernet و Wi-Fi را بالا میآورد فعال میشود. طراحی B یک واحد از خودتان است که کلاینت را مستقیم اجرا میکند، پیکربندی resolver را ویرایش میکند و مسیرها و قواعد فایروال خودش را نصب میکند. هر دو طراحی مشروعی هستند؛ تفاوتشان در این است که چه کسی اجازه تغییر جدول مسیریابی را دارد.
خرابیها متفاوتاند چون مالکان متفاوتاند. در A، پروفایلی که فعال نمیشود رابط را بالا و تونل را پایین میگذارد، و گزارشهای مدیر دلیل را میگویند. در B، اسکریپتی که نیمهموفق میشود مسیرهایی به جا میگذارد که از فرایند سازندهشان جان سالم به در میبرند. اجرای هر دو بدترین نتیجه است: دو فرایند مسیر پیشفرض را مینویسند، دو ویرایش resolver هنگام بوت با هم مسابقه میدهند، و دو مجموعه راز باید چرخانده شود.
برای هر تونل یک مالک انتخاب کنید و پیش از آزمودن هر چیز دیگری، دیگری را غیرفعال کنید. دو مالک یعنی دو جا برای نگاه کردن وقتی تونل بالاست و هیچ چیز حل نمیشود. همین یک قاعده بیشتر حالتهای گیجکننده توصیفشده در بحثهای Pi VPN را جلوگیری میکند.
واردکردن چه میسازد و چه نمیسازد
در Raspberry Pi OS Bookworm و بعد از آن، ابزار پیشفرض پیکربندی شبکه NetworkManager است، پس پروفایل خانه طبیعی یک تونل کلاینت است. واردکردن به افزونه متناظر نصبشده نیاز دارد؛ بدون آن واردکردن با پیامی درباره نوع اتصال پشتیبانینشده شکست میخورد، که همان سیگنال صادقانه برای توقف و نصب افزونه است.
nmcli connection import type openvpn file ./provider.ovpn
nmcli connection show
nmcli --ask connection up id provider-name
واردکردن یک پروفایل ذخیره میکند. این ثابت نمیکند که طرف مقابل قابل دسترسی است، و تضمین نمیکند که هر دستورالعمل در فایل از تبدیل جان سالم به در برده باشد. اتصال حاصل را دوباره بخوانید و بخشهایی را که هویت و اعتماد را حمل میکنند بررسی کنید: گواهی، میزبان و درگاه دور، و اینکه آیا گذرواژه پرسیده میشود یا ذخیره میشود.
فعالسازی با --ask عبارت عبور را در ماشین مشترک بیرون از تاریخچه پوسته نگه میدارد. برای Pi بدون نظارت، در نهایت میخواهید پروفایل هنگام بوت بالا بیاید، که تصمیمی جدا از بالا آوردن یکباره با دست است.
تونل کامل، در مقایسه هر دو طراحی
تونل کامل ادعایی درباره مسیرهاست، نه درباره نیت، و دو طراحی آن را متفاوت بیان میکنند. رویکرد پروفایل از مدیر میخواهد مسیر پیشفرض و تنظیمات resolver خود را نصب کند؛ رویکرد اسکریپت هرچه اسکریپت بگوید انجام میدهد، از جمله هیچ. هیچکدام IPv6 را پوشش نمیدهند مگر به آنها گفته شود، و مسیر پیشفرض IPv6 دستنخورده با خوشحالی ترافیک را بیرون از تونل حمل میکند درحالیکه IPv4 بینقص به نظر میرسد.
ip -4 route get 198.51.100.23
ip -6 route show default
resolvectl query example.org
برای جستوجوی مسیر از یک نشانی مستندات استفاده کنید و میزبانی را جایگزین کنید که اجازه بررسی آن را دارید. فرمان اول نشان میدهد Pi برای یک مقصد معمولی از کدام رابط استفاده میکرد؛ دومی نشان میدهد آیا مسیر پیشفرض IPv6 هنوز وجود دارد؛ سومی ثابت میکند کدام resolver پاسخ داده است. پیش از باور هر ادعایی درباره تونل کامل، هر سه را بخوانید.
اگر دستورالعملهای ارائهدهنده تونل کامل را وعده میدهد اما مسیر پیشفرض IPv6 باقی میماند، Pi نشتی دارد. IPv6 را روی پیوند بالادست غیرفعال کنید یا از پروفایل بخواهید آن را مطالبه کند، و آگاهانه تصمیم بگیرید بهجای اینکه بعداً کشفش کنید.
شکست باز در برابر شکست بسته
وقتی تونل میافتد، جدول مسیریابی که مسیر پیشفرضش را از دست میدهد بهسادگی به پیوند فیزیکی بالادست بازمیگردد و ترافیک آشکارا ادامه مییابد. این شکست باز است و رفتار پیشفرض هر دو طراحی است مگر اینکه چیزی مانع شود. بیشتر مردم هفتهها بعد با خواندن گزارش فایروال آن را کشف میکنند.
شکست بسته وقتی تونل پایین است دسترسی راه دور را از شما میگیرد، پس به یک استثنای آگاهانه برای مسیر مدیریت نیاز دارد. یک راه قاعدهای است که فقط نشانی همتای VPN را بیرون از تونل اجازه میدهد:
sudo nft add table inet vpnkill
sudo nft 'add chain inet vpnkill out { type filter hook output priority 0; policy accept; }'
sudo nft add rule inet vpnkill out oifname != "tun0" ip daddr != 203.0.113.24 reject
هزینه عملیاتی را صادقانه مقایسه کنید. پروفایل معمولاً نمیتواند این قاعده را بیان کند، پس شکست بسته شما را به سمت طراحی اسکریپت یا به سمت واحدی کوچک میراند که قاعده را مستقل از تونل نصب میکند. در هر حال، ردها را یک هفته ثبت کنید: رد خاموش دقیقاً مثل سرویس خراب به نظر میرسد، و وقتی کاربری گزارش دهد که یک سایت از بارگذاری بازمانده به شمارنده نیاز خواهید داشت.
انتخاب برای Pi بدون نمایشگر
اگر تصویر از قبل NetworkManager را اجرا میکند، تونل چیز عجیبی نمیخواهد، و میخواهید خودکار از پیوند بالادست پیروی کند، پروفایل را بگیرید. اگر به مسیریابی سیاستی، چند تونل انتخابشده برای هر مقصد، یا قاعده شکست بستهای نیاز دارید که باید پیش از بالا آمدن تونل وجود داشته باشد، اسکریپت را بگیرید و مالک هر بخش آن باشید، شامل ترتیب بوت و پاکسازی. مخلوط کردن دو طراحی بیش از هر یک بهتنهایی هزینه دارد.
مهاجرت میان آنها بیشتر مسئله ترتیب است: مالک قدیمی را غیرفعال کنید، تأیید کنید که هیچ مسیر یا ورودی resolver کهنهای باقی نمانده، سپس مالک جدید را فعال کنید و دو بار راهاندازی مجدد کنید. یک راهاندازی مجدد میتواند مسابقهای را پنهان کند که دومی آشکار میکند. با آزمودن Pi و نه تونل تمام کنید: یک نام را حل کنید، چیزی را از طریق IPv4 بگیرید، اگر نگه داشتید از طریق IPv6 بگیرید، سپس تونل را بیندازید و تأیید کنید که رفتاری که انتخاب کردید واقعاً رخ میدهد. یک رابط در ip link آغاز آزمون است، نه پایان آن.