eBPF ağ trafiği aracı, son cihaz yeniden başlatma işleminden bu yana cihazdaki ağ kullanımını izlemek için çekirdek ve kullanıcı alanı uygulamasının bir kombinasyonunu kullanır. Soket etiketleme, ön plan/arka plan trafiğini ayırma ve uygulamaların telefon durumuna bağlı olarak ağ erişimini engellemek için UID başına güvenlik duvarı gibi ek işlevler sunar. 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 temel olarak system/netd
ve framework/base
projelerinde yapılmıştır. Geliştirme AOSP'de yapıldığından AOSP kodu her zaman güncel olacaktır. Kaynak esas olarak system/netd/server/TrafficController*
, system/netd/bpfloader
ve system/netd/libbpf/
konumlarında bulunur.
Gerekli bazı çerçeve değişiklikleri framework/base/
ve system/core
'de de yapılmıştır.
Uygulama
Android 9'dan itibaren, çekirdek 4.9 veya sonraki sürümlerin yüklü olduğu ve ilk olarak P sürümüyle gönderilen Android cihazlar, xt_qtaguid
yerine eBPF tabanlı ağ trafiği izleme muhasebesini KULLANMALIDIR. Yeni altyapı daha esnek ve daha sürdürülebilir olup ağaç dışı çekirdek kodu gerektirmez.
Eski ve eBPF trafik izleme arasındaki temel tasarım farklılıkları Şekil 1'de gösterilmektedir.
1. şekil. Eski (sol) ve eBPF (sağ) trafik izleme tasarımı arasındaki farklar
Yeni trafficController
tasarım, çekirdeğin içindeki cgroup
eBPF filtresinin yanı sıra xt_bpf
netfilter modülünü de temel alır. Bu eBPF filtreleri, paketin filtreden geçerken gönderilmesi/alınması sırasında uygulanır. cgroup
eBPF filtresi, aktarım 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üze göre saymaktan sorumludur.
Başlatma sırasında, kullanıcı alanı süreci trafficController
veri toplama için kullanılan eBPF haritalarını oluşturur ve tüm haritaları sys/fs/bpf
konumunda sanal dosya olarak sabitler.
Ardından ayrıcalıklı işlem bpfloader
, önceden derlenmiş eBPF programını çekirdeğe yükler ve doğru cgroup
'ye ekler. Tüm trafik için tek bir kök cgroup
olduğundan tüm işlemler varsayılan olarak bu cgroup
'ya dahil edilmelidir.
Çalışma zamanında trafficController
, traffic_cookie_tag_map
ve traffic_uid_counterSet_map
adreslerine yazarak bir soketi etiketleyebilir/etiketini kaldırabilir. NetworkStatsService
, traffic_tag_stats_map
, traffic_uid_stats_map
ve traffic_iface_stats_map
ürünlerindeki trafik istatistikleri verilerini okuyabilir.
Trafik istatistikleri toplama işlevinin yanı sıra trafficController
ve cgroup
eBPF filtresi de telefon ayarlarına bağlı olarak belirli UID'lerden gelen trafiği engellemekten sorumludur. UID'ye dayalı ağ trafiği engelleme özelliği, çekirdeğin içindeki 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
yazılarak yapılandırılabilir.
Yeni uygulama, eski xt_qtaguid
modülü uygulamasını takip ettiğinden 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ı arasında herhangi bir fark olmamalıdır.
Cihaz çekirdeği, Android ortak çekirdeği 4.9'a (SHA 39c856663dcc81739e52b02b77d6af259eb838f6 veya üzeri) dayanı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 şu yapılandırmalar etkinleştirilmelidir:
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ğrulamak için yararlıdır.
Eski xt_qtaguid desteğini sonlandırma süreci
Yeni eBPF aracı, xt_qtaguid
modülünün ve dayandığı 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
hizmetine 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 uygulama ağı kullanım istatistiği için doğru modülü seçer. SDK düzeyi 28 ve üzeri olan uygulamaların, xt_qtaguid
proc dosyalarına erişimi sepolicy tarafından engellenir.
9'dan 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, söz konusu çekirdek sürümünün Android temel yapılandırmasını, xt_qtaguid
modülünü açıkça kapatacak şekilde güncelleyeceğiz. Android sürümü için minimum çekirdek sürümü gereksinimi 4.9 veya üzeri olduğunda xt_qtaguid
modülü tamamen kullanımdan kaldırılacaktır.
Android 9 sürümünde, yalnızca Android 9 sürümüyle kullanıma sunulan cihazlarda yeni eBPF özelliği bulunması gerekir. eBPF araçlarını destekleyebilen bir çekirdekle gönderilen cihazlarda, Android 9 sürümüne yükseltirken çekirdeği yeni eBPF özelliğine güncellemenizi öneririz. Bu güncellemeyi zorunlu kılacak bir CTS testi yoktur.
Doğrulama
Android ortak çekirdeklerinden ve Android AOSP main'den düzenli olarak yamalar almalısınız. Uygulamanızın geçerli VTS ve CTS testlerini, netd_unit_test
ve libbpf_test
geçtiğinden emin olun.
Test
Gerekli özelliklerin etkinleştirildiğinden ve gerekli çekirdek yamalarının geriye dönük olarak uygulandığından emin olmak için kernel net_testleri vardır. Testler, Android 9 sürümündeki VTS testlerine entegre edilmiştir. system/netd/
(netd_unit_test
ve
libbpf_test
) içinde bazı birim testleri vardır.
Yeni aracın genel davranışını doğrulamak için netd_integration_test
içinde bazı testler vardır.
CTS ve CTS Doğrulayıcı
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ılan bir CTS testi yoktur. Ancak, çekirdek sürümü 4.9'dan yüksek olan ve Android 9 sürümüyle (ör. ilk API düzeyi >= 28) birlikte gönderilen cihazlarda, yeni modülün doğru şekilde yapılandırıldığını doğrulamak için GSI'de CTS testleri bulunur. TrafficStatsTest
, NetworkUsageStatsTest
ve CtsNativeNetTestCases
gibi eski CTS testleri, davranışın eski UID modülüyle tutarlı olduğunu doğrulamak için kullanılabilir.
Manuel test
system/netd/
(netd_unit_test
,
netd_integration_test
ve
libbpf_test
) içinde bazı birim testleri vardır. Durumu manuel olarak kontrol etmek için dumpsys desteği mevcuttur. dumpsys netd
komutu, trafficController
modülünün temel durumunu ve eBPF'nin doğru şekilde etkinleştirilip etkinleştirilmediğini gösterir. eBPF etkinse komut
dumpsys netd trafficcontroller
, etiketli soket bilgileri, etiket başına istatistikler, UID ve iface ile 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 konumda bulunur:
- https://android.googlesource.com/platform/cts/+/android16-release/tests/tests/net/src/android/net/cts/TrafficStatsTest.java
- https://android.googlesource.com/platform/cts/+/android16-release/tests/tests/app.usage/src/android/app/usage/cts/NetworkUsageStatsTest.java
- https://android.googlesource.com/platform/system/netd/+/android16-release/tests/bpf_base_test.cpp
VTS testleri https://android.googlesource.com/kernel/tests/+/android16-release/net/test/bpf_test.py adresinde bulunur.
Birim testleri şu konumda bulunur: