eBPF ağ trafiği aracı, cihazın son başlatılmasından bu yana cihazdaki ağ kullanımını izlemek için çekirdek ve kullanıcı alanı uygulamalarının bir kombinasyonunu kullanır. Soket etiketleme, ön plan/arka plan trafiğini ayırma ve telefon durumuna bağlı olarak uygulamaların ağ erişimini engellemek için UID başına güvenlik duvarı gibi ek işlevler sağlar. Araçtan toplanan istatistikler eBPF maps
adlı bir çekirdek veri yapısında depolanır ve sonuç, son başlatmadan bu yana kalıcı trafik istatistikleri sağlamak için NetworkStatsService
gibi hizmetler tarafından kullanılır.
Örnekler ve kaynak
Kullanıcı alanı değişiklikleri çoğunlukla system/netd
ve framework/base
projelerindedir. AOSP'de geliştirme çalışmaları devam ettiğinden AOSP kodu her zaman güncel olur. Kaynak çoğunlukla system/netd/server/TrafficController*
, system/netd/bpfloader
ve system/netd/libbpf/
adresinde bulunur.
Gerekli bazı çerçeve değişiklikleri framework/base/
ve system/core
'te de yapılmıştır.
Uygulama
Android 9'dan itibaren, çekirdek 4.9 veya sonraki bir sürümde çalışan ve orijinal olarak P sürümü ile birlikte gönderilen Android cihazlar xt_qtaguid
yerine eBPF tabanlı ağ trafiği izleme muhasebesini KULLANMAK ZORUNDADIR. Daha esnek ve daha sürdürülebilir olan yeni altyapı, ağaç dışı çekirdek kodu gerektirmez.
Eski ve eBPF trafik izleme arasındaki temel tasarım farklılıkları Şekil 1'de gösterilmektedir.
Şekil 1. Eski (sol) ve eBPF (sağ) trafik izleme tasarımı farklılıkları
Yeni trafficController
tasarımı, çekirdek içindeki xt_bpf
netfilter modülünün yanı sıra cgroup
başına eBPF filtresini temel alır. Bu eBPF filtreleri, filtreden geçerken paket tx/rx'ye uygulanır. cgroup
eBPF filtresi, taşıma katmanında bulunur ve soket UID'sine ve kullanıcı alanı ayarına bağlı olarak trafiği doğru UID'ye göre saymaktan sorumludur.
xt_bpf
netfilter, bw_raw_PREROUTING
ve bw_mangle_POSTROUTING
zincirine bağlanır ve trafiği doğru arayüzde saymaktan sorumludur.
Kullanıcı alanı işlemi trafficController
, önyükleme sırasında veri toplama için kullanılan eBPF haritalarını oluşturur ve tüm haritaları sys/fs/bpf
adresinde sanal bir dosya olarak sabitler.
Ardından ayrıcalıklı bpfloader
işlemi, önceden derlenmiş eBPF programını çekirdeğe yükler ve doğru cgroup
'a ekler. Tüm trafik için tek bir kök cgroup
olduğundan tüm işlem varsayılan olarak bu cgroup
'e dahil edilmelidir.
Çalışma zamanında trafficController
, traffic_cookie_tag_map
ve traffic_uid_counterSet_map
e-posta adreslerine yazarak bir yuvayı etiketleyebilir/etiketini kaldırabilir. NetworkStatsService
, traffic_tag_stats_map
, traffic_uid_stats_map
ve traffic_iface_stats_map
'daki trafik istatistikleri verilerini okuyabilir.
trafficController
ve cgroup
eBPF filtresi, trafik istatistikleri toplama işlevinin yanı sıra telefon ayarlarına bağlı olarak belirli UID'lerden gelen trafiği engellemekten de sorumludur. UID tabanlı ağ trafiği engelleme özelliği, çekirdekteki xt_owner
modülünün yerini alır ve ayrıntı modu, traffic_powersave_uid_map
, traffic_standby_uid_map
ve traffic_dozable_uid_map
'e yazarak yapılandırılabilir.
Yeni uygulama, eski xt_qtaguid
modülü uygulamasını takip eder. Bu nedenle TrafficController
ve NetworkStatsService
, eski veya yeni uygulamayla çalışır. Uygulama herkese açık API'ler kullanıyorsa arka planda xt_qtaguid
veya eBPF araçlarının kullanılması herhangi bir fark oluşturmaz.
Cihaz çekirdeği Android ortak çekirdeği 4.9'u (SHA 39c856663dcc81739e52b02b77d6af259eb838f6 veya üzeri) temel alıyorsa yeni eBPF aracını uygulamak için HAL'lerde, sürücülerde veya çekirdek kodunda herhangi bir değişiklik yapılması gerekmez.
Şartlar
Çekirdek yapılandırmasında aşağıdaki yapılandırmalar AÇIK OLMALIDIR:
CONFIG_CGROUP_BPF=y
CONFIG_BPF=y
CONFIG_BPF_SYSCALL=y
CONFIG_NETFILTER_XT_MATCH_BPF=y
CONFIG_INET_UDP_DIAG=y
VTS çekirdek yapılandırma testi, doğru yapılandırmanın etkinleştirildiğini doğrulamada faydalıdır.
Eski xt_qtaguid özelliğinin kullanımdan kaldırılma süreci
Yeni eBPF aracı, xt_qtaguid
modülünün ve temel aldığı xt_owner
modülünün yerini alıyor. xt_qtaguid
modülünü Android çekirdeğinden kaldırmaya ve gereksiz yapılandırmalarını devre dışı bırakmaya başlayacağız.
Android 9 sürümünde xt_qtaguid
modülü tüm cihazlarda etkinleştirilir ancak doğrudan xt_qtaguid
modülü proc dosyasını okuyan tüm herkese açık API'ler NetworkManagement
Hizmeti'ne taşınır.
Cihaz çekirdek sürümüne ve ilk API düzeyine bağlı olarak NetworkManagement
Hizmeti, eBPF araçlarının etkin olup olmadığını bilir ve her uygulamanın ağ kullanımı istatistikleri için alınacak doğru modülü seçer. SDK düzeyi 28 ve üzeri olan uygulamaların xt_qtaguid
proc dosyalarına erişmesi sepolicy tarafından engellenir.
9 sürümünden sonraki Android sürümünde, bu xt_qtaguid
proc dosyalarına uygulama erişimi tamamen engellenecek. xt_qtaguid
modülünü yeni Android ortak çekirdeklerinden kaldırmaya başlayacağız. Kaldırıldıktan sonra, ilgili çekirdek sürümünün Android temel yapılandırmasını güncelleyerek xt_qtaguid
modülünü açıkça devre dışı bırakacağız. Android sürümü için minimum çekirdek sürümü gereksinimi 4.9 veya daha yeni olduğunda xt_qtaguid
modülünün desteği tamamen sonlandırılacak.
Android 9 sürümünde, yalnızca Android 9 sürümüyle kullanıma sunulan cihazların yeni eBPF özelliğine sahip olması gerekir. eBPF araçlarını destekleyebilecek bir çekirdekle birlikte gönderilen cihazlarda, Android 9 sürümüne yükseltme yaparken çekirdeği yeni eBPF özelliğiyle güncellemenizi öneririz. Bu güncellemeyi zorunlu kılacak bir CTS testi yoktur.
Doğrulama
Android ortak çekirdeklerinden ve Android AOSP ana sürümünden düzenli olarak yamalar almanız gerekir. Uygulamanızın geçerli VTS ve CTS testlerini, netd_unit_test
ve libbpf_test
'yi geçtiğinden emin olun.
Test
Gerekli özelliklerin etkinleştirildiğinden ve gerekli çekirdek yamalarının geri bağlandığından emin olmak için kernel net_tests vardır. Testler, Android 9 sürüm VTS testleri kapsamında entegre edilmiştir. system/netd/
bölümünde (netd_unit_test
ve libbpf_test
) bazı birim testleri vardır. netd_integration_test
bölümünde, yeni aracın genel davranışını doğrulamak için bazı testler vardır.
CTS ve CTS doğrulayıcısı
Android 9 sürümünde her iki trafik izleme modülü de desteklendiğinden, yeni modülün tüm cihazlarda uygulanmasını zorunlu kılacak bir CTS testi yoktur. Ancak, orijinal olarak Android 9 sürümüyle birlikte gönderilen ve çekirdek sürümü 4.9'dan yüksek olan cihazlarda (ör. ilk API seviyesi >= 28), yeni modülün doğru şekilde yapılandırıldığını doğrulamak için GSI'de CTS testleri vardır. Davranışın eski UID modülüyle tutarlı olduğunu doğrulamak için TrafficStatsTest
, NetworkUsageStatsTest
ve CtsNativeNetTestCases
gibi eski CTS testleri kullanılabilir.
Manuel test
system/netd/
'te (netd_unit_test
,
netd_integration_test
ve
libbpf_test
) bazı birim testleri vardır.
Durumu manuel olarak kontrol etmek için dumpsys desteği vardır. dumpsys netd
komutu, trafficController
modülünün temel durumunu ve eBPF'nin doğru şekilde açılıp açılmadığını gösterir. eBPF etkinse dumpsys netd trafficcontroller
komutu, etiketli soket bilgileri, etiket başına istatistikler, UID ve arabirimi ve sahip UID eşleşmesi dahil olmak üzere her eBPF haritasının ayrıntılı içeriğini gösterir.
Test konumları
CTS testleri şu adreslerde bulunur:
- 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
VTS testleri https://android.googlesource.com/kernel/tests/+/main/net/test/bpf_test.py adresinde yer alır.
Birim testleri şu konumdadır:
- https://android.googlesource.com/platform/system/netd/+/main/libbpf/BpfNetworkStatsTest.cpp
- https://android.googlesource.com/platform/system/netd/+/main/server/TrafficControllerTest.cpp