Pemantauan traffic eBPF

Alat traffic jaringan eBPF menggunakan kombinasi implementasi kernel dan ruang pengguna untuk memantau penggunaan jaringan di perangkat sejak perangkat terakhir melakukan booting. Gateway ini menyediakan fungsi tambahan seperti pemberian tag soket, yang memisahkan traffic latar depan/latar belakang dan firewall per UID untuk memblokir aplikasi dari akses jaringan, bergantung pada status ponsel. Statistik yang dikumpulkan dari alat ini disimpan dalam struktur data kernel yang disebut eBPF maps dan hasilnya digunakan oleh layanan seperti NetworkStatsService untuk memberikan statistik traffic persisten sejak booting terakhir.

Contoh dan sumber

Perubahan ruang pengguna terutama ada dalam project system/netd dan framework/base. Pengembangan dilakukan di AOSP, sehingga kode AOSP akan selalu terbaru. Sumber ini sebagian besar terletak di system/netd/server/TrafficController*, system/netd/bpfloader, dan system/netd/libbpf/. Beberapa perubahan framework yang diperlukan juga ada di framework/base/ dan system/core.

Implementasi

Mulai Android 9, perangkat Android yang berjalan di kernel 4.9 atau yang lebih baru dan awalnya dikirimkan dengan rilis P HARUS menggunakan pemantau pemantauan traffic jaringan berbasis eBPF, bukan xt_qtaguid. Infrastruktur baru lebih fleksibel dan lebih mudah dikelola serta tidak memerlukan kode kernel out-of-tree.

Perbedaan desain utama antara pemantauan traffic lama dan eBPF diilustrasikan dalam Gambar 1.

Perbedaan desain pemantauan traffic lama dan eBPF

Gambar 1. Perbedaan desain monitoring traffic lama (kiri) dan eBPF (kanan)

Desain trafficController yang baru didasarkan pada filter eBPF per cgroup serta modul netfilter xt_bpf di dalam kernel. Filter eBPF ini diterapkan pada tx/rx paket saat melewati filter. Filter eBPF cgroup terletak di lapisan transpor dan bertanggung jawab untuk menghitung traffic terhadap UID yang tepat, bergantung pada UID soket serta setelan userspace. Netfilter xt_bpf terhubung di rantai bw_raw_PREROUTING dan bw_mangle_POSTROUTING serta bertanggung jawab untuk menghitung traffic terhadap antarmuka yang benar.

Pada waktu booting, proses ruang pengguna trafficController membuat peta eBPF yang digunakan untuk pengumpulan data dan menyematkan semua peta sebagai file virtual di sys/fs/bpf. Kemudian, proses dengan hak istimewa bpfloader memuat program eBPF yang telah dikompilasi sebelumnya ke kernel dan melampirkan program tersebut ke cgroup yang benar. Ada satu cgroup root untuk semua traffic, sehingga semua proses harus disertakan dalam cgroup tersebut secara default.

Pada waktu proses, trafficController dapat memberi tag/menghapus tag soket dengan menulis ke traffic_cookie_tag_map dan traffic_uid_counterSet_map. NetworkStatsService dapat membaca data statistik traffic dari traffic_tag_stats_map, traffic_uid_stats_map, dan traffic_iface_stats_map. Selain fungsi pengumpulan statistik traffic, filter eBPF trafficController dan cgroup juga bertanggung jawab untuk memblokir traffic dari UID tertentu bergantung pada setelan ponsel. Fitur pemblokiran traffic jaringan berbasis UID adalah pengganti modul xt_owner di dalam kernel dan mode detail dapat dikonfigurasi dengan menulis ketraffic_powersave_uid_map, traffic_standby_uid_map, dan traffic_dozable_uid_map.

Implementasi baru ini mengikuti implementasi modul xt_qtaguid lama sehingga TrafficController dan NetworkStatsService akan berjalan dengan implementasi lama atau baru. Jika menggunakan API publik, aplikasi tidak akan mengalami perbedaan apa pun, baik alat xt_qtaguid maupun eBPF digunakan di latar belakang.

Jika kernel perangkat didasarkan pada kernel umum Android 4.9 (SHA 39c856663dcc81739e52b02b77d6af259eb838f6 atau yang lebih baru), tidak ada modifikasi pada HAL, driver, atau kode kernel yang diperlukan untuk menerapkan alat eBPF baru.

Persyaratan

  1. Konfigurasi kernel HARUS mengaktifkan konfigurasi berikut:

    1. CONFIG_CGROUP_BPF=y
    2. CONFIG_BPF=y
    3. CONFIG_BPF_SYSCALL=y
    4. CONFIG_NETFILTER_XT_MATCH_BPF=y
    5. CONFIG_INET_UDP_DIAG=y

    Pengujian konfigurasi kernel VTS berguna saat memverifikasi bahwa konfigurasi yang benar telah diaktifkan.

Proses penghentian xt_qtaguid lama

Alat eBPF baru menggantikan modul xt_qtaguid dan modul xt_owner yang menjadi dasarnya. Kita akan mulai menghapus modul xt_qtaguid dari kernel Android dan menonaktifkan konfigurasi yang tidak diperlukan.

Dalam rilis Android 9, modul xt_qtaguid diaktifkan di semua perangkat, tetapi semua API publik yang langsung membaca file proc modul xt_qtaguid dipindahkan ke Layanan NetworkManagement. Bergantung pada versi kernel perangkat dan API level pertama, Layanan NetworkManagement mengetahui apakah alat eBPF diaktifkan dan memilih modul yang tepat untuk diperoleh setiap statistik penggunaan jaringan aplikasi. Aplikasi dengan SDK level 28 dan yang lebih tinggi diblokir agar tidak mengakses file proc xt_qtaguid oleh sekebijakan.

Dalam rilis Android berikutnya setelah 9, akses aplikasi ke file proc xt_qtaguid tersebut akan sepenuhnya diblokir. Kami akan mulai menghapus modul xt_qtaguid dari kernel umum Android baru. Setelah dihapus, kami akan mengupdate konfigurasi dasar Android untuk versi kernel tersebut agar secara eksplisit menonaktifkan modul xt_qtaguid. Modul xt_qtaguid tidak akan sepenuhnya tidak digunakan lagi jika persyaratan versi kernel minimum untuk rilis Android adalah 4.9 atau yang lebih tinggi.

Dalam rilis Android 9, hanya perangkat yang diluncurkan dengan rilis Android 9 yang diwajibkan untuk memiliki fitur eBPF baru. Untuk perangkat yang dikirimkan dengan kernel yang dapat mendukung alat eBPF, sebaiknya update ke fitur eBPF baru saat mengupgrade ke rilis Android 9. Tidak ada uji CTS untuk menerapkan update tersebut.

Validasi

Anda harus secara rutin mengambil patch dari kernel umum Android dan versi utama AOSP Android. Pastikan penerapan Anda lulus pengujian VTS dan CTS yang berlaku, netd_unit_test, dan libbpf_test.

Pengujian

Ada kernel net_tests untuk memastikan Anda telah mengaktifkan fitur yang diperlukan dan patch kernel yang diperlukan di-backport. Pengujian ini terintegrasi sebagai bagian dari pengujian VTS rilis Android 9. Ada beberapa pengujian unit di system/netd/ (netd_unit_test dan libbpf_test). Ada beberapa pengujian di netd_integration_test untuk memvalidasi perilaku keseluruhan alat baru ini.

Pemverifikasi CTS dan CTS

Karena kedua modul pemantauan traffic didukung dalam rilis Android 9, tidak ada pengujian CTS untuk memaksa penerapan modul baru di semua perangkat. Namun, untuk perangkat dengan versi kernel yang lebih tinggi dari 4.9 yang awalnya disertakan dengan rilis Android 9 (yaitu level API pertama >= 28), ada pengujian CTS pada GSI untuk memvalidasi modul baru yang dikonfigurasi dengan benar. Pengujian CTS lama seperti TrafficStatsTest, NetworkUsageStatsTest, dan CtsNativeNetTestCases dapat digunakan untuk memverifikasi perilaku agar konsisten dengan modul UID lama.

Pengujian manual

Ada beberapa pengujian unit di system/netd/ (netd_unit_test, netd_integration_test dan libbpf_test). Ada dukungan dumpsys untuk memeriksa status secara manual. Perintah dumpsys netd menampilkan status dasar modul trafficController dan apakah eBPF diaktifkan dengan benar. Jika eBPF diaktifkan, perintah dumpsys netd trafficcontroller akan menampilkan konten mendetail dari setiap peta eBPF, termasuk informasi soket bertag, statistik per tag, UID dan antarmuka, serta kecocokan UID pemilik.

Lokasi pengujian

Tes CTS dapat ditemukan di:

Pengujian VTS terletak di https://android.googlesource.com/kernel/tests/+/main/net/test/bpf_test.py.

Pengujian unit terletak di: