eBPF ağ trafiği aracı, son cihaz önyüklemesinden bu yana cihazdaki ağ kullanımını izlemek için çekirdek ve kullanıcı alanı uygulamasının bir kombinasyonunu kullanır. Telefon durumuna bağlı olarak uygulamaların ağ erişimini engellemek için soket etiketleme, ön plan/arka plan trafiğini ayırma ve UID başına güvenlik duvarı gibi ek işlevler sağlar. Araçtan toplanan istatistikler, eBPF maps
adı verilen bir çekirdek veri yapısında depolanır ve sonuç, son önyüklemeden 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 esas olarak system/netd
ve framework/base
projelerdedir. AOSP'de geliştirme yapılmaktadır, bu nedenle AOSP kodu her zaman güncel olacaktır. Kaynak esas olarak system/netd/server/TrafficController*
, system/netd/bpfloader
ve system/netd/libbpf/
. Bazı gerekli çerçeve değişiklikleri framework/base/
ve system/core
de bulunmaktadır.
uygulama
Android 9'dan itibaren, çekirdek 4.9 veya üzeri üzerinde çalışan ve orijinal olarak P sürümüyle birlikte gönderilen Android cihazları, xt_qtaguid yerine xt_qtaguid
tabanlı ağ trafiği izleme muhasebesini KULLANMALIDIR. Yeni altyapı daha esnek ve bakımı daha kolay ve herhangi bir ağaç dışı çekirdek kodu gerektirmiyor.
Eski ve eBPF trafik izleme arasındaki ana 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ı, çekirdek içindeki xt_bpf
netfilter modülünün yanı sıra cgroup
eBPF filtresini temel alır. Bu eBPF filtreleri, filtreden geçerken tx/rx paketine uygulanır. cgroup
eBPF filtresi taşıma katmanında bulunur ve kullanıcı alanı ayarının yanı sıra soket UID'sine 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ğlıdır ve doğru arabirime karşı trafiği saymaktan sorumludur.
Önyükleme sırasında, trafik denetleyicisi kullanıcı alanı işlemi, veri toplama için kullanılan trafficController
haritalarını oluşturur ve tüm haritaları sys/fs/bpf
sanal bir dosya olarak sabitler. Daha sonra ayrıcalıklı işlem bpfloader
, önceden derlenmiş eBPF programını çekirdeğe yükler ve onu doğru cgroup
. Tüm trafik için tek bir kök cgroup
vardır, bu nedenle tüm işlemler varsayılan olarak bu cgroup
dahil edilmelidir.
Çalışma zamanında, trafficController
, traffic_cookie_tag_map
ve traffic_uid_counterSet_map
öğelerine yazarak bir soketi etiketleyebilir/etiketini kaldırabilir. NetworkStatsService
, traffic_tag_stats_map
, traffic_uid_stats_map
ve traffic_iface_stats_map
gelen trafik istatistikleri verilerini okuyabilir. Trafik istatistikleri toplama işlevinin yanı sıra, trafik Denetleyicisi ve cgroup
trafficController
filtresi, telefon ayarlarına bağlı olarak belirli UID'lerden gelen trafiği engellemekten de sorumludur. UID tabanlı ağ trafiği engelleme özelliği, çekirdek içindeki xt_owner
modülünün yerine geçmiştir 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 eder, bu nedenle TrafficController
ve NetworkStatsService
eski veya yeni uygulama ile çalışır. Uygulama genel API'ler kullanıyorsa, arka planda xt_qtaguid
veya eBPF araçlarının kullanılması arasında herhangi bir fark olmamalıdır.
Aygıt çekirdeği, Android ortak çekirdeği 4.9'u (SHA 39c856663dcc81739e52b02b77d6af259eb838f6 veya üstü) 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.
Gereksinimler
Çekirdek yapılandırmasında aşağıdaki yapılandırmaların açık olması ZORUNLUDUR:
-
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 açık olduğunu doğrularken yardımcı olur.
-
Cihaz
MEM_LOCK
limiti 8 MB veya daha fazlasına AYARLANMALIDIR.
Eski xt_qtaguid kullanımdan kaldırma 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 açıktır, ancak xt_qtaguid
modülü proc dosyasını doğrudan okuyan tüm genel API'ler NetworkManagement
Service'e taşınır. Cihaz çekirdeği sürümüne ve ilk API düzeyine bağlı olarak, NetworkManagement
Service, eBPF araçlarının açık olup olmadığını bilir ve her uygulama ağı kullanım durumu için doğru modülü seçer. SDK düzeyi 28 ve üzeri olan uygulamaların xt_qtaguid proc dosyalarına erişmesi xt_qtaguid
tarafından engellenir.
9'dan 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, xt_qtaguid
modülünü açıkça kapatmak için bu çekirdek sürümü için Android temel yapılandırmasını güncelleyeceğiz. Bir 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 başlatılan cihazların yeni eBPF özelliğine sahip olması gerekir. eBPF araçlarını destekleyebilen bir çekirdeğe sahip olarak gönderilen cihazlar için, Android 9 sürümüne yükseltme yaparken yeni eBPF özelliğine güncellemenizi öneririz. Bu güncellemeyi uygulamak için bir CTS testi yoktur.
doğrulama
Düzenli olarak Android ortak çekirdeklerinden ve Android AOSP yöneticisinden 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 yapmak
Gerekli özelliklerin açık olduğundan ve gerekli çekirdek yamalarının desteklendiğinden emin olmak için çekirdek net_testleri vardır. Testler, Android 9 sürümü VTS testlerinin bir parçası olarak entegre edilmiştir. system/netd/
içinde bazı birim testleri vardır ( netd_unit_test
ve libbpf_test
). 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ü tüm cihazlarda uygulamaya zorlamak için herhangi bir CTS testi yoktur. Ancak, orijinal olarak Android 9 sürümüyle birlikte gelen 4.9'dan daha yüksek çekirdek sürümüne sahip cihazlar için (yani ilk API seviyesi >= 28), yeni modülün doğru şekilde yapılandırıldığını doğrulamak için GSI üzerinde CTS testleri vardır. 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/
içinde bazı birim testleri vardır ( netd_unit_test
, netd_integration_test
ve libbpf_test
). 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 açıksa, dumpsys netd trafficcontroller
komutu, etiketli soket bilgileri, etiket başına istatistikler, UID ve iface 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/+/master/tests/tests/net/src/android/net/cts/TrafficStatsTest.java {: .external}
- https://android.googlesource.com/platform/cts/+/master/tests/tests/app.usage/src/android/app/usage/cts/NetworkUsageStatsTest.java {: .external}
- https://android.googlesource.com/platform/system/netd/+/master/tests/bpf_base_test.cpp {: .external}
VTS testleri https://android.googlesource.com/kernel/tests/+/master/net/test/bpf_test.py adresinde bulunur.
Birim testleri şurada bulunur:
- https://android.googlesource.com/platform/system/netd/+/master/libbpf/BpfNetworkStatsTest.cpp {: .external}
- https://android.googlesource.com/platform/system/netd/+/master/server/TrafficControllerTest.cpp {: .external}