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.
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
Konfigurasi kernel HARUS mengaktifkan konfigurasi berikut:
CONFIG_CGROUP_BPF=y
CONFIG_BPF=y
CONFIG_BPF_SYSCALL=y
CONFIG_NETFILTER_XT_MATCH_BPF=y
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:
- 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
Pengujian VTS terletak di https://android.googlesource.com/kernel/tests/+/main/net/test/bpf_test.py.
Pengujian unit terletak di: