eBPF trafik izleme

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.

Eski ve eBPF trafik izleme tasarım farklılıkları

Ş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

  1. Çekirdek yapılandırmasında aşağıdaki yapılandırmaların açık olması GEREKİR:

    1. CONFIG_CGROUP_BPF=y
    2. CONFIG_BPF=y
    3. CONFIG_BPF_SYSCALL=y
    4. CONFIG_NETFILTER_XT_MATCH_BPF=y
    5. 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:

VTS testleri https://android.googlesource.com/kernel/tests/+/main/net/test/bpf_test.py adresinde bulunmaktadır.

Birim testleri şu adreste bulunur: