eBPF trafik izleme

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.

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

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

  1. Çekirdek yapılandırmasında şu yapılandırmalar etkinleştirilmelidir:

    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ğ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:

VTS testleri https://android.googlesource.com/kernel/tests/+/android16-release/net/test/bpf_test.py adresinde bulunur.

Birim testleri şu konumda bulunur: