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 mạng Linux tiêu chuẩn chẳng hạ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ã nhà cung cấp được phép gọi trực tiếp các tệp nhị phân này, mã này hiển thị những 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 chúng sẽ không hãy cung cấp phương thức triển khai ổn định.
  • Phạm vi của các tiện ích mạng quá rộng nên rất khó 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.

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 Google cung cấp khả năng xác định giao diện ổn định, có nhiều phiên bản trong khi vẫn sử dụng Các hạn chế của 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 tập hợp set hay đã biế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. Để định nghĩa 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 Linux cấu hình ngăn xếp mạng không bị ảnh hưởng bởi việc 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 đố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

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

  • ip
  • iptables
  • ip6tables
  • ndc
  • tc

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

  • Các quy trình của nhà cung cấp không được thực thi /system/bin/netutils-wrapper-1.0 trực tiếp; cố gắng làm như vậy dẫn đến lỗi.
  • Bạn phải khở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 chúng. Ví dụ: thay đổi mã nhà cung cấp đã thực hiện việc này trước đó (/system/bin/ip <FOO> <BAR>) đến /system/bin/ip-wrapper-1.0 <FOO> <BAR>.
  • Nền tảng nghiêm cấm việc thực thi trình bao bọc mà không chuyển đổi miền Chính sách SELinux. Quy tắc này không được thay đổi và sẽ được thử nghiệm lại trong Bộ kiểm tra tính tương thích (CTS) với Android.
  • Thực thi trực tiếp các tiện ích (ví dụ: /system/bin/ip <FOO> <BAR>) qua 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. Quy tắc này không được thay đổi và được kiểm tra trong CTS.
  • Bất kỳ miền (quy trình) của nhà cung cấp nào cần khởi chạy một trình bao bọc đều phải thêm thuộc tính quy tắc chuyển đổi miền sau 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ể dùng các tiện ích được bao bọc để định cấu hình hầu hết mọi khía cạnh của Linux ngăn xếp mạng. Tuy nhiên, để đảm bảo có thể duy trì giao diện và cho phép cập nhật phân vùng hệ thống, chỉ một số kết hợp nhất định cho phép đối số dòng lệnh; các lệnh khác sẽ bị từ chối.

Giao diện và chuỗi nhà cung cấp

Trình bao bọc có khái niệm về giao diện của nhà cung cấp. Đây là các giao diện thường được quản lý bằng mã của nhà cung cấp, 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) do HAL và khung. Trình bao bọc nhận dạng giao diện của nhà cung cấp theo tên (sử dụng thẻ biểu thức) và cho phép mã nhà cung cấp thực hiện nhiều thao tác trên đó. Hiện tại, giao diện của 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.
  • Những giao diện được sử dụng trong quá trình triển khai SOC và OEM hiện tại, 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 tham số này được sử dụng trong các 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 sử dụng trong các hoạt động triển khai SOC và OEM hiện tại, ví dụ: chuỗi bắt đầu bằng nm_ hoặc qcom_.

Lệnh được phép

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

IP

Lệnh ip dùng để định cấu hình địa chỉ IP, định tuyến, IP mã hoá 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 giao diện do nhà cung cấp quản lý.
  • Định cấu hình mã hoá IP.

iptables và ip6tables

Các lệnh iptablesip6tables được dùng để định cấu hình tường lửa, xử lý gói tin, NAT và các cách xử lý khác theo từng 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á 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 trong số (-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 bất kỳ chuỗi nào khác.

NĐC

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

  • 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 OEM.
  • Thêm tuyến vào mạng OEM.
  • Bật hoặc tắt chế độ chuyển tiếp IP trên toàn cục và trên các giao diện của nhà cung cấp.

tc

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