אפליקציית Linux רגילה משתמשת ב-VPN בלי לגעת ב-TUN
הדמון מחזיק במתקן ה-TUN ובמנהור; האפליקציות רק פותחות sockets. שמרו על הרשאת ההגדרה ועל גישת הרשת כגבולות נפרדים.
דפדפן שמשתמש ב-VPN לינוקס שכבר הוקם אינו פותח את /dev/net/tun. הוא פותח socket, והגרעין מחליט באיזה ממשק חבילות ה-socket הזה יוצאות. התהליך שיצר את המנהור עושה עבודה אחרת מהתהליך שהוא נושא את התעבורה שלו. הפרדה בין שני התפקידים האלה עונה על רוב שאלות ההרשאה לפני שהן נשאלות.
עקבו אחר חבילה אחת מה-socket אל המנהור
אפליקציה רגילה קוראת ל-connect או ל-send, והגרעין מחפש מסלול ליעד. אם המסלול הנבחר מצביע על ממשק המנהור, החבילה מוכנסת לתור במתקן שהדמון של ה-VPN קורא. הדמון מצפין אותה ושולח אותה החוצה דרך הממשק הפיזי. כל חץ בתיאור הזה הוא מקום שבו אפשר לענות על שאלת הרשאה.
שום דבר במסלול הזה לא דורש מהאפליקציה לדעת על המתקן. הדמון מחזיק במתאר הקובץ ומבצע את פעולות הממשק, בעוד האפליקציה רואה רק API רשת רגיל.
ציירו את שני החצאים פעם אחת, ושאלות ההרשאה יהפכו לקלות יותר למיקום. החצי העליון הוא עולם האפליקציות, והחצי התחתון שייך לדמון.
החליטו מי צריך את המתקן ומי לא
יצירה של ממשק TUN או התחברות אליו דורשת גישה למתקן ובנוסף את היכולת להגדיר אותו, ולכן שירות VPN נתמך מתחיל בסמכות ניהול רשת או משתמש בעוזר בעל הרשאות. הדרישה הזו שייכת לדמון. היא לא אומרת דבר על הדפדפן, על לקוח מסד הנתונים או על כלי העברת הקבצים. שירות שצריך את היכולת צריך אותה לצעד ההגדרה שלו, לא ללקוחות שלו.
לאחר שהמסלול והמדיניות במקומם, תהליך רגיל משתמש במסלול הנובע דרך קריאות ה-socket הרגילות שלו. הוא לא צריך את צומת המתקן, והוא לא צריך root.
שינוי הרשאות המתקן אינו דרך להעניק לאפליקציה גישה ליעד. הוא רק מעביר את גבול המתקן למקום אחר.
בדקו באיזה מרחב שמות האפליקציה באמת רצה
מכולה, או מרחב שמות רשת שני, נותנת לתהליכים שלה קבוצת ממשקים וטבלת מסלולים נפרדת. מנהור על המארח לא מופיע שם אוטומטית, ושום כמות של שינויי הרשאות מתקן לא משנה זאת. האפליקציה פשוט תנתב דרך מה שמרחב השמות הזה מספק. לכן תמונת מכולה לא יכולה לרשת מנהור מארח בטעות.
בדקו עם ip netns list ו-ip -n NAME route, או על ידי בחינת קישור מרחב השמות של התהליך. התשובה בדרך כלל נראית בפקודה אחת.
אפשר גם לתת לשני משתמשים על אותו מארח מסלולים שונים באמצעות מדיניות. זו החלטת רשת ולא ראיה לבעלות על המתקן.
הפרידו בין יכולות למדיניות רשת
כמה כלים צריכים יותר מ-socket. לכידת חבילות צריכה socket גולמי, ושינוי מסלולים צריך סמכות ניהול. אלה פעולות נפרדות עם הרשאות נפרדות, ואין לקרוא להענקת אחת מהן כדרישה גורפת לשימוש ב-VPN.
תוכנית שמממשת מנהור משל עצמה היא מקרה שלישי. היא באמת פותחת TUN מפני שהיא נוטלת את תפקיד הדמון, ולכן היא צריכה את הרשאות הדמון.
נקבו בשם הפעולה לפני שם ההרשאה. בדרך כלל קל יותר להפריד ביניהן ממה שזה נראה.
אמתו את ההפרדה עם שני חשבונות
חברו את המנהור כשירות, ואז הריצו את האפליקציה כמשתמש רגיל ואשרו שהיא מגיעה למשאב הפרטי. בדקו ip route get ליעד מתוך ה-shell של אותו משתמש כדי לראות איזה ממשק נבחר. אם המסלול נכון והחיבור עדיין נכשל, הבעיה היא מדיניות ולא הרשאה.
העיצוב שנוצר הוא הרשאה מינימלית עם גבול מפורש: רכיב אחד מחזיק בהגדרה ובמשאבי המנהור, עומסי העבודה שומרים על החשבונות הרגילים שלהם, ומדיניות הרשת מחליטה מה רשאי לעבור. הרצת הכול כ-root ממוטטת את התפקידים האלה בלי להסביר דבר.