OpenVPN روی PPPoE: link-mtu، tun-mtu یا mssfix را کاهش دهیم؟
پینگ کار میکند اما صفحههای بزرگ روی پیوند PPPoE یا DS-Lite متوقف میشوند. با اندازهگیری مسیر بین link-mtu، tun-mtu و mssfix تصمیم بگیرید، نه با حدس زدن.
پینگ پاسخ میدهد، DNS نامها را باز میکند، و هر صفحهای که به یک سگمنت با اندازه کامل نیاز دارد معلق میماند. روی پیوندی که کپسولهسازی خودش را اضافه میکند، مسیر بیصدا چند ده بایت از بودجه را از دست میدهد، و پروفایلی که برای اترنت پاک نوشته شده همچنان بستههایی میخواهد که خط نمیتواند حمل کند. اتصال کند نیست؛ دقیقاً همان بستههایی را دور میریزد که اهمیت دارند.
سه گزینه میتواند این را حل کند، و آنها در لایههای مختلف کار میکنند. انتخاب گزینه اشتباه یا هیچ کاری نمیکند یا تونل را به شکلی تازه شکننده میکند، بنابراین انتخاب با آنچه مسیر واقعاً پشتیبانی میکند آغاز میشود.
سه دکمه، سه لایه متفاوت
link-mtu بودجه بیرونی است: بار رمزنگاریشده بهعلاوه سرآیند OpenVPN، سرآیند UDP و سرآیند IP بیرونی. توصیف میکند چه چیزی از دستگاه خارج میشود، و به همین دلیل عددی است که مسیر فیزیکی محدود میکند.
tun-mtu بودجه درونی است: رابطی که ترافیک شما میبیند. دقیقاً به اندازه سرباری تونل از آنچه مسیر میتواند حمل کند بزرگتر است، و OpenVPN معمولاً آن را استخراج میکند نه اینکه شما را مجبور به تنظیمش کند.
mssfix سازوکاری کاملاً متفاوت است. حداکثر اندازه سگمنت را که در دستدادنهای TCP اعلام میشود بازنویسی میکند، تا همتایان TCP سگمنتهایی انتخاب کنند که پس از کپسولهسازی جا شوند. MTU رابط را تغییر نمیدهد و هیچ اثری بر UDP ندارد.
اگر link-mtu را صریحاً تنظیم کنید، OpenVPN سربار خودش را کم میکند تا MTU درونی را استخراج کند. آن سربار ثابت نیست؛ به رمز و احراز هویت بستگی دارد، و به همین دلیل مقداری که از یک انجمن کپی شده میتواند در پروفایل دیگری اشتباه باشد. تنظیم هر دو link-mtu و tun-mtu دو دستور متناقض به کلاینت میدهد.
پیش از انتخاب هر عددی مسیر را اندازه بگیرید
از رابط فیزیکی اندازه بگیرید، نه از داخل تونل، و به یاد داشته باشید که ping بار مفید را گزارش میکند، نه اندازه بسته را. پیش از مقایسه بار مفید با فریم 1500 بایتی، 28 بایت برای سرآیندهای IPv4 و ICMP اضافه کنید، و هر وقت همتایی عدد دیگری گزارش کرد این تصحیح را در ذهن داشته باشید.
روی کلاینت لینوکس، ping -M do -s 1472 قطعهبندی را ممنوع میکند و اگر بسته خیلی بزرگ باشد شکست میخورد. بار مفید را کم کنید تا عبور کند، سپس 28 اضافه کنید تا MTU مسیر به دست آید. PPPoE هزینه 8 بایت دارد، پس 1492 روی DSL طبیعی است. DS-Lite و برخی مسیرهای موبایل 40 یا بیشتر هزینه دارند، و پاسخ معمولاً کمتر از چیزی است که سرعت اسمی پیوند پیشنهاد میکند.
اگر هر اندازه پینگ موفق شود اما انتقالهای بزرگ همچنان متوقف شوند، به یک چاه سیاه شک کنید نه یک محدودیت ساده اندازه. پیام ICMP درباره نیاز به قطعهبندی جایی در مسیر فیلتر میشود، بنابراین فرستنده هرگز یاد نمیگیرد کوچک کند، و فقط جریانهایی که به سگمنت بزرگ نیاز دارند متوجه میشوند.
اول TCP را محدود کنید، بعد تونل را کوچک کنید
دستدادنهای TCP تنها چیزی است که mssfix به آن دست میزند، و همین معمولاً آن را کممخربترین کنترلی میکند که اول امتحان میکنید. آن را کمی پایینتر از بودجه واقعی مسیر تنظیم کنید، همان مقدار را از سرور بفرستید تا دو طرف توافق کنند، و دانلود بزرگی را دوباره آزمایش کنید. اگر توقف برطرف شد، مشکل اندازه سگمنت TCP بود و چیز دیگری نیازی به تغییر ندارد.
وقتی ترافیک تحت تأثیر TCP نیست، MTU درونی را کاهش دهید. یک سرویس UDP، یک تونل درون تونل، یا برنامهای که دیتاگرامهای اندازه کامل میفرستد پس از محدودسازی MSS همچنان شکست میخورد، چون چیزی اندازه بستهاش را بازنویسی نمیکند. برای آن حالت tun-mtu را کاهش دهید، یا link-mtu را تنظیم کنید و بگذارید کلاینت مقدار درونی را استخراج کند، اما هرگز هر دو را.
به گزینه قدیمی قطعهبندی دست نزنید. بستهها را داخل تونل تقسیم میکرد، سربار میافزود، و به دلایل خوبی منسوخ شده است؛ OpenVPN مدرن انتظار دارد مسیر بهطور دقیق توصیف شود.
چرا کاوشهای کوچک همچنان کار میکنند
پرسوجوهای DNS، پژواکهای ICMP و دستدادنهای TCP همه بسیار پایینتر از اندازهای هستند که شکست میخورد. بنابراین تونل در هر آزمون سریع سالم به نظر میرسد، در حالی که دستدادنهای TLS و پاسخهای HTTP بیصدا شکست میخورند. همین ترکیب، یعنی tracerouteای که کار میکند و مرورگری که در نخستین پاسخ بزرگ متوقف میشود، نشانهای است که باید دنبالش بگردید. پیش از برداشتن پروفایل تازه، یک کاوش اندازه کامل بردارید.
با همان ترافیکی که شکست خورد تأیید کنید. صفحه بزرگی را بار کنید، اگر سرویس تحت تأثیر است یک دیتاگرام UDP اندازه کامل بفرستید، و از کلاینت دومی روی پیوند دیگر تکرار کنید. MTU اندازهگیریشده مسیر و مقداری را که انتخاب کردید ثبت کنید، چون در غیر این صورت نفر بعدی که پروفایل را لمس میکند آن عدد را دلبخواه میپندارد.
هرگز MTU درونی را وقتی IPv6 روی تونل اجرا میشود زیر 1280 نبرید، چون این کمینهای است که هر پیوند IPv6 باید حمل کند. MTU کوچکتر واقعیتی درباره مسیر است، نه تنظیم کارایی که با حس و حال کوک شود.