נשיאת מקטע פנימי קבוע בגודל 1,500 בתים דרך VPN
מקטע פנימי קבוע בגודל 1,500 בתים לא ייכנס בנתיב חיצוני בגודל 1,500 בתים. מדוד את התקורה, ואז בחר MTU תחתון גדול יותר או פיצול נתמך.
יש לך דרישה שאינה מתכופפת: הצד המרוחק חייב לקבל את אותו מקטע IP בגודל 1,500 בתים שהשולח פולט, כולל הכותרות. מנהרה אינה יכולה לעטוף את המקטע הזה יחד עם המסגור שלה בתוך מקטע IP שני בגודל 1,500 בתים, ולכן משהו בתכנון חייב לוותר. הסדר שלמטה הוא זה שאני משתמש בו בחלון שינויים: לכתוב את תקציב הבתים, להוכיח מה השכבה התחתונה באמת יכולה לשאת, אחר כך לבחור בדיוק מנגנון העברה אחד ולאשר את המקטע הפנימי בצד המרוחק.
כתוב את תקציב הבתים לפני עריכת פרופיל
אנקפסולציה מוסיפה בתים בכמה שכבות, והסכום הוא תכונה של הפרופיל שלך ולא קבוע שאפשר לחפש. משפחת הכתובות, בחירת הצופן, פרוטוקול התעבורה וכל אפשרות דחיסה או מסגור מזיזים את המספר, ולכן חיסור שהועתק מפריסה אחרת חסר ערך כתקציב. התחל מהדרישה הפנימית, הוסף את התקורה הנמדדת לכל מקטע של התצורה שלך, וכתוב את הגודל החיצוני המתקבל בכרטיס השינוי לפני שמישהו עורך קובץ.
שני מספרים מחליטים את התכנון: המקטע החיצוני הגדול ביותר שהנתיב נושא בלי פיצול, והבתים הנוספים שהאנקפסולציה שלך צריכה. כשהראשון קטן מהשני ועוד 1,500, אחד מהם חייב להשתנות. הבחירה היא אז צרה ולא יצירתית, ולכן אני רושם את שני המספרים לפני שדנים באפשרויות. שום דבר בשכבת המנהרה לא דוחס את הבתים האלה, ושום מספר MTU יחיד לא מסיר את הדרישה שניתנה לך.
בדוק את השכבה התחתונה בפינג עם איסור פיצול
מדוד את הנתיב במקום לסמוך על ה-MTU של הממשק, כי החוליה הקטנה ביותר בנתיב החיצוני היא זו שקובעת. ב-Linux -M do מגדיר את סיבית איסור הפיצול ו- -s לוקח את מטען ה-ICMP, ולכן מסגרת בגודל 1,500 בתים עונה ב-1,472 בתים של מטען לאחר שמורידים את כותרת ה-IP בגודל 20 בתים ואת כותרת ה-ICMP בגודל 8 בתים. העלה את המטען עד שהבדיקה נכשלת, ואז דלג לגודל ג'מבו כדי לראות אם הנתיב נושא אותו בכלל.
ping -M do -s 1472 -c 2 198.51.100.10 ping -M do -s 8972 -c 2 198.51.100.10 tracepath -n 198.51.100.10
נתיב שעובר 1,472 ונכשל ב-8,972 אינו יכול לשאת מקטע פנימי בגודל 1,500 בתים ועוד תקורה במקטע חיצוני אחד. זו התשובה שהיית צריך לפני פתיחת תצורת ה-VPN. היא גם קובעת איזה משני הסעיפים הבאים חל עליך, אז שמור את שתי תוצאות הבדיקה ליד הכרטיס. ניחוש כאן עולה חלון תחזוקה, כי מנהרה שמדווחת שהיא פעילה לא אומרת דבר על המקטע הגדול ביותר שהנתיב יקבל.
העלה את MTU הנתיב רק היכן שכל קפיצה מסכימה
מסגרות ג'מבו הן תכונה מקצה לקצה, לא הגדרה שמפעילים בשני הקצוות שאתה שולט בהם. כל מתג, נתב ומסירת ספק בנתיב החיצוני חייבים להסכים לגודל הגדול יותר, וקפיצה אחת בגודל 1,500 בתים תזרוק בשקט את המקטע שזה עתה הגדלת. העלאת הממשק המקומי בלבד היא השינוי החצי הקלאסי שגורם למנהרה להיראות שבורה בזמן שהשכבה התחתונה מפילה בשקט.
ip link set dev eth1 mtu 9000 ip link show dev eth1 ping -M do -s 8972 -c 2 198.51.100.10
שנה את הממשק, ואז בדוק שוב את אותו נתיב לפני שתשנה משהו אחר. אם הבדיקה עדיין נכשלת, החזר עם ip link set dev eth1 mtu 1500 ועבור לפיצול במקום להתווכח עם ספק על חוליה שאינה שלך.
השתמש בפיצול מנהרה כשהשכבה התחתונה לא יכולה לגדול
מנגנון פיצול נתמך מתחת למקטע הפנימי מאפשר לכמה מקטעים חיצוניים לשאת מקטע פנימי אחד, וקצה המנהרה המרוחק מרכיב אותם מחדש לפני שהוא מוסר את המקורי למערכת. אפשרות פיצול ה-UDP של Community OpenVPN היא מימוש אחד של הרעיון הזה, והיא אינה אותו דבר כמו פיצול IP רגיל של המקטע החיצוני. שני הצדדים חייבים להריץ גרסה שתומכת בתבנית, ונתיב הנתונים חייב להיות זה שאתה חושב: ללקוחות OpenVPN 3 ולערוצי נתונים מואצים בגרעין יש מגבלות שונות, ולכן פרופיל שעובד בלקוח אחד יכול להיכשל באחר.
openvpn --config client.ovpn --tun-mtu 1500 --fragment 1400 --verb 4
פיצול חיצוני רגיל הוא האפשרות השנייה, והיא החלשה יותר. נתבי IPv6 אינם מפצלים כלל מקטע מועבר, ולכן מקטע חיצוני גדול מדי פשוט מת והשולח לומד על כך רק אם הודעת ה-ICMPv6 הרלוונטית שורדת את הנתיב. פיצולים גם מזמינים סינון והגברת אובדן, ולכן אני מתייחס לזה כאל גיבוי ולא כתוכנית.
נשא חיצוני מבוסס זרם עוקף את שאלת הגודל על ידי פילוח זרם הבתים שלו, והמקטע הפנימי שנבנה מחדש יכול עדיין להיות 1,500 בתים. זו החלטת תעבורה עם עלות משלה, כולל ההתנהגות הידועה של TCP בתוך TCP, אז קבל אותה בכוונה ולא כתופעת לוואי של ויכוח MTU.
אשר שהמקטע הפנימי מגיע ללא שינוי
אימות אינו לחיצת יד מוצלחת. לכוד בממשק המנהרה בשני הקצוות והשווה את הגודל והתוכן של המקטע שהאפליקציה באמת שלחה לזה שהצד המרוחק קיבל.
ip link show dev tun0 ping -M do -s 1472 -c 2 10.8.0.1 tcpdump -ni tun0 -c 5 'icmp and greater 1000'
אם הלכידה מראה את המקטע הפנימי בגודל מלא בקצה המרוחק, בחירת ההעברה עובדת ונותר רק לתעד אותה. אם היא לא מראה דבר בזמן שהמנהרה מדווחת שהיא פעילה, המקטע החיצוני נזרק איפשהו בין הקצוות, מה שמחזיר אותך לבדיקה ולא להגדרות הצופן.
רשום שלושה דברים בכרטיס לפני שתסגור אותו: תקציב החוץ שנמדד, המנגנון שבחרת והפקודה שהוכיחה שהמקטע הפנימי שרד. האדם הבא שייגע במנהרה הזו יצטרך את כל השלושה, ואף אחד מהם אינו ניתן לשחזור מקובץ התצורה בלבד.