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. Geliştirme AOSP'de yapıldığından AOSP kodu her zaman günceldir. Kaynak temel olarak system/netd/server/TrafficController*
, system/netd/bpfloader
ve system/netd/libbpf/
adreslerinde 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üyle birlikte gönderilen Android cihazlar xt_qtaguid
yerine eBPF tabanlı ağ trafiği izleme muhasebesini KULLANMAK ZORUNDADIR. Yeni altyapı daha esnek ve daha kolay yönetilebilirdir ve ağa bağlı olmayan çekirdek kodu gerektirmez.
Eski ve eBPF trafik izleme arasındaki temel tasarım farklılıkları Şekil 1'de gösterilmektedir.
Şekil 1. Eski (solda) ve eBPF (sağda) trafik izleme tasarımı farklılıkları
Yeni trafficController
tasarımı, çekirdekteki cgroup
eBPF filtresine ve xt_bpf
netfilter modülüne dayanı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
adreslerine yazarak bir soketi etiketleyebilir/etiketlerini 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ğrularken 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'dan sonraki bir sonraki Android sürümünde, bu xt_qtaguid
proc dosyalarına uygulama erişimi tamamen engellenecek ve xt_qtaguid
modülü yeni Android ortak çekirdeklerinden kaldırılmaya başlanacak. 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ünün 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 (ör. ilk API seviyesi >= 28) ve çekirdek sürümü 4.9'dan yüksek olan cihazlarda, 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 adreste 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 bulunur.
Birim testleri şu konumlarda bulunur:
- https://android.googlesource.com/platform/system/netd/+/main/libbpf/BpfNetworkStatsTest.cpp
- https://android.googlesource.com/platform/system/netd/+/main/server/TrafficControllerTest.cpp