MTU برای هر مسیر در Linux: سه کنترل اندازه، یک مسیر
MTU رابط، MTU مسیر و محدودیت MSS در لایههای مختلف عمل میکنند. بودجهای به مسیری که در جستجو برنده میشود متصل کنید و تغییر را برگشتپذیر نگه دارید.
سه تنظیم روی یک کلاینت Linux همه شبیه «بستهها را کوچکتر کن» به نظر میرسند و در لایههای مختلف عمل میکنند. MTU رابط هر بستهای را که دستگاه میفرستد محدود میکند. MTU یک مسیر بستههای استفادهکننده از آن مسیر را محدود میکند و برای یک مقصد VPN غالباً همان چیزی است که واقعاً میخواهید. محدودیت TCP MSS آنچه دو سر مذاکره میکنند را تغییر میدهد و برای UDP هیچ کاری نمیکند.
سه کنترلی که شبیه یک دستگیره به نظر میرسند
پیش از انتخاب آنها را کنار هم بگذارید، چون انتخاب ردیف اشتباه بیشتر توصیههایی را توضیح میدهد که کار نمیکنند:
| Control | Scope | What it cannot fix |
|---|---|---|
| Interface MTU | Every packet the device sends | Nothing, but it over-constrains unrelated traffic |
| Route MTU | Packets using that route | A send that the lookup never routes there |
| MSS clamp | TCP handshake on that path | UDP payload sizes and ICMP |
کاهش MTU اترنت برای کل ماشین نسخهٔ خام این اصلاح است. کار میکند و به هر برنامهٔ دیگری روی میزبان هم آسیب میزند، از جمله آنهایی که مسیرهایشان درست بود. یک مقدار برای هر مسیر همان قصد را بدون هزینهٔ جانبی بیان میکند.
این مقایسه فقط برای ترافیکی معتبر است که خود میزبان تولید میکند. ارسال بسته برای کلاینت دیگر شامل مسیر خود آن کلاینت و بودجهٔ بیرونی تونل میشود و معیار مسیر روی این میزبان از آن مرز عبور نمیکند.
بودجه را به مسیری متصل کنید که در جستجو برنده میشود
یک رکورد نمونهٔ مسیر IPv4 چنین است:
ip -4 route get 10.60.0.20
ip -4 route add 10.60.0.0/16 dev tun-office src 10.90.0.2 mtu 1380
رکورد را توصیف قصد بخوانید، نه مقداری برای چسباندن. پیشوند، دستگاه و منبع ترجیحی باید با پیکربندی واقعی بخوانند و عدد باید از شواهد دربارهٔ مسیر کپسولهشده بیاید، نه از یک پست وبلاگ. MTU مسیر بستهٔ IP داخلی را محدود میکند که با بار TCP 1380 بایتی یا بستهٔ بیرونی رمزنگاریشدهٔ 1380 بایتی یکی نیست.
پیش از افزودن چیزی ببینید جستجو در واقع کجا حل میشود. میزبانی با قواعد سیاست میتواند مقصدی را از جدولی غیر از main، و معیاری که فقط در main وجود دارد برای آن درخواست نامرئی است. مقایسه کنید ip -4 route show table all را با پاسخ از ip route get، از جمله زمینهٔ علامت یا فضای نام وقتی قواعد از آنها استفاده میکنند. اگر این دو توافق نداشتند، جدولی که پاسخ داد همان است که به معیار نیاز دارد، نه آن که مرتبتر به نظر میرسد.
mtu همان mtu lock نیست
بهطور پیشفرض هسته هنوز میتواند MTU مسیر را از بازخورد ICMP بهروز کند، که کشف MTU مسیر برای همین است. افزودن lock آن را متوقف میکند. تصمیم دیگری است، نه راهی قویتر برای نگهداشتن همان عدد، و برای IPv4 رفتار مستند بیت «تکهتکه نکن» را تغییر میدهد.
قفل کردن زمانی معقول است که مسیر را اندازه گرفته باشید و بخواهید مقدار بدون توجه به آنچه میرسد ثابت بماند. وقتی شبکه بازخورد معتبر دربارهٔ اندازه میفرستد پیشفرض بدی است، چون هسته دیگر نمیتواند تنظیم کند و خطا به نشانهای دیگر منتقل میشود.
اگر ICMP جایی در مسیر فیلتر شود، هیچ تنظیم مسیری آن را درست نمیکند. اصلاح متعلق به فیلتر است و MTU کوچکتر یک راه دور زدن است که خطای واقعی را تا تغییر بعدی مسیر پنهان میکند.
نرمافزار تونل دستگیرههای اندازهٔ خودش را اضافه میکند
OpenVPN- mssfix اندازهٔ قطعه TCP را برای مورد مستند تونل UDP خود تنظیم میکند. روی گفتوگوی TCP کار میکند، پس املای دیگری از MTU مسیر سیستمعامل نیست و نمیتواند به سرویس UDP که مذاکره را نادیده میگیرد کمک کند.
MTU مسیر، تغییر MTU رابط و محدودیت MSS را در یک پنجرهٔ تغییر روی هم نگذارید. اگر مشکل ناپدید شد نمیدانید کدام مهم بود، و آنهایی که نگه میدارید سالها ترافیک را محدود میکنند بدون دلیلی که کسی به یاد بیاورد.
آن را برگشتپذیر کنید، سپس اثباتش کنید
مالک واقعی مسیر تصمیم میگیرد تغییر پس از اتصال دوباره میماند یا نه. کلاینت VPN که مسیر را پویا نصب میکند معمولاً آن را بدون معیار شما بازمیسازد و ip route add دستی بعد شبیه اصلاحی به نظر میرسد که یک روز بعد شکست خورد. مقدار را در پیکربندی مدیر بگذارید و اگر آزمایش موقتی میخواهید ابتدا مسیر اصلی را ثبت کنید.
با یک اتصال جدید که عملیاتی را که متوقف شده بود انجام میدهد آزمایش کنید، سپس تأیید کنید مسیر خصوصی موردنظر هنوز برنده است و مقصدهای نامرتبط تغییر نکردهاند. تونل را دوباره وصل کنید و مسیر را دوباره بخوانید، چون مقداری که در اتصال دوباره ناپدید میشود اصلاح نیست.
اگر شواهد از تغییر پشتیبانی نمیکند، بازنویسی را از طریق مدیرش بردارید و ویژگیهای اصلی مسیر را بازگردانید بهجای حذف مسیر. سپس بنویسید چه اندازه گرفتید و روی کدام مسیر، تا نفر بعدی بتواند بهبود واقعی را از آزمایشی که رها شده تشخیص دهد.