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

ระบบปฏิบัติการ Android มียูทิลิตีเครือข่าย Linux มาตรฐาน เช่น ifconfig, ip และ ip6tables ยูทิลิตีเหล่านี้จะอยู่ในอิมเมจของระบบและเปิดใช้การกำหนดค่า ทั้งสแต็กเครือข่าย Linux สำหรับอุปกรณ์ที่ใช้ Android 7.x และต่ำกว่า โค้ดของผู้ให้บริการจะได้รับอนุญาตให้เรียกไบนารีเหล่านี้โดยตรง ซึ่งแสดง ปัญหาต่อไปนี้

  • เนื่องจากยูทิลิตีเครือข่ายมีการอัปเดตในอิมเมจของระบบ ยูทิลิตีเหล่านั้นจะไม่ ทำให้มีการติดตั้งใช้งานที่เสถียร
  • ขอบเขตของยูทิลิตีเครือข่ายนั้นกว้างมากจนทำให้พัฒนาได้ยาก อิมเมจระบบไปพร้อมๆ กับรับประกันพฤติกรรมที่คาดการณ์ได้

ในอุปกรณ์ที่ใช้ Android 8.0 ขึ้นไป พาร์ติชันผู้ให้บริการจะยังคงเหมือนเดิม ขณะที่พาร์ติชันระบบรับการอัปเดต เพื่อให้บรรลุเป้าหมายนี้ Android 8.0 ทำให้คุณสามารถกำหนดอินเทอร์เฟซ ที่มีเวอร์ชันและเสถียร ข้อจำกัดของ SELinux เพื่อคงความสัมพันธ์ระหว่างผู้ให้บริการและอิมเมจระบบใน เซ็ตที่รู้ว่าดีเลย

ผู้ให้บริการสามารถใช้ยูทิลิตีการกำหนดค่าเครือข่ายที่แพลตฟอร์มมีให้เพื่อ กำหนดค่าสแต็กเครือข่าย Linux แต่ยูทิลิตีเหล่านี้ยังไม่มี Wrapper ของอินเทอร์เฟซ HIDL ในการกำหนดอินเทอร์เฟซดังกล่าว Android 8.0 จะรวม เครื่องมือ netutils-wrapper-1.0

Wrapper ของ Netutils

ยูทิลิตี Wrapper netutils จะมีชุดย่อยของ Linux การกำหนดค่าสแต็กเครือข่ายที่ไม่ได้รับผลกระทบจากการอัปเดตพาร์ติชันระบบ Android 8.0 มี Wrapper เวอร์ชัน 1.0 ซึ่งช่วยให้คุณส่ง Wrapper อาร์กิวเมนต์เดียวกับยูทิลิตีที่รวมไว้ ซึ่งติดตั้งในพาร์ติชันระบบที่ /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 แสดงยูทิลิตีเครือข่ายที่รวมโดย 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>
  • ไม่อนุญาตให้เรียกใช้ Wrapper โดยไม่เปลี่ยนโดเมนในแพลตฟอร์ม นโยบาย SELinux กฎนี้ต้องไม่มีการเปลี่ยนแปลง และต้องทดสอบกับใน ชุดทดสอบความเข้ากันได้ของ 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 มีแนวคิดเกี่ยวกับอินเทอร์เฟซผู้ให้บริการ นี่คืออินเทอร์เฟซ ซึ่งโดยทั่วไปจะจัดการโดยรหัสของผู้ให้บริการ เช่น อินเทอร์เฟซข้อมูลโทรศัพท์มือถือ โดยทั่วไป อินเทอร์เฟซประเภทอื่นๆ (เช่น Wi-Fi) ได้รับการจัดการโดย HAL และ 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) อินเทอร์เฟซของผู้ให้บริการ
  • ข้ามไปยังเชนผู้ให้บริการจากจุดใดก็ได้ในเชนอื่นๆ

NCC

ระบบใช้ ndc เพื่อสื่อสารกับ Daemon netd ซึ่ง กำหนดค่าเครือข่ายส่วนใหญ่ใน Android Wrapper จะทำสิ่งต่อไปนี้ได้ คำสั่ง:

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

tc

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