VPN מחובר אבל חומת האש עדיין חוסמת: איך לדעת מה מהם
המנהרה פעילה ופורט אחד עדיין נכשל. קראו את המסלול, אחר כך את המדיניות בכל שכבה, ושנו את הכלל הצר ביותר במקום לכבות אחד משני הבקרים.
הלקוח אומר מחובר, המשאב עדיין מסרב, והצעד הבא הרגיל הוא לכבות משהו. שני הבקרים במשפט הזה עושים עבודות שונות: ה־VPN בונה מסלול לתעבורה המכוסה, וחומת אש מחליטה לכל חיבור אם התעבורה רשאית לעבור. מנהרה שעובדת עם מדיניות שמסרבת נראית בדיוק כמו מנהרה שבורה מכיסא המשתמש, ולכן המשימה היא למצוא איזו שכבה עונה. זה הסדר שאני עוקב אחריו, עם הקריאה שאומרת לכם לעצור.
הפרידו את המסלול מהמדיניות
התחילו מצורת הכשל, כי זה מידע בחינם. השלכת מנה יוצרת פסק זמן: הלקוח מנסה שוב, שום דבר לא חוזר, והפקודה נתלית עד שהיא מוותרת. דחייה יוצרת סירוב או איפוס: משהו ענה ואמר לא. שירות שלא מקשיב מסרב על המארח עצמו, בלי שום חומת אש.
שלושת התוצאות האלה מצביעות על שכבות שונות. פסק זמן אומר שמדיניות אי שם משליכה בשקט, או שהמסלול לא עוזב את המכונה לעולם. נדחה אומר שהגעתם למארח והמחסנית או חומת האש המקומית שלו סירבה. שקט מוחלט, כשממשק המנהרה פעיל ואין מסלול ליעד, אומר שהמסלול שגוי ושום כלל חומת אש לא יתקן אותו.
קראו את המסלול במעבר אחד
ודאו שהמנהרה מכסה את היעד לפני שאתם מסתכלים אפילו על כלל אחד. מנהרה מפוצלת שנושאת רק את תת־הרשת של המשרד לא תנתב בקשה לטווח אחר, ואז הכשל נראה כמו חסימת חומת אש שאינה כזו:
ip route get 10.20.4.15
ip -brief address show
wg show
sudo ipsec statusall
פלט המסלול מציין את הממשק שדרכו תצא המנה ואת כתובת המקור שתישא. אם הממשק הזה הוא כרטיס הרשת הפיזי שלכם ולא המנהרה, הבעיה היא בניתוב או בטווחים המותרים של המנהרה, והיא שייכת לתצורת ה־VPN ולא לחומת האש.
מלכודת אחת המיוחדת ל־VPN ראויה לבדיקה נפרדת. ב־WireGuard, AllowedIPs של עמית הוא גם מסלול וגם מסנן קריפטוגרפי: מנה שכתובת המקור שלה אינה תואמת לקבוצה המותרת של העמית מושלכת לפני שנבדק כלל חומת אש כלשהו. לכן חומת אש מארחת לגמרי תקינה יכולה לעמוד מאחורי השלכה שקטה שנראית כמו מדיניות, והתיקון הוא שורת תצורה של המפתח ולא כלל.
קראו את המדיניות בשכבה שעונה
כשהמסלול נכון, עברו במדיניות מהמארח החוצה ושימו לב לשכבה היחידה שהמונים שלה זזים:
ss -ltn | grep ':443'
sudo nft list ruleset
sudo iptables -S INPUT
sudo ufw status verbose
השקע שמקשיב עונה על שאלה אחרת מזו של הכללים. אם שום דבר לא מקשיב בפורט, הגרעין מסרב לחיבור ואין כלל נכנס רלוונטי. אם השקע קיים והחיבור מלקוח מרוחק פג, השלכה מתרחשת אי שם במסלול, ומוני הכללים אומרים לכם אם היא מתרחשת כאן.
הפעילו רישום עבור הפרופיל או השרשרת שאתם חושדים בהם במקום לנחש מבחוץ. השלכה אחת שנרשמה ומציינת מקור, יעד ופורט מזהה את השכבה ואת הכלל, והיא גם מוכיחה שהמנה הגיעה, מה ששום בדיקה מצד הלקוח לא יכולה לקבוע.
קראו את החלטת השער כשהמנהרה מסתיימת שם
בשער אתר־לאתר או גישה מרחוק, ה־VPN מאמת משתמש והמדיניות מאשרת משאב, ואלה הרשאות נפרדות. משתמש שהורשה להיכנס למנהרה אינו מורשה אוטומטית לכל מארח פנימי, והסירוב מגיע לעיתים קרובות מכלל העברה בזמן שהמנהרה עצמה בריאה. אותה הפרדה מופיעה ב־IPsec, שבו מדיניות האבטחה שבוחרת תעבורה שונה מהמסנן שמתיר אותה, ולכן השניים מתועדים כמנגנונים שונים ב־RFC 4301.
בדקו את מסלול החזרה בקפידה כמו את מסלול היציאה. סינון מצבי צריך לראות את התשובה, ולכן ניתוב א־סימטרי דרך המנהרה בכיוון אחד ומסביבה בכיוון השני יוצר השלכות שנראות אקראיות ומשוחזרות רק מלקוחות מסוימים. אם התעבורה מגיעה לשער ונעצרת, קראו את כלל ההעברה ואת מסלול החזרה יחד לפני שאתם מרחיבים משהו.
השער הוא גם המקום שבו כלל NAT או הסוואה יכול להסתיר את המקור האמיתי. אם מארחים פנימיים רואים את כתובת השער במקום את הלקוח, כללי חומת האש שלהם שאמורים להתאים למאגר הלקוחות לא יתאימו לעולם, והתיקון שייך לשער ולא לכל שרת.
שנו את השכבה הצרה ביותר, ואז אמתו
התנגדו לתיקון הרחב. כיבוי חומת האש המקומית, הוספת כלל שמתיר הכול או כפיית כל ממשק לפרופיל מהימן מסירים כל פעם את הבקר שעשה את עבודתו, והשינוי שורד את התקרית. כלל שמוגבל לטווח המקור ולפורט המדובר קל יותר לסקירה, קל יותר להסרה, ומשאיר את שאר המדיניות של המכונה שלמה.
אמתו באותה בדיקה שנכשלה, מאותו לקוח, ואז פעם נוספת אחרי התחברות מחדש, כי כלל שמתאים לפני שהמנהרה מנהלת משא ומתן מחדש עלול להפסיק להתאים אחריה:
nc -vz 10.20.4.15 443
curl -v --max-time 5 https://10.20.4.15/
לפני שתסגרו את זה:
- המסלול ליעד יוצא דרך ממשק המנהרה, וכתובת המקור תואמת למה שהמדיניות מצפה.
- משהו מקשיב בפורט, והסירוב או פסק הזמן מיוחס לכלל בשם ולא להנחה.
- השער מעביר בשני הכיוונים, והיעד רואה את המקור שלשמו נכתבו הכללים שלכם.
- שום בקר לא כובה כדי שהבדיקה תעבור, והשינוי שעשיתם מציין טווח מקור אחד ופורט אחד.