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

מי באמת מסיים את החיבור המוצפן

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

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

NAT כותב מחדש את האורח עד שהוא נראה כמו המארח

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

# on the host: adapter mode and NAT DNS behaviour
VBoxManage showvminfo "lab-vm" | grep -i -E "nic|nat"
VBoxManage modifyvm "lab-vm" --natdnshostresolver1 on

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

גשר נותן לאורח חכירה משלו וחשיפה משלו

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

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

למה האורח לא יכול להיות השער של המארח

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

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

ssh -N -f -L 8080:internal-host.example:80 user@lab-vm

פותרים ונתיבים לא חוצים את הגבול

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

# on the host
VBoxManage showvminfo "lab-vm" | grep -i -E "nic|nat"
# inside a Linux guest
ip -4 route
resolvectl status
# inside a Windows guest
Get-DnsClientServerAddress

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

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