LXD חושף התקן תווים של המארח למכולה על ידי הוספת צומת התקן, ולא על ידי לימוד האורח ליצור אחד. אם במכולה אין /dev/net/tun, ההתקן עשוי להתקיים במארח והאורח עדיין לא יוכל לפתוח אותו. רשומת unix-char היא החצי של המסלול הזה מצד המנהל, והיא במכוון צרה יותר ממכולה בעלת הרשאות. לכן צומת המארח וצומת המכולה ראויים לבדיקות נפרדות.

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

מה רשומת unix-char משנה בפועל

התקן unix-char אומר ל-LXD לחשוף התקן תווים אחד של המארח בנתיב נבחר בתוך המכולה. ברשומה שלושה חלקים חשובים: תווית ההתקן שהמנהל משתמש בה, הנתיב source במארח וה-path שהאורח רואה. רק השניים האחרונים מתארים את ההתקן עצמו. שגיאת הקלדה באחד מהם יוצרת צומת במקום שהלקוח לעולם אינו פותח.

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

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

הצהירו על ההתקן במופע, ולא בתוך האורח

הוסיפו את הרשומה מהקשר הניהול של LXD, עם שם המופע ותווית שתזהו בהמשך. עבור מכולה בשם vpnbox הפקודה היא:

lxc config device add vpnbox tun unix-char source=/dev/net/tun path=/dev/net/tun
lxc config device show vpnbox

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

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

התאימו בעלות והרשאות לתהליך האורח

רשומת unix-char יכולה לקבוע uid, gid ו-mode עבור הצומת בתוך המכולה. השתמשו בהם כדי להתאים לחשבון שמריץ את לקוח ה-VPN, במקום לפתוח את ההתקן לכל משתמש או להעביר את המכולה למצב בעל הרשאות.

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

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

דעו מה הרשומה אינה נותנת

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

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

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

בדקו נראות, פתיחה וממשק בסדר הזה

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

lxc exec vpnbox -- ls -l /dev/net/tun
lxc exec vpnbox -- sh -c 'test -c /dev/net/tun && echo char-device-ok'

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

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

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