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

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

הקטגוריה בוחרת כללים, לא נתיבים

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

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

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

FlowWhat decides itWhat a rule can enforce
VPN client to its endpointRouting plus the outer transportAllow the client process before the tunnel exists
Application to an internet hostInterface metric and prefix lengthBlock the process unless the tunnel interface is up
Application to a LAN hostLocal subnet routeAllow one destination, not the whole category

חסימה מפורשת גוברת על הרשאה צרה יותר

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

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

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

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

תנו למדיניות היציאה בעלים אחד

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

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

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

בדקו ארבע תוצאות במקום לקרוא את התווית

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

Get-NetConnectionProfile | Select-Object Name,NetworkCategory,InterfaceAlias
Get-NetFirewallProfile | Select-Object Name,DefaultOutboundAction
Get-NetFirewallRule -Direction Outbound -Enabled True | Where-Object Action -eq Block |
  Select-Object DisplayName,Profile

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

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

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