eBPF trafik izleme

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. AOSP'de geliştirme çalışmaları devam ettiğinden AOSP kodu her zaman güncel olur. Kaynak çoğunlukla system/netd/server/TrafficController*, system/netd/bpfloader ve system/netd/libbpf/ adresinde 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ü ile birlikte gönderilen Android cihazlar xt_qtaguid yerine eBPF tabanlı ağ trafiği izleme muhasebesini KULLANMAK ZORUNDADIR. Daha esnek ve daha sürdürülebilir olan yeni altyapı, ağaç dışı çekirdek kodu gerektirmez.

Eski ve eBPF trafik izleme arasındaki temel tasarım farklılıkları Şekil 1'de gösterilmektedir.

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

Şekil 1. Eski (sol) ve eBPF (sağ) 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 başına eBPF filtresini temel alı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 e-posta adreslerine yazarak bir yuvayı etiketleyebilir/etiketini 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

  1. Çekirdek yapılandırmasında aşağıdaki yapılandırmalar AÇIK OLMALIDIR:

    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 etkinleştirildiğini doğrulamada 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 sürümünden 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, 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 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 ve çekirdek sürümü 4.9'dan yüksek olan cihazlarda (ör. ilk API seviyesi >= 28), 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 adreslerde bulunur:

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

Birim testleri şu konumdadır: