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

היכן חבילות של מכולת Windows נכנסות אל המארח

מכולה ברשת ברירת המחדל nat מקבלת כתובת מקידומת של שירות Host Networking Service, בדרך כלל אי שם בתוך 172.16.0.0/12, ומגיעה אל המארח דרך מתאם וירטואלי. המארח הוא הבעלים של הנתיב לקידומת הזו ומתרגם תעבורה אל המתאם הפעיל. אין מכונה וירטואלית נפרדת באמצע הנתיב הזה.

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

מה לקוח ה-VPN משנה בנתיב הזה

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

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

Container modeOutbound pathTypical result behind the VPN
Windows, default natHost routes and translates container trafficContainer prefix follows the tunnel and fails
Windows, transparentContainer sits on the physical linkDepends on the local subnet being allowed
Linux engine on Docker DesktopVM egress proxied by a host processOften keeps working

מדוע מכולות Linux מתנהגות אחרת

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

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

הוכיחו את הנתיב ואז בחרו תכנון

אספו ראיות מהמארח, לא מהמכולה, מפני שהמארח מבצע את החיפוש:

docker network inspect nat --format "{{range .IPAM.Config}}{{.Subnet}}{{end}}"
route print -4
Get-NetRoute -AddressFamily IPv4 | Where-Object DestinationPrefix -like "172.16.*"

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

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

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

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