eBPF ağ trafiği aracı, son aygıt önyüklemesinden bu yana aygıttaki 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 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
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
projelerindedir. Geliştirme AOSP'de yapılıyor, dolayısıyla AOSP kodu her zaman güncel olacaktır. Kaynak esas olarak system/netd/server/TrafficController*
, system/netd/bpfloader
ve system/netd/libbpf/
konumunda bulunur. Bazı gerekli çerçeve değişiklikleri framework/base/
ve system/core
de bulunmaktadır.
Uygulama
Android 9'dan başlayarak, çekirdek 4.9 veya üzeri üzerinde çalışan ve orijinal olarak P sürümüyle birlikte gönderilen Android cihazlarının, xt_qtaguid
yerine eBPF tabanlı ağ trafiği izleme muhasebesini kullanması GEREKİR. Yeni altyapı daha esnek, 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 grup cgroup
eBPF filtresine dayanmaktadır. Bu eBPF filtreleri, filtreden geçerken tx/rx paketine uygulanır. cgroup
eBPF filtresi taşıma katmanında bulunur ve soket UID'sinin yanı sıra kullanıcı alanı ayarına bağlı olarak trafiğin doğru UID'ye göre sayılmasından sorumludur. xt_bpf
ağ filtresi bw_raw_PREROUTING
ve bw_mangle_POSTROUTING
zincirine bağlıdır ve doğru arayüze karşı trafiğin sayılmasından sorumludur.
Önyükleme sırasında, kullanıcı alanı işlemi trafficController
veri toplama için kullanılan eBPF haritalarını oluşturur ve tüm haritaları sys/fs/bpf
konumunda sanal bir dosya olarak sabitler. Daha sonra ayrıcalıklı süreç bpfloader
önceden derlenmiş eBPF programını çekirdeğe yükler ve onu doğru cgroup
ekler. Tüm trafik için tek bir kök cgroup
vardır, dolayısıyla tüm süreç varsayılan olarak bu cgroup
dahil edilmelidir.
Çalışma zamanında, trafficController
traffic_cookie_tag_map
ve traffic_uid_counterSet_map
yazarak bir soketi etiketleyebilir/etiketini kaldırabilir. NetworkStatsService
, traffic_tag_stats_map
, traffic_uid_stats_map
ve traffic_iface_stats_map
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ğin engellenmesinden 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; dolayısıyla TrafficController
ve NetworkStatsService
, eski veya yeni uygulamayla çalışacaktır. Uygulama genel API'leri kullanıyorsa arka planda xt_qtaguid
veya eBPF araçlarının kullanılması arasında herhangi bir fark yaşanmamalıdır.
Cihaz ç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ı GEREKİR:
-
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ğrulamak için faydalıdır.
-
Eski xt_qtaguid kullanımdan kaldırma süreci
Yeni eBPF aracı, temel aldığı xt_qtaguid
modülünün ve 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
Hizmetine taşınır. Cihaz çekirdeği sürümüne ve ilk API düzeyine bağlı olarak NetworkManagement
Hizmeti, eBPF araçlarının açık olup olmadığını bilir ve her uygulama ağ kullanım istatistiği için alınacak doğru modülü seçer. SDK seviyesi 28 ve üzeri olan uygulamaların xt_qtaguid
proc dosyalarına erişimi sepolicy tarafından engellenmiştir.
9'dan sonraki bir 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 o çekirdek sürümüne ilişkin 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 çekirdekle birlikte gelen cihazlar için, Android 9 sürümüne yükseltme yaparken bunu yeni eBPF özelliğine güncellemenizi öneririz. Bu güncellemeyi zorunlu kılacak bir CTS testi yoktur.
Doğrulama
Düzenli olarak Android ortak çekirdeklerinden ve Android AOSP ana yamalarından 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/
dosyasında bazı birim testleri vardır ( netd_unit_test
ve libbpf_test
). Yeni aracın genel davranışını doğrulamak için netd_integration_test
bazı testler vardır.
CTS ve CTS doğrulayıcı
Her iki trafik izleme modülü de Android 9 sürümünde desteklendiğinden, yeni modülün tüm cihazlarda uygulanmasını zorlayacak bir CTS testi yoktur. Ancak çekirdek sürümü 4.9'dan yüksek olan ve orijinal olarak Android 9 sürümüyle birlikte gelen cihazlar için (yani ilk API düzeyi >= 28), yeni modülün doğru şekilde yapılandırıldığını doğrulamak için GSI'da 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/
dosyasında 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 yerleri
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 bulunmaktadır.
Birim testleri şu adreste bulunur:
- https://android.googlesource.com/platform/system/netd/+/main/libbpf/BpfNetworkStatsTest.cpp
- https://android.googlesource.com/platform/system/netd/+/main/server/TrafficControllerTest.cpp