Công cụ 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 như ifconfig , ipip6tables . Các tiện ích này nằm trên hình ảnh hệ thống và cho phép cấu hình toàn bộ hệ thống 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, điều 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 chúng 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 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 đượ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 hạn chế của SELinux để duy trì sự phụ thuộc lẫn nhau giữa hình ảnh nhà cung cấp và hệ thống ở một tập hợp tốt đã biết.

Các 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 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ấ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 chuyển các đối số tương tự 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 liên kết tượng trưng hiển thị các tiện ích mạng được bao bọc bởi 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:

  • Các 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 ; cố gắng làm như vậy sẽ dẫn đến sai sót.
  • Tất cả các tiện ích được bao bọc bởi netutils-wrapper-1.0 phải được khởi chạy bằng các 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 đây ( /system/bin/ip <FOO> <BAR> ) thành /system/bin/ip-wrapper-1.0 <FOO> <BAR> .
  • Việc thực thi các trình bao bọc mà không chuyển đổi miền 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 Bộ kiểm tra tương thích Android (CTS) .
  • Việc thực thi các tiện ích trực tiếp (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 các 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) nào của nhà cung cấp cần khởi chạy trình bao bọc đều phải thêm quy tắc chuyển đổi miền sau vào 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

Các tiện ích được bao bọc có thể được sử dụng để đị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ỉ cho phép một số kết hợp đối số dòng lệnh nhất đị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ởi mã 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 (như Wi-Fi) được quản lý bởi HAL và framework. Trình bao bọc nhận dạng giao diện của 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 chúng. 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 .
  • Các giao diện được sử dụng bởi các 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 được quản lý bởi khung (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 . Chúng được sử dụng trong các lệnh iptables và cũng được nhận dạng theo tên. Hiện nay, chuỗi nhà cung cấp:

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

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

Các lệnh hiện được phép được liệt kê dưới đây. Các hạn chế được thực hiện 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 chi tiết, hãy tham khảo system/netd/netutils_wrappers/NetUtilsWrapper-1.0.cpp .

ip

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

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

iptables/ip6tables

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

  • Thêm và xóa chuỗi nhà cung cấp.
  • Thêm và xóa các quy tắc trong bất kỳ chuỗi nào đề cập đế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 chuỗi nhà cung cấp từ bất kỳ điểm nào trong bất kỳ chuỗi nào khác.

ndc

ndc được sử dụng để liên lạc với netd daemon 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à hủy 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 đường vào mạng OEM.
  • Bật hoặc tắt chuyển tiếp IP trên toàn cầu và trên giao diện của nhà cung cấp.

tc

Lệnh tc được sử dụng để định cấu hình 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.