یک نشانی سرویس روی هر گره OpenVPN: چه کاری انجام نمیدهد
روی هر گره یک /32 خصوصی رزرو کنید تا کلاینت به همان سروری برسد که انتخاب کرده است. نشانی نه انتقال در برابر خرابی انجام میدهد، نه نشستها را جابهجا میکند و نه گره سالمی را برمیگزیند.
یک کلاینت به یکی از چندین سرور OpenVPN وصل میشود و سپس به سرویس کوچکی نیاز دارد که روی همان گره اجرا شود: یک صفحه وضعیت، یک نقطه پایانی سنجهها، یک عامل پشتیبانگیری. دادن همان نشانی خصوصی سرویس به هر گره، پیکربندی کلاینت را مستقل از اینکه روی کدام سرور فرود آمده یکسان میکند. این راحتی واقعی است و بهآسانی هم میتوان آن را بیش از اندازه تفسیر کرد: نشانی مشترک میگوید به کدام گره رسیدهاید، نه اینکه چیزی افزونه است.
چرا همان نشانی روی هر گره کار میکند
هر گره نشانی را بهصورت محلی در اختیار دارد و بهجای آن پاسخ میدهد، پس کلاینتی که از طریق تونل کنونیاش به آن میرسد، سرویس را در انتهای همان تونل میگیرد. هیچ چیز میان گرهها هماهنگ نمیشود و هیچ ترافیکی از یک گره به گره دیگر عبور نمیکند.
نشانی یک برچسب محلی است، تکرارشده و نه تکثیرشده. هر گره فقط بهجای خودش پاسخ میدهد و هیچکدام ترافیک نشانی را بهجای گره دیگر هدایت نمیکند. همین است که یک پیکربندی کلاینت را معتبر نگه میدارد در حالی که سرورها مستقل میمانند. همچنین دلیل آن است که طراحی به هیچ هماهنگی میان گرهها نیاز ندارد.
به همین دلیل همان پیکربندی روی هر سرور بدون پروتکل مسیریابی میان آنها کار میکند. همچنین دلیل آن است که طراحی درباره سلامت چیزی نمیگوید: نشانی روی گره ناسالم دقیقاً همانطور وجود دارد که روی گره سالم، چون به میزبان گره خورده است نه به سودمند بودن سرویس.
آن را به loopback اختصاص دهید، نه به تونل
قرار دادن نشانی روی یک رابط loopback آن را از عمر هر دستگاه تونل جدا میکند، پس یک اتصال دوباره یا بارگذاری مجدد پیکربندی آن را حذف نمیکند. نشانی تا زمانی که میزبان وجود دارد وجود دارد.
نشانی روی lo یک فیلتر نیست. سرویس هنوز باید روی آن گوش دهد، و فایروال میزبان هنوز مسیر واقعی ورودی را ارزیابی میکند، که از رابط تونل میرسد. هر کس گمان کند loopback یعنی فقط محلی، در نهایت یا کلاینتهای مشروع را مسدود میکند یا چیزی را افشا میکند که قصدش را نداشت.
تخصیص را از طریق پیکربندی شبکه میزبان پایدار کنید، نه با افزودن دوباره آن از یک hook. یک hook نصب روی گرهای که هیچ تونلی در آن بالا نیامده اجرا نمیشود، و نشانی سرویس نباید به فعالیت تونل وابسته باشد. نشانی را در پیکربندی رابطی که توزیع شما مالک آن است بگذارید، سپس یک بار راهاندازی مجدد کنید و آن را بررسی کنید. راهاندازی مجدد تنها آزمونی است که از یک تغییر پیکربندی بعدی جان سالم به در میبرد.
ip address show dev lo | grep 10.250.0.1
ip address add 10.250.0.1/32 dev loیک مسیر را هل بدهید و یک مقصد را قصد کنید
کلاینت برای نشانی به یک مسیر میزبان نیاز دارد که سروری که به آن وصل میشود آن را عرضه میکند. چون هر سرور همان مقصد را عرضه میکند، پروفایل وقتی کلاینت جابهجا میشود تغییر نمیکند.
پیش از سرزنش سرویس، بررسی کنید کلاینت چه چیزی نصب کرده است.
ip route get 10.250.0.1برای یک سرویس HTTP، به نشانی یک نام و برای آن نام یک گواهی بدهید. IP مشترک یک هویت نیست، و تأیید TLS را حذف نمیکند، و توجیهکننده کپی یک کلید خصوصی روی هر گره هم نیست. نامی که به نشانی مشترک تفکیک میشود داستان گواهی را عادی نگه میدارد و میگذارد در صورت نیاز هویت هر گره را نگه دارید.
آنچه نشانی مشترک نمیتواند انجام دهد
انتقال در برابر خرابی فراهم نمیکند. اگر گره انتخابشده از کار بیفتد، نشانی هم با آن از کار میافتد و کلاینت باید جای دیگری دوباره وصل شود.
یک نشست زنده TCP را منتقل نمیکند، چون اتصال تازه در میزبان دیگری پایان مییابد که از میزبان قدیمی خبری ندارد.
گره سالم انتخاب نمیکند، بار را متعادل نمیکند و دادهها را میان گرهها همگام نمیکند. هر یک از اینها سازوکاری جدا با حالتهای خرابی خودش است، و وانمود کردن به اینکه ترفند نشانیابی آنها را پوشش میدهد همان چیزی است که یک طراحی ساده را به شهرتی ناشایست در تابآوری میرساند. اگر دو تونل همزمان فعال باشند، معنای مقصد مبهم میشود، پس فرض یک تونل فعال را آشکارا نگه دارید.
هویت سرویس را با نام نگه دارید
بنویسید نشانی چه معنایی دارد: به سرویس روی گرهای میرسد که کلاینت اکنون به آن وصل است. همین یک جمله بیشتر سوءتفاهمی را که این الگو به خود جلب میکند جلوگیری میکند.
سپس اجزا را با هم مستند کنید: نشانی، رابطی که روی آن زندگی میکند، مسیری که سرور هل میدهد، و نام و گواهیای که سرویس ارائه میدهد. چهار واقعیت کوچک که خواننده آینده میتواند بررسی کند، به همان ترتیبی که آنها را بررسی خواهد کرد.
اگر نیاز، مقصدی پایدار برای سرویسی محلی روی گره است، این الگو مناسب است و تقریباً هیچ هزینهای ندارد.
اگر نیاز، دسترسپذیری است، یک لایه بالاتر بروید: یک متعادلکننده بار، یک نام سرویس با بررسیهای سلامت، یا یک سامانه هماهنگسازی که از پیش میداند چگونه گرهای را جایگزین کند.
تصمیم زودهنگام همین، نشانی مشترک را همان چیزی نگه میدارد که هست، یک برچسب راحت، نه جزئی که بیصدا انتظار میرود کاری را انجام دهد که هرگز برای آن طراحی نشده بود.