כלים להגדרת סטאק הרשת

מערכת ההפעלה של Android מכילה כלי רשת רגילים של Linux, כמו ifconfig, ‏ ip ו-ip6tables. הכלים האלה נמצאים בתמונת המערכת ומאפשרים להגדיר את כל סטאק הרשתות של Linux. במכשירים עם Android מגרסה 7.x ומטה, קוד של ספקים יכול להפעיל את הקבצים הבינאריים האלה ישירות, וכתוצאה מכך נוצרות הבעיות הבאות:

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

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

ספקים יכולים להשתמש בכלי השירות של הגדרת הרשת שסופקו על ידי הפלטפורמה כדי להגדיר את מחסנית הרשתות של Linux, אבל הכלים האלה עדיין לא כוללים מעטפת של ממשק HIDL. כדי להגדיר ממשק כזה, גרסת Android 8.0 כוללת את הכלי netutils-wrapper-1.0.

Netutils wrapper

תוכנת האריזה netutils מספקת קבוצת משנה של הגדרת סטאק הרשת של Linux שלא מושפעת מעדכונים של מחיצות המערכת. Android 8.0 מכיל את הגרסה 1.0 של המעטפות, שמאפשרת להעביר את אותם ארגומנטים כמו של כלי השירות המארזים, שמותקנים במחיצה של המערכת ב-/system/bin באופן הבא:

u:object_r:system_file:s0           /system/bin/ip-wrapper-1.0 -> netutils-wrapper-1.0
u:object_r:system_file:s0           /system/bin/ip6tables-wrapper-1.0 -> netutils-wrapper-1.0
u:object_r:system_file:s0           /system/bin/iptables-wrapper-1.0 -> netutils-wrapper-1.0
u:object_r:system_file:s0           /system/bin/ndc-wrapper-1.0 -> netutils-wrapper-1.0
u:object_r:netutils_wrapper_exec:s0 /system/bin/netutils-wrapper-1.0
u:object_r:system_file:s0           /system/bin/tc-wrapper-1.0 -> netutils-wrapper-1.0

קישורי ה-Symlink מציגים את כלי הרשת שמקובצים ב-wrapper של netutils, כולל:

  • ip
  • iptables
  • ip6tables
  • ndc
  • tc

כדי להשתמש בכלים האלה ב-Android מגרסה 8.0 ואילך, הטמעות של ספקים חייבות לפעול לפי הכללים הבאים:

  • אסור להריץ את /system/bin/netutils-wrapper-1.0 ישירות בתהליכים של ספקים. ניסיון לעשות זאת יוביל לשגיאה.
  • צריך להפעיל את כל כלי השירות שמקושרים ל-netutils-wrapper-1.0 באמצעות קישורי ה-symlink שלהם. לדוגמה, משנים את קוד הספק שעשה זאת קודם (/system/bin/ip <FOO> <BAR>) ל-/system/bin/ip-wrapper-1.0 <FOO> <BAR>.
  • אי אפשר להריץ את המעטפות בלי מעבר בין דומיינים, לפי מדיניות SELinux של הפלטפורמה. אסור לשנות את הכלל הזה, והוא נבדק ב-Android Compatibility Test Suite‏ (CTS).
  • הפעלה ישירה של הכלים (למשל, /system/bin/ip <FOO> <BAR>) מתהליכי הספק אסורה גם במדיניות SELinux של הפלטפורמה. אסור לשנות את הכלל הזה, והוא נבדק ב-CTS.
  • כל דומיין (תהליך) של ספק שצריך להפעיל מעטפת צריך להוסיף את כלל המעבר הבא של הדומיין למדיניות SELinux: domain_auto_trans(VENDOR-DOMAIN-NAME, netutils_wrapper_exec, netutils_wrapper).

מסנני Netutils wrapper

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

ממשקים ושרשראות של ספקים

למעטפת יש מושג של ממשקי ספקים. אלה ממשקים שמנוהלים בדרך כלל על ידי קוד של ספק, כמו ממשקי נתונים סלולריים. בדרך כלל, ממשקים מסוגים אחרים (כמו Wi-Fi) מנוהלים על ידי ממשקי ה-HAL והמסגרת. המעטפת מזהה ממשקי ספקים לפי שם (באמצעות ביטוי רגולרי) ומאפשרת לקוד של הספק לבצע פעולות רבות בהם. בשלב זה, ממשקי הספקים הם:

  • ממשקים שהשם שלהם מסתיים ב-'oem' ואחריו מספר, למשל oem0 או r_oem1234.
  • ממשקים שמשמשים את ההטמעות הנוכחיות של SOC ו-OEM, כמו rmnet_data[0-9].

שמות של ממשקים שמנוהלים בדרך כלל על ידי המסגרת (כמו wlan0) הם אף פעם לא ממשקי ספקים.

ב-wrapper יש מושג דומה של שרשראות ספקים. הם משמשים בפקודות iptables וגם מזוהים לפי שם. בשלב הזה, רשתות של ספקים:

  • מתחילים ב-oem_.
  • הן משמשות להטמעות SOC ו-OEM נוכחיות, למשל, שרשרות שמתחילות ב-nm_ או ב-qcom_.

פקודות מותרות

הפקודות שמותר להשתמש בהן כרגע מפורטות בהמשך. ההגבלות מיושמות באמצעות קבוצה של ביטויים רגולריים בשורות הפקודה שבוצעו. פרטים נוספים זמינים במאמר system/netd/netutils_wrappers/NetUtilsWrapper-1.0.cpp.

ip

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

  • הוספה והסרה של כתובות IP מממשקים שמנוהלים על ידי ספקים.
  • מגדירים הצפנה של IPsec.

iptables ו-ip6tables

הפקודות iptables ו-ip6tables משמשות להגדרת חומת אש, פגיעה בחבילות, NAT ועיבוד אחר לכל חבילה. אפשר להשתמש ב-wrapper עם הפקודות הבאות:

  • הוספה ומחיקה של רשתות ספקים.
  • הוספה ומחיקה של כללים בכל שרשרת שמפנה לחבילות שנכנסות (-i) או יוצאות (-o) מממשק של ספק.
  • אפשר לעבור לרשת ספקים מכל נקודה ברשת אחרת.

ndc

ndc משמש לתקשורת עם הדימון netd שמבצע את רוב הגדרות הרשת ב-Android. אפשר להשתמש בפקודות הבאות ב-wrapper:

  • יצירת רשתות OEM והשמדת רשתות OEM (oemXX).
  • הוספת ממשקים בניהול הספק לרשתות של יצרני ציוד מקורי (OEM).
  • הוספת מסלולים לרשתות של יצרני ציוד מקורי (OEM).
  • הפעלה או השבתה של העברת IP באופן גלובלי ובממשקי הספקים.

tc

הפקודה tc משמשת להגדרת תורים ועיצוב של תעבורת נתונים בממשקי ספקים.