Công cụ định cấu hình ngăn xếp mạng

Hệ điều hành Android chứa các tiện ích kết nối mạng Linux tiêu chuẩn như ifconfig, ipip6tables. Các tiện ích này nằm trên hình ảnh hệ thống và cho phép định cấu hình toàn bộ ngăn xếp mạng Linux. Trên các thiết bị chạy Android 7.x trở xuống, mã của nhà cung cấp được phép gọi trực tiếp các tệp nhị phân này, gây ra các vấn đề sau:

  • Vì các tiện ích mạng được cập nhật trong hình ảnh hệ thống, nên các tiện ích này không cung cấp khả năng triển khai ổn định.
  • Phạm vi của các tiện ích mạng quá rộng nên khó có thể phát triển hình ảnh hệ thống trong khi vẫn đảm bảo hành vi có thể dự đoán được.

Trên các thiết bị chạy Android 8.0 trở lên, phân vùng nhà cung cấp vẫn giữ nguyên trong khi phân vùng hệ thống nhận được bản cập nhật. Để đạt được điều này, Android 8.0 cung cấp khả năng xác định giao diện ổn định, có phiên bản, đồng thời sử dụng các quy tắc hạn chế SELinux để duy trì sự phụ thuộc lẫn nhau của nhà cung cấp và hình ảnh hệ thống với một nhóm đã biết là tốt.

Nhà cung cấp có thể sử dụng các tiện ích cấu hình mạng do nền tảng cung cấp để định cấu hình ngăn xếp mạng Linux, nhưng các tiện ích này chưa bao gồm trình bao bọc giao diện HIDL. Để xác định một giao diện như vậy, Android 8.0 bao gồm công cụ netutils-wrapper-1.0.

Trình bao bọc Netutils

Tiện ích trình bao bọc netutils cung cấp một tập hợp con của cấu hình ngăn xếp mạng Linux không bị ảnh hưởng bởi các bản cập nhật phân vùng hệ thống. Android 8.0 chứa phiên bản 1.0 của trình bao bọc, cho phép bạn truyền các đối số giống như các tiện ích được bao bọc, được cài đặt trong phân vùng hệ thống tại /system/bin như sau:

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

Đường liên kết tượng trưng cho các tiện ích mạng được gói bằng trình bao bọc netutils, bao gồm:

  • ip
  • iptables
  • ip6tables
  • ndc
  • tc

Để sử dụng các tiện ích này trong Android 8.0 trở lên, việc triển khai của nhà cung cấp phải tuân thủ các quy tắc sau:

  • Quy trình của nhà cung cấp không được thực thi trực tiếp /system/bin/netutils-wrapper-1.0; nếu cố gắng thực hiện việc này sẽ dẫn đến lỗi.
  • Bạn phải chạy tất cả các tiện ích được gói bằng netutils-wrapper-1.0 bằng cách sử dụng đường liên kết tượng trưng của các tiện ích đó. Ví dụ: thay đổi mã nhà cung cấp đã thực hiện việc này trước đó (/system/bin/ip <FOO> <BAR>) thành /system/bin/ip-wrapper-1.0 <FOO> <BAR>.
  • Chính sách SELinux của nền tảng nghiêm cấm việc thực thi trình bao bọc mà không có quá trình chuyển đổi miền. Bạn không được thay đổi quy tắc này và quy tắc này sẽ được kiểm thử trong Bộ kiểm thử tính tương thích với Android (CTS).
  • Thực thi trực tiếp các tiện ích (ví dụ: /system/bin/ip <FOO> <BAR>) từ các quy trình của nhà cung cấp cũng bị cấm trong chính sách SELinux của nền tảng. Bạn không được thay đổi quy tắc này và quy tắc này sẽ được kiểm thử trong CTS.
  • Mọi miền (quy trình) của nhà cung cấp cần chạy trình bao bọc đều phải thêm quy tắc chuyển đổi miền sau đây trong chính sách SELinux: domain_auto_trans(VENDOR-DOMAIN-NAME, netutils_wrapper_exec, netutils_wrapper).

Bộ lọc trình bao bọc Netutils

Bạn có thể sử dụng các tiện ích được gói để định cấu hình hầu hết mọi khía cạnh của ngăn xếp mạng Linux. Tuy nhiên, để đảm bảo có thể duy trì giao diện ổn định và cho phép cập nhật phân vùng hệ thống, chỉ một số tổ hợp đối số dòng lệnh nhất định mới được phép; các lệnh khác sẽ bị từ chối.

Chuỗi và giao diện của nhà cung cấp

Trình bao bọc có khái niệm về giao diện nhà cung cấp. Đây là các giao diện thường do mã của nhà cung cấp quản lý, chẳng hạn như giao diện dữ liệu di động. Thông thường, các loại giao diện khác (chẳng hạn như Wi-Fi) được HAL và khung quản lý. Trình bao bọc nhận dạng giao diện nhà cung cấp theo tên (sử dụng biểu thức chính quy) và cho phép mã nhà cung cấp thực hiện nhiều thao tác trên các giao diện đó. Hiện tại, giao diện nhà cung cấp là:

  • Giao diện có tên kết thúc bằng "oem", theo sau là một số, chẳng hạn như oem0 hoặc r_oem1234.
  • Các giao diện mà các hoạt động triển khai SOC và OEM hiện tại sử dụng, chẳng hạn như rmnet_data[0-9].

Tên của các giao diện thường do khung quản lý (chẳng hạn như wlan0) không bao giờ là giao diện của nhà cung cấp.

Trình bao bọc có khái niệm tương tự về chuỗi nhà cung cấp. Các lệnh này được dùng trong lệnh iptables và cũng được nhận dạng theo tên. Hiện tại, chuỗi nhà cung cấp:

  • Bắt đầu với oem_
  • Được các hoạt động triển khai SOC và OEM hiện tại sử dụng, ví dụ: các chuỗi bắt đầu trong nm_ hoặc qcom_.

Các lệnh được phép

Dưới đây là danh sách các lệnh hiện được cho phép. Các quy tắc hạn chế được triển khai thông qua một tập hợp biểu thức chính quy trên các dòng lệnh đã thực thi. Để biết thông tin chi tiết, hãy tham khảo system/netd/netutils_wrappers/NetUtilsWrapper-1.0.cpp.

ip

Lệnh ip được dùng để định cấu hình địa chỉ IP, định tuyến, mã hoá IPsec và một số tham số mạng khác. Trình bao bọc cho phép các lệnh sau:

  • Thêm và xoá địa chỉ IP khỏi các giao diện do nhà cung cấp quản lý.
  • Định cấu hình tính năng mã hoá IPsec.

iptables và ip6tables

Các lệnh iptablesip6tables được dùng để định cấu hình tường lửa, làm rối gói, NAT và các hoạt động xử lý khác trên mỗi gói. Trình bao bọc cho phép các lệnh sau:

  • Thêm và xoá chuỗi nhà cung cấp.
  • Thêm và xoá các quy tắc trong bất kỳ chuỗi nào tham chiếu đến các gói đi vào (-i) hoặc ra khỏi (-o) giao diện nhà cung cấp.
  • Chuyển đến một chuỗi nhà cung cấp từ bất kỳ điểm nào trong chuỗi khác.

ndc

ndc được dùng để giao tiếp với trình nền netd thực hiện hầu hết cấu hình mạng trên Android. Trình bao bọc cho phép các lệnh sau:

  • Tạo và huỷ mạng OEM (oemXX).
  • Thêm giao diện do nhà cung cấp quản lý vào mạng của nhà sản xuất thiết bị gốc (OEM).
  • Thêm tuyến vào mạng của nhà sản xuất thiết bị gốc (OEM).
  • Bật hoặc tắt tính năng chuyển tiếp IP trên toàn cục và trên giao diện của nhà cung cấp.

tc

Lệnh tc được dùng để định cấu hình việc xếp hàng và định hình lưu lượng truy cập trên giao diện của nhà cung cấp.