Alat lalu lintas jaringan eBPF menggunakan kombinasi implementasi kernel dan ruang pengguna untuk memantau penggunaan jaringan pada perangkat sejak boot perangkat terakhir. Ini menyediakan fungsionalitas tambahan seperti penandaan soket, memisahkan lalu lintas latar depan/latar belakang dan firewall per-UID untuk memblokir aplikasi dari akses jaringan tergantung pada kondisi ponsel. Statistik yang dikumpulkan dari alat ini disimpan dalam struktur data kernel yang disebut eBPF maps
dan hasilnya digunakan oleh layanan seperti NetworkStatsService
untuk menyediakan statistik lalu lintas yang persisten sejak boot terakhir.
Contoh dan sumber
Perubahan ruang pengguna terutama terjadi pada proyek system/netd
dan framework/base
. Pengembangan sedang dilakukan di AOSP, sehingga kode AOSP akan selalu up to date. Sumbernya sebagian besar terletak di system/netd/server/TrafficController*
, system/netd/bpfloader
, dan system/netd/libbpf/
. Beberapa perubahan kerangka kerja yang diperlukan juga ada pada framework/base/
dan system/core
.
Penerapan
Dimulai dengan Android 9, perangkat Android yang berjalan pada kernel 4.9 atau lebih tinggi dan awalnya dikirimkan dengan rilis P HARUS menggunakan akuntansi pemantauan lalu lintas jaringan berbasis eBPF, bukan xt_qtaguid
. Infrastruktur baru ini lebih fleksibel dan lebih mudah dipelihara serta tidak memerlukan kode kernel di luar pohon.
Perbedaan desain utama antara pemantauan lalu lintas lama dan eBPF diilustrasikan pada Gambar 1.
Gambar 1. Perbedaan desain pemantauan lalu lintas lama (kiri) dan eBPF (kanan).
Desain trafficController
baru didasarkan pada filter eBPF cgroup
serta modul netfilter xt_bpf
di dalam kernel. Filter eBPF ini diterapkan pada paket tx/rx ketika melewati filter. Filter cgroup
eBPF terletak di lapisan transport dan bertanggung jawab untuk menghitung lalu lintas terhadap UID yang tepat tergantung pada UID soket serta pengaturan ruang pengguna. Netfilter xt_bpf
dihubungkan pada rantai bw_raw_PREROUTING
dan bw_mangle_POSTROUTING
dan bertanggung jawab untuk menghitung lalu lintas terhadap antarmuka yang benar.
Pada saat boot, proses userspace trafficController
membuat peta eBPF yang digunakan untuk pengumpulan data dan menyematkan semua peta sebagai file virtual di sys/fs/bpf
. Kemudian proses istimewa bpfloader
memuat program eBPF yang telah dikompilasi ke dalam kernel dan melampirkannya ke cgroup
yang benar. Ada satu cgroup
root untuk semua lalu lintas sehingga semua proses harus disertakan dalam cgroup
tersebut secara default.
Pada saat run time, trafficController
dapat memberi tag/membatalkan tag pada soket dengan menulis ke traffic_cookie_tag_map
dan traffic_uid_counterSet_map
. NetworkStatsService
dapat membaca data statistik lalu lintas dari traffic_tag_stats_map
, traffic_uid_stats_map
dan traffic_iface_stats_map
. Selain fungsi pengumpulan statistik lalu lintas, filter trafficController
dan cgroup
eBPF juga bertanggung jawab untuk memblokir lalu lintas dari UID tertentu tergantung pada pengaturan telepon. Fitur pemblokiran lalu lintas jaringan berbasis UID adalah pengganti modul xt_owner
di dalam kernel dan mode detail dapat dikonfigurasi dengan menulis ke traffic_powersave_uid_map
, traffic_standby_uid_map
dan traffic_dozable_uid_map
.
Implementasi baru mengikuti implementasi modul xt_qtaguid
lama sehingga TrafficController
dan NetworkStatsService
akan berjalan dengan implementasi lama atau baru. Jika aplikasi menggunakan API publik, tidak akan ada perbedaan apakah alat xt_qtaguid
atau eBPF digunakan di latar belakang.
Jika kernel perangkat didasarkan pada kernel umum Android 4.9 (SHA 39c856663dcc81739e52b02b77d6af259eb838f6 atau lebih tinggi), maka tidak diperlukan modifikasi pada HAL, driver, atau kode kernel untuk mengimplementasikan alat eBPF baru.
Persyaratan
Konfigurasi kernel HARUS mengaktifkan konfigurasi berikut ini:
-
CONFIG_CGROUP_BPF=y
-
CONFIG_BPF=y
-
CONFIG_BPF_SYSCALL=y
-
CONFIG_NETFILTER_XT_MATCH_BPF=y
-
CONFIG_INET_UDP_DIAG=y
Tes konfigurasi kernel VTS berguna ketika 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. Kami akan mulai menghapus modul xt_qtaguid
dari kernel Android dan menonaktifkan konfigurasi yang tidak perlu.
Dalam rilis Android 9, modul xt_qtaguid
diaktifkan di semua perangkat, namun semua API publik yang secara langsung membaca file proc modul xt_qtaguid
dipindahkan ke Layanan NetworkManagement
. Bergantung pada versi kernel perangkat dan level API pertama, Layanan NetworkManagement
mengetahui apakah alat eBPF diaktifkan dan memilih modul yang tepat untuk mendapatkan setiap statistik penggunaan jaringan aplikasi. Aplikasi dengan SDK level 28 dan lebih tinggi diblokir dari mengakses file proc xt_qtaguid
oleh sepolicy.
Pada rilis Android berikutnya setelah 9, akses aplikasi ke file proc xt_qtaguid
tersebut akan diblokir sepenuhnya. Kami akan mulai menghapus modul xt_qtaguid
dari kernel umum Android yang baru. Setelah dihapus, kami akan memperbarui konfigurasi dasar Android untuk versi kernel tersebut untuk secara eksplisit mematikan modul xt_qtaguid
. Modul xt_qtaguid
tidak akan digunakan lagi jika persyaratan versi kernel minimum untuk rilis Android adalah 4.9 atau lebih tinggi.
Pada rilis Android 9, hanya perangkat yang diluncurkan dengan rilis Android 9 yang wajib memiliki fitur eBPF baru. Untuk perangkat yang dikirimkan dengan kernel yang dapat mendukung alat eBPF, sebaiknya perbarui ke fitur eBPF baru saat memutakhirkan ke rilis Android 9. Tidak ada tes CTS untuk menerapkan pembaruan itu.
Validasi
Anda harus secara teratur mengambil patch dari kernel umum Android dan Android AOSP utama. 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-fitur yang diperlukan dan patch kernel yang diperlukan untuk di-backport. Pengujian tersebut diintegrasikan 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 alat baru secara keseluruhan.
Pemverifikasi CTS dan CTS
Karena kedua modul pemantauan lalu lintas didukung dalam rilis Android 9, tidak ada pengujian CTS yang memaksa penerapan modul baru di semua perangkat. Namun untuk perangkat dengan versi kernel lebih tinggi dari 4.9 yang awalnya dikirimkan dengan rilis Android 9 (yaitu API level pertama >= 28), terdapat pengujian CTS di 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
menunjukkan status dasar modul trafficController
dan apakah eBPF diaktifkan dengan benar. Jika eBPF diaktifkan, perintah dumpsys netd trafficcontroller
menampilkan konten detail setiap peta eBPF, termasuk informasi soket yang diberi tag, statistik per tag, UID dan iface, serta kecocokan UID pemilik.
Lokasi pengujian
Tes CTS berlokasi di:
- https://android.googlesource.com/platform/cts/+/main/tests/tests/net/src/android/net/cts/TrafficStatsTest.java
- https://android.googlesource.com/platform/cts/+/main/tests/tests/app.usage/src/android/app/usage/cts/NetworkUsageStatsTest.java
- https://android.googlesource.com/platform/system/netd/+/main/tests/bpf_base_test.cpp
Tes VTS terletak di https://android.googlesource.com/kernel/tests/+/main/net/test/bpf_test.py .
Tes unit berlokasi di: