מחשב נייד יושב על /24 של המשרד דרך Ethernet ומצטרף גם לשרת OpenVPN שחי באותה /24. עמית עושה פינג לכתובת המנהרה; הבקשה מגיעה בבירור, ושום דבר לא חוזר. יומן המנהרה נקי והגלישה עדיין עובדת, ולכן המנהרה היא החשוד הלא נכון. אימות מקור IPv4 במכונה המקבלת זורק את החבילה לפני שמישהו קורא אותה.

הזריקה קורית לפני שמישהו קורא את החבילה

אימות המקור שואל שאלה אחת על כל חבילה נכנסת: אילו המארח הזה השיב לאותו מקור, האם התשובה הייתה יוצאת דרך הממשק שאליו החבילה הגיעה זה עתה? כשהתשובה היא לא, הגרעין זורק את החבילה עם הגעתה. לא סוקט ולא נתיב העברה רואה אותה אי פעם, ולכן לכידה על המנהרה עדיין רושמת בקשה שהאפליקציה לעולם אינה מקבלת.

הלקוח כאן מחזיק 10.66.0.9 על המנהרה שלו, ושרת OpenVPN עונה בכתובת 192.168.80.10 בתוך קידומת המשרד. עמית בכתובת 192.168.80.25 עושה פינג לכתובת המנהרה, כך שהבקשה חוצה את הרשת המקומית, השרת מנתב אותה למנהרה, והיא מגיעה לממשק המנהרה של הלקוח כשהיא נושאת כתובת מקור של המשרד. בטבלת הניתוב של אותה מכונה קידומת המשרד שייכת להתקן ה-Ethernet, לא למנהרה. האימות משווה את ממשק ההגעה לנתיב, מוצא אי־התאמה וזורק את החבילה, ולכן העמית רואה אובדן מוחלט בעוד שני הקצוות מדווחים על מנהרה תקינה.

לכיוון המראה אותה צורה: כשהלקוח יוזם כלפי המשרד, תשובות עלולות להיזרק בצד המשרד מאותה סיבה בדיוק. תיקון שאומת בכיוון אחד בלבד נוטה לחזור כקריאה שנייה.

הוכיחו את המצב הפעיל לפני שנוגעים ב-sysctl כלשהו

קראו את הערכים האפקטיביים במקום לסמוך על ברירת מחדל של הפצה, כי ההגדרה לכל ממשק היא רק חצי מההחלטה. המצב הפעיל הוא הגבוה מבין ערך הממשק וערך all, ולכן אפס בממשק המנהרה אינו אומר דבר כל עוד all הוא אחד. ההחלטה של המצב המחמיר היא החלטת ניתוב, ולכן הריצו את החיפוש שהגרעין מריץ והשוו את תשובתו לממשק שאליו החבילה באמת הגיעה.

tcpdump -ni tun0 icmp and host 192.168.80.25
ip route get 192.168.80.25
sysctl net.ipv4.conf.all.rp_filter net.ipv4.conf.tun0.rp_filter

אחר כך חזרו על הפינג תוך מעקב אחר מונה השגיאות. מונה שעולה לצד בקשה שהלכידה כבר מציגה הוא החתימה של הזריקה הזו, לא של נתיב חסר. הפעילו רישום חבילות מאדים כשאתם שם, כדי שהגרעין ימנה את המקור ואת הממשק שהוא דחה. יחד הם שוללים את הצופן, את חומת האש ואת היעדר iroute כהסברים.

רשמו את קו הבסיס לפני שמשנים משהו: שני הערכים, ההתקן שהחיפוש בחר והמונה שעקב אחריו. הרשומה הזו היא שתספר לכם אחר כך אם השינוי עשה את מה שאתם חושבים.

מה כל מצב של rp_filter באמת מקבל

הגרעין חושף שלושה ערכים לכל ממשק, והם אינם שלושה גוונים של כלל אחד. אפס מכבה את הבדיקה. אחד הוא מחמיר ומחייב שהמקור ינותב חזרה דרך ממשק ההגעה. שניים הוא רופף ומחייב רק שקיים בטבלה נתיב כלשהו אל המקור, לאן שלא יוביל.

ValueNameAcceptsStill rejects
0offany source at allnothing on this check
1stricta source routed back out the arrival interfacea source whose route points elsewhere
2loosea source with any route in the tablea source with no route at all

השורה שמשנה כאן היא הרופפת, ומה שהיא ממשיכה לדחות. מקור מזויף שניתן לנתב בכל מקום בטבלה שלכם עובר, בעוד שמקור ללא נתיב כלל עדיין נדחה. במחשב נייד זו ויתור צר; בנתב שמעביר תעבורה של אנשים אחרים הוא רחב. המצב שייך למארח, ולכן אותו מספר נושא משקל שונה בשני המקומות.

איזו שורה הטופולוגיה הזו צריכה נובע מהטבלה ולא מהרגל. החבילה לגיטימית והמקור שלה ניתן לניתוב, ולכן הרופף מקבל אותה והמחמיר לא. שום דבר במקרה לא דורש אפס, ובחירה באפס הייתה מסירה בדיקה שאינה עולה כאן דבר.

בחרו את השינוי הקטן ביותר שמסיר את העמימות

המצב הרופף הוא השינוי הקטן ביותר שמתאים, והוא הפחתה אמיתית בקפדנות, לא מתג בלתי מזיק. אפשרות טובה יותר קיימת בכל פעם שהטופולוגיה מאפשרת: הסירו את החפיפה, והעמימות נעלמת.

היכן שקידומת המשרד נדרשת רק דרך Ethernet, הוציאו אותה מהנתיבים שהפרופיל מושך והכתובת תהפוך לנגישה בנתיב אחד. כששני הנתיבים באמת חייבים להתקיים יחד, הצמידו את המקור ואת ההתקן בכלל מדיניות במקום להרפות את האימות בכל ממשק. זה שומר על סינון מחמיר לכל השאר במכונה ומתעד את החריגה במקום שבו המהנדס הבא יחפש אותה.

באיזה נתיב שתבחרו, רשמו אותו ב-drop-in של sysctl ולא בפקודה חיה. הגדירו את המפתחות all ו-default יחד, כדי שחיבור מחדש לא יוכל להחזיר בשקט את המצב המחמיר.

# /etc/sysctl.d/99-rp-filter.conf
net.ipv4.conf.default.rp_filter = 2
net.ipv4.conf.all.rp_filter = 2
sysctl --system

למה המצב הרופף מוותר, והיכן

המצב הרופף עדיין דוחה מקור שאף נתיב לא היה מגיע אליו, והוא מפסיק לדחות מקור מזויף שבמקרה ניתן לניתוב. במחשב נייד זו ויתור צר. בהתקן שמעביר תעבורה שאינה שלו, אותה בחירה רחבה בהרבה. לכן אותה הגדרה נושאת שני משמעויות שונות מאוד לפי המקום שבו היא רצה.

כיבוי הבדיקה לגמרי במארח שמעביר תעבורה עבור אנשים אחרים הוא התיקון היחיד שכדאי להימנע ממנו. אפס זורק את האימות שהמצב הרופף שומר עליו בקפידה. אם המארח מעביר עבור אחרים, טענו במקום זאת בעד אפשרות כלל המדיניות מהסעיף הקודם.

השאירו הערה שמציינת את שני הממשקים, את הקידומת החופפת ואת הבדיקה המדויקת שמצליחה כעת. זה מועיל יותר למהנדס הבא מאשר שורה שאומרת שהסינון הותאם.

מאמרים קשורים