eBPF Trafik İzleme

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.

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

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

    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ğrularken yardımcı olur.

  2. 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:

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

Birim testleri şurada bulunur: