เครื่องมือกำหนดค่าสแต็กเครือข่าย

ระบบปฏิบัติการ 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สำหรับกำหนดอินเทอร์เฟซดังกล่าว

Wrapper ของ Netutils

ยูทิลิตี netutils wrapper ให้การกำหนดค่าสแต็กเครือข่าย Linux ชุดย่อยที่ไม่ได้รับผลกระทบจากการอัปเดตพาร์ติชันของระบบ Android 8.0 มี Wrapper เวอร์ชัน 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

สัญลักษณ์ลิงก์แสดงยูทิลิตีเครือข่ายที่รวมไว้โดย netutils Wrapper ซึ่งรวมถึง

  • ip
  • iptables
  • ip6tables
  • ndc
  • tc

หากต้องการใช้ยูทิลิตีเหล่านี้ใน Android 8.0 ขึ้นไป การติดตั้งใช้งานของผู้ให้บริการต้องเป็นไปตามกฎต่อไปนี้

  • กระบวนการของผู้ให้บริการต้องไม่เรียกใช้ /system/bin/netutils-wrapper-1.0 โดยตรง การพยายามดำเนินการดังกล่าวจะทำให้เกิดข้อผิดพลาด
  • ยูทิลิตีทั้งหมดที่รวมอยู่ใน netutils-wrapper-1.0 ต้องเปิดใช้งานโดยใช้ลิงก์สัญลักษณ์ เช่น เปลี่ยนรหัสผู้ให้บริการที่เคยดำเนินการนี้มาก่อน (/system/bin/ip <FOO> <BAR>) เป็น /system/bin/ip-wrapper-1.0 <FOO> <BAR>
  • นโยบาย SELinux ของแพลตฟอร์มไม่อนุญาตให้เรียกใช้ Wrapper โดยไม่เปลี่ยนโดเมน กฎนี้ต้องไม่เปลี่ยนแปลงและได้รับการทดสอบในชุดเครื่องมือทดสอบความเข้ากันได้ของ Android (CTS)
  • การดำเนินการกับยูทิลิตีโดยตรง (เช่น /system/bin/ip <FOO> <BAR>) จากกระบวนการของผู้ให้บริการ และยังไม่ได้รับอนุญาตในนโยบาย SELinux ของแพลตฟอร์มด้วย กฎนี้ต้องไม่เปลี่ยนแปลงและได้รับการทดสอบใน CTS
  • โดเมน (กระบวนการ) ของผู้ให้บริการที่จำเป็นต้องเปิดใช้งาน Wrapper จะต้องเพิ่มกฎการเปลี่ยนโดเมนต่อไปนี้ในนโยบาย SELinux domain_auto_trans(VENDOR-DOMAIN-NAME, netutils_wrapper_exec, netutils_wrapper)

ตัวกรอง Wrapper ของ Netutils

ยูทิลิตีที่รวมไว้สามารถใช้เพื่อกำหนดค่าเกือบทุกแง่มุมของสแต็กเครือข่าย Linux ได้ อย่างไรก็ตาม ระบบจะอนุญาตเฉพาะชุดค่าผสมบางอย่างของอาร์กิวเมนต์บรรทัดคำสั่งเท่านั้น และปฏิเสธคำสั่งอื่นๆ เพื่อให้อินเทอร์เฟซมีเสถียรภาพและอนุญาตให้อัปเดตพาร์ติชันระบบได้

อินเทอร์เฟซและเชนของผู้ให้บริการ

Wrapper มีแนวคิดของอินเทอร์เฟซของผู้ให้บริการ อินเทอร์เฟซเหล่านี้มักได้รับการจัดการโดยโค้ดของผู้ให้บริการ เช่น อินเทอร์เฟซการรับส่งข้อมูลมือถือ โดยปกติแล้ว HAL และเฟรมเวิร์กจะจัดการอินเทอร์เฟซประเภทอื่นๆ (เช่น Wi-Fi) Wrapper จะจดจำอินเทอร์เฟซของผู้ให้บริการตามชื่อ (โดยใช้นิพจน์ทั่วไป) และอนุญาตให้โค้ดของผู้ให้บริการดำเนินการต่างๆ กับอินเทอร์เฟซเหล่านั้นได้ อินเทอร์เฟซของผู้ให้บริการในปัจจุบันมีดังนี้

  • อินเทอร์เฟซที่มีชื่อลงท้ายด้วย "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 และพารามิเตอร์เครือข่ายอื่นๆ อีกหลายรายการ Wrapper อนุญาตให้ใช้คำสั่งต่อไปนี้

  • เพิ่มและนําที่อยู่ IP ออกจากอินเทอร์เฟซที่จัดการโดยผู้ให้บริการ
  • กำหนดค่าการเข้ารหัส IPsec

iptables และ ip6tables

ใช้คำสั่ง iptables และ ip6tables เพื่อกำหนดค่าไฟร์วอลล์ การเปลี่ยนรูปแบบแพ็กเก็ต NAT และการประมวลผลต่อแพ็กเก็ตอื่นๆ Wrapper อนุญาตให้ใช้คําสั่งต่อไปนี้

  • เพิ่มและลบเชนผู้ให้บริการ
  • เพิ่มและลบกฎในเชนใดก็ได้ที่อ้างอิงถึงแพ็กเก็ตที่เข้าสู่ (-i) หรือออกจาก (-o) อินเทอร์เฟซของผู้ให้บริการ
  • ข้ามไปยังเชนผู้ให้บริการจากจุดใดก็ได้ในเชนอื่น

ndc

ndc ใช้เพื่อสื่อสารกับเดรัมน์ netd ที่จะทำการกําหนดค่าเครือข่ายส่วนใหญ่ใน Android Wrapper อนุญาตให้ใช้คำสั่งต่อไปนี้

  • สร้างและลบเครือข่าย OEM (oemXX)
  • เพิ่มอินเทอร์เฟซที่จัดการโดยผู้ให้บริการลงในเครือข่าย OEM
  • เพิ่มเส้นทางไปยังเครือข่าย OEM
  • เปิดหรือปิดใช้การส่งต่อ IP ทั่วโลกและในอินเทอร์เฟซของผู้ให้บริการ

tc

ใช้คำสั่ง tc เพื่อกำหนดค่าการจัดคิวและการกำหนดรูปแบบการรับส่งข้อมูลในอินเทอร์เฟซของผู้ให้บริการ