BSD Paket Filtresi

BPF ( Berkeley paket filtresi ) ya da BSD paket filtresi , enjekte minimalist kodu çekirdek , kullanıcı çekirdek filtre ağı gerçekleştirmesini sağlar. Farklı versiyonları sırasında (Örnek: eBPF (Berkeley Packet Filter'ı genişlet)), BPF programlarının üretimini kolaylaştırmak için yeni araçlar uygulandı. Ayrıca çekirdekte olay izleme ve izleme gibi yeni kullanım alanları da kullanılabilir hale geldi. Bu güne kadar, özellikle denetçi düzeyinde çeşitli sorunlar hala mevcuttur.

Tanım

Orijinal olarak 1992'de tasarlanan BPF, kullanıcı alanından çekirdeğe enjekte edilen minimalist ikili koddur . Kullanıcının, çekirdekte dolaşan paketleri kullanıcı alanına aktarmak zorunda kalmadan filtrelemesine olanak tanır. Bununla birlikte, minimalist yönü nedeniyle az sayıda talimata sahiptir, ayrıca programlama zorluğu, tcpdump gibi az sayıda uygulama tarafından kullanıldığı anlamına gelir. 2013 yılında, Alexei Starovoitov (Facebook'ta çekirdek konusunda uzmanlaşmış yazılım mühendisi), yeni özellikler ekleyerek ve performansını artırarak BPF'yi tamamen elden geçirdi. Bu yeni sürüm, önceki sürümü belirten cBPF'nin (klasik BPF) aksine eBPF olarak adlandırılır. Bu yeni dil, iki uygulama alanına ayrılabilen daha çeşitli kullanım senaryoları tasarlamayı mümkün kılıyor. İlk alan çekirdek izleme ve izleme, ikincisi ise ağ programlamadır.

Kullanım durumu

İzleme, kapsayıcı güvenlik duvarı filtreleme veya ağ oluşturma, yuva filtreleme, paket filtreleme ve trafik denetimi gibi birden çok kullanım durumu vardır . Ağ yığınının en alt seviyesinde, yani doğrudan ağ arayüz kartının sürücüsü tarafından filtreleme yapmak da mümkündür. Böylece paketler çok erken atılabilir; örneğin XDP (Hızlı Veri Yolu), hizmet reddi saldırılarının önlenmesi için kullanılabilecek eBPF kullanan bir projedir . Ek olarak, BPF'ler sanal makinelerdeki uygulamalar için ağ performansının verimli ve esnek bir şekilde izlenmesine olanak tanır , buna bir örnek vNetTracer çerçevesidir.

GMP'leri kullanan projelerin kapsamlı olmayan bir listesi:

İzleme / İzleme:

Bpftrace Linux Berkeley Paket Filtrelerini (eBPF) geliştirmek için üst düzey bir çizici dildir, linux çekirdeğinin son sürümlerinde mevcuttur (yani sürüm 4.x'ten beri). Ek olarak bpftrace, komut dosyalarını derlemek için LLVM'yi ve linux BPF sistemiyle etkileşim kurmak için BCC'yi kullanır. mükemmel Linux çekirdek geliştirme topluluğu tarafından geliştirilmiş bir sistem performans analiz aracıdır. kat libc dışında hiçbir bağımlılığı olmayan hafif bir dinamik izleme aracıdır. x86_64 arch64, arm ve powerpc mimarilerini destekler. Kat betiklerini bir BPF programında derler ve C'ye benzer bir sözdizimi kullanır. Sistem sekmesi veri toplamak için yeniden derleme, kurulum ve yeniden başlatma rutinini atlamanıza izin veren GPL kapsamında lisanslanmış bir izleme / araştırma aracıdır . Bir komut satırı arayüzünün yanı sıra bir komut dosyası diline sahiptir. PCP "Performans Yardımcı Pilot" anlamına gelir. Bir sistemin canlı ve geriye dönük analizini sağlayan olgun, genişletilebilir, platformlar arası bir araç setidir. Örgü Kapsamı bir Docker kapsayıcısını gerçek zamanlı olarak izlemek ve kontrol etmek için bir araçtır. Metrikler, etiketler ve kapsayıcı meta verileri hakkında bir görünüm sunar; konteynerleri yönetmenin yanı sıra.


ağ iletişimi:

silyum uygulama kapsayıcıları veya süreçleri arasında ağ ve yük dengeleme bağlantıları sağlayan ve güvenliğini sağlayan açık kaynaklı yazılımdır. Kubernetes ve Mesos düzenleme çerçevelerine entegre edilmiştir . suricata bir ağ saldırı tespit sistemi, bir saldırı önleme sistemi ve bir ağ güvenlik kontrol cihazıdır. sistem linux çekirdeğinde sistem yönetimi için bir dizi programdır. Iproute2 linux çekirdeğindeki ağları kontrol etmek ve izlemek için yardımcı programlar sağlayan açık kaynaklı bir yazılımdır. P4c-xdp XDP için bir P4 kod arka uç derleyicisidir.


Diğerleri:

LLVM eBPF programında bir C kodu derleyicisidir. gizli BPF Derleyici Koleksiyonu'nun kısaltması, çekirdeğin izlenmesi ve işlenmesi için verimli programlar yazmaya yönelik bir araç takımıdır. Ek olarak BCC, çekirdeğin C'de ve ön uçlarının Python ve lua'da enstrümantasyonu ile BPF programlarının yazılmasını kolaylaştırır . libbpf BPF programlarının LLVM tarafından üretilen ELF formatında çekirdeğe yüklenmesine izin veren bir BPF kütüphanesidir. Bpftool eBPF programlarının denetimi ve manipülasyonu için bir araçtır. Gobpf BCC araç setinin GO kodundan eBPF programları üretmesine izin veren bir GO kitaplığıdır . Ebpf_asm Intel'inkine benzer bir sözdiziminde yazılmış eBPF programları için bir derleyicidir.

Teknik operasyon

BPF, paket analizinde kullanılan kriterleri ve ayrıca ağaç modeli ifadelerindeki performansı için CFG kontrol akış grafiklerini kullanır . Ek olarak, bu grafikler BPF tarafından, bir paketin analizinin yanı sıra gereksiz karşılaştırmalar için gereksiz CFG yollarını etkili bir şekilde azaltmayı mümkün kılan filtreleme kurallarını ayarlamak için kullanılır. Sistem çağrıları ile yapılan veri aktarımı, çekirdek ve kullanıcı alanı arasında çift yönlü olarak yapılır. Bunlar, eBPF ikili kodunun çekirdeğe enjeksiyonunun uygun şekilde ilerlemesine ve ayrıca hedef çekirdekten bir kullanıcı alanı sürecine veri iletişimine izin verir. BPF programı tarafından ilişkilendirilen paketler , kullanıcı alanına aktarılmadan önce kısmen bir arabelleğe kopyalanır . BPF, programın arabelleğe kopyalanacak paketin bayt sayısını tanımlamasına izin verir. Bu, gereksiz verilerin kopyalanmasını önleyerek zaman kazandırır. Örneğin TCP/IP/Ethernet paketleri için 134 bayt yeterlidir. TCP çerçeveleri üzerinde istatistik yapmak isteyen bir program, çerçevelerin sadece bir kısmını kopyalayabilecek ve böylece yürütme süresinden tasarruf edebilecektir.

eBPF, BPF'nin birkaç yönden farklı olan bir uzantısıdır: programların yüklenmesi kullanıcı tarafından yapılır ve programın çalıştırılmasının güvenli olduğundan emin olmak için bir programın sonlandırılmasında bir kontrol yapılır. eBPF'nin getirdiği en son uzantı, paylaşılan veri yapılarına erişim yeteneğidir. Aslında, bu verileri paylaşmak için eBPF üç farklı mekanizma kullanır:

Linux çekirdeğinin 3.15 sürümünden bu yana, eBPF sanal makine işlevleri, temel talimatlar ve yeni eBPF işlevselliğinin tanıtılması yoluyla bağlantı katmanı erişimi sağlar, bu, bir filtreleme ve filtreleme aracı oluşturur.Ağ paketlerini analiz edin. Ancak eBPF programları, ağ yığınının farklı katmanlarında çağrılabilir ve bu da yakalanan paketlerin bir sonraki katmana geçmeden önce işlenmesine olanak tanır. EBPF, uzantı çekirdeğe yüklendiğinde yerel CPU yönergelerinde derlenen ikili koda dayanır. Java gibi klasik bayt kodunun aksine, eBPF'nin derleyicisi ve yürütme süresi herhangi bir tür veya bellek güvenliği sağlamaz. Bunun yerine güvenlik, programın çekirdek veri yapılarına erişemeyeceğini veya sayfa hatalarına neden olamayacağını doğrulayan statik bir doğrulayıcı tarafından artırılır.

Çekirdekte kod yürütüldüğünde güvenlik ve kararlılık riskleri mevcuttur. Bu riskleri azaltmak için BPF, bir programı güvenli bir şekilde yürütmek için bir yorumlayıcıya güvenir. Bu riskleri azaltmak için eBPF, her programın çekirdeğe yüklenmeden önce belirli koşulları karşılamasını sağlayan ve böylece doğrulama süresinde yüksek maliyetten kaçınan bir Linux doğrulayıcı sunar. Programın sonlandırılabilmesini, çekirdeğin çökmesine neden olabilecek bir döngü içermemesini veya belirli talimatlara erişilemez olmasını sağlar. Ve başka bir zamanda, yazmaçların ve pillerin durumunun geçerli olduğundan emin olmak için her talimatı kontrol eder ve simüle eder, böylece belleğe veya tahsis edilen alan dışındaki çekirdeğin durumuna erişimi engeller. . eBPF uygulaması, çekirdek için güvenli ve emniyetli olmasını sağlar, aynı zamanda, çekirdeği izleme ve ağ oluşturma gibi çekirdekte farklı işler kurma imkanı sunar.

Sistem çağrıları ikili kodun yüklenmesine izin verir. Yüklemenin başarılı olması için programın eBPF doğrulayıcısı tarafından doğrulanması gerekir. EBPF programları, farklı kancalarda bile aynı anda başlatılabilir. Böylece tek tek veya zincirleme olarak çalışabilirler.

Ağlar

Bir BPF programı bir arabirimde dinliyor olabilir, bu olduğunda arabirim sürücüsü önce bu programı çağırır. BPF daha sonra paketleri işlemeye katılan her filtreye dağıtır. Kullanıcı tanımlı filtreler daha sonra paketlere uygulanır ve paketin kabul edilip edilmeyeceğine ve her paketin kaç baytının kaydedilmesi gerektiğine karar verir. Paketi kabul eden her filtre için BPF, ilişkilendirilecek arabellek olarak istenen miktarda veriyi kopyalar. bu filtre. Topoloji değişiklikleri veya uygulamalarda bir değişiklik meydana geldiğinde, filtrelerden etkilenen portları ve adresleri ekleyebilmek, silebilir veya değiştirebilmek için güvenlik duvarı görevi gören kuralların değiştirilmesi gerekli hale gelir. Bunu yapmak için, C programını basit tutan bitmap stratejisi sayesinde, sadece yeni haritalarla yeni bir program oluşturun ve haritayı yeni anahtar/değer çiftleriyle yükleyin ve eski programla değiştirin, böylece davranışı taklit edin. iptables-restore.

Araçlar

Jit derlemesi

Filtreler, yorumlayıcılı bir çekirdekte bayt kodu olarak yorumlanır. Bunun yokluğunda, eBPF, eBPF tarafından üretilen bayt kodlarını yerel koda çevirmek ve isteğe bağlı makineye bağlı optimizasyonları gerçekleştirmek için çekirdeğin anında derleyicisini (JIT derleyicisi) kullanabilir.

LLVM

Clang (yerel LLVM), kullanıcının C kodunu bir ELF dosyasındaki bir eBPF talimatında derlemesine olanak tanır.

gizli

eBPF talimatında programlama karmaşık olabilir. Bu nedenle, kullanıcının kolayca eBPF programları oluşturmasını sağlayan BPF Derleyici Koleksiyonu (BCC) adlı bir araç takımı mevcuttur. BCC, kullanıcıya eBPF haritalarını C kodunda tanımlama ve bu C kodunu bir eBPF programında derleme yeteneği sağlamak için LLVM'yi kapsar ve geliştirir.

Talimatlar

BPF + sanal makinesinin 5 çalışma sınıfı vardır:

İyileştirmeler ve sınırlamalar

2019'da geliştirici için hala aşağıdakiler gibi çeşitli sorunlar ortaya çıkıyor:

Çekirdek hizmetlerinin kullanımında kısıtlamalar vardır, birkaç yardımcı işlev vardır ve eBPF programlarında hiçbir kullanıcı alanı veya üçüncü taraf hizmetleri kullanılamaz. Belirli kısıtlamalar, program denetimlerini esnek hale getirir ve dinamik ayırma yapamama, çekirdek veri yapılarına erişememe, çekirdek API'lerini çağırma veya atlama talimatları gibi sistem bütünlüğüne izin verir. Bunun yanı sıra, tek bir iş parçacığı üzerinde yürütüldüğü ve bu nedenle talimat sayısına bağlı bir yürütme süresine sahip olduğu gerçeği.

BPF performansı

cGMP , toplam performansını aynı donanım üzerinde çalışan NIT (Network Interface Tap ) SUN'den 100 kata kadar daha hızlı yapan bir uygulama stratejisi arabelleği kullanır . BPF'ye yapılan bir çağrının yürütme süresi, tüm paketleri atan bir filtre için paket başına yaklaşık 6 mikrosaniyedir. EBPF'ler, bazı ağ filtreleme mikro kıyaslamaları için cBPF uygulamasından x86_64 mimarilerinde 4 kata kadar daha hızlıdır ve çoğu, 1,5 kat daha hızlıdır. IPTABLES ve NFTABLES ile karşılaştırıldığında eBPF'lerde 10 kat performans artışı vardır.

Ön Çekirdek (XDP)

Ağ yığınının en alt seviyesine bağlı olan XDP, hizmet reddi saldırılarını önleme gibi kaba paket filtreleme için uygundur . Çekirdekteki benzer bir göreve kıyasla dört kat daha fazla performans üretebilir. Ayrıca XDP, JIT'de (Tam Zamanında) kod derlemeyi kullanarak medyan gecikme süresinde iyileştirmeler sunar ve daha yüksek aykırı gecikme değerlerinin maliyetiyle %45'e varan performans artışı sağlar. XDP bir uzlaşma sunar, çekirdeği geçersiz kılan yüksek performanslı özel çerçeveler kadar iyi performans sunmaz. Ancak çekirdek entegrasyonu sunar; bu, paketlerin tüm avantajlarıyla birlikte ağ yığınından geçebileceği anlamına gelir. 10 GbE hattının veriminin yalnızca %50'sini işlemesine rağmen, bu tek bir çekirdeğin performansını temsil eder, yani CPU çekirdeği sayısı ile ölçeklenir.

BPF geçmişi

BPF orijinal olarak 1992'de UNIX için ağ paketlerini filtrelemek için geliştirilen "Berkeley paket filtresi" anlamına gelir, daha sonra "tcpdump" gibi ağ izleme uygulamalarında performansın iyileştirilmesine izin verir.BPF'nin alınan paketleri atma işlevi yoktur, ancak bir filtre olarak tanımlanırlar, paketleri ilişkilendirebilir, paketleri kopyalayabilir ve paket gönderebilirler.Başlangıçta BPF'ler linux 2.x çekirdeğinde uygulanır, 2 yazmaç bulunur 32 Daha sonra 2013'te Alexei Starovoitov, şimdi cBPF'yi (klasik) farklılaştıran BPF'lerde bir iyileştirme önerdi. BPF) ve eBPF (genişletilmiş BPF), en dikkate değer değişikliklerden biri, 64 bitlik 10 register'a geçişin yanı sıra yeni bir talimat sayesinde çekirdekteki işlev çağrısıdır. Diğer bir fark, cBPF'de durum kalıcılığının olmamasıdır. eBPF'de, eBPF'ler sürüm 3'te görünen haritalar sayesinde durumlar korunabilir JIT (Just In Time) derleyicisi gibi sürekli iyileştirmeler, “haritalar” ve “kuyruk çağrıları” gibi yeni özellikler ile linux çekirdeğinden .x.

Referans

  1. Monnet 2016
  2. Chaignon 2018
  3. Suo 2018
  4. Scholz 2018
  5. Cilium Yazarları 2019
  6. bpftrace
  7. perf
  8. kat
  9. dokunuşu
  10. PCP
  11. Örgü Kapsamı
  12. kirpik
  13. Suricata
  14. sistemd
  15. iproute2
  16. p4c-xdp
  17. LLVM
  18. Gizli
  19. libbpf
  20. bpftool
  21. gobpf
  22. ebpf_asm
  23. McCanne 1993
  24. Lidl 2002
  25. Baidya 2018
  26. Saif 2018
  27. Ellis 2017
  28. Belkalem 2018
  29. Nam 2017
  30. Gershuni 2019
  31. Fleming 2017
  32. Miano 2018
  33. Deepak 2018
  34. Begel 1999
  35. Salı 2018
  36. Van Tu 2017
  37. Oyuncak 2015
  38. Corbet 2014
  39. Oyuncak 2017
  40. Bos 2004

bibliyografya

İnternet sitesi

Şuna da bakın: