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

התאמה לפי שם שורדת את הממשק

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

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

קראו את השרשרת לפני שמוסיפים כללים

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

nft list ruleset
nft -c -f /etc/nftables.conf

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

למסלולים, לתרגום ולזרימות יש בעלים אחרים

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

conntrack -L -s 10.20.0.0/24 | head
ip route show dev vpn0

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

קבלו אתחול קר, אובדן והתאוששות

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

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

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