Baslangic

Kaynaklar ve On Kosullar

Bu sayfa, öğrenme yolu boyunca kullanacağınız tüm kaynakları, referans projeleri, içerik kaynaklarını ve hedef çıktıları listeler.

İçerik Kaynakları

Bu yol haritasındaki alıştırmalar ve okuma materyalleri şu birincil kaynaklardan alınmıştır:

KaynakNe Sağlar
eBPFHub exercisesTarayıcı içi editor ve sunucu taraflı runner ile hands-on kodlama alıştırmaları
iximiuz labsİnteraktif networking ve Linux temelleri kursları (özellikle Computer Networking Fundamentals)
xdp-tutorialTemel seviyeden ileri seviye packet processing’e kadar ilerleyen alıştırmalarla resmi XDP tutorial reposu
Okuma materyalleri (aşağıda listelenmiştir)Her bölümde referans verilen makaleler, blog yazıları ve dokümantasyon

Referans Projeler

KaynakAçıklama
KatranFacebook L4 load balancer (XDP). README.md dosyasını şimdi okuyun; xdp_root.c dosyasını sonraki bölümlerde inceleyeceksiniz.
lb-from-scratchLiz Rice’ın sıfırdan yazılmış load balancer’ı - bunu tamamlamalısınız
reuseport-ebpf-golb-from-scratch’i tamamladıktan sonra okuyun
DnsTraceDNS tracing projesi
eBPFeXPLOITeBPF exploit örnekleri
bngBNG projesi

Okuma Materyalleri

Bu kaynaklar ilgili bölümlerde tekrar referans verilecektir:

Kaynakİlgili Bölüm
Computer Networking FundamentalsByte Order + Network Tracing
XDP PaperXDP Packet Processing
Cilium BPF ArchitectureBPF Deep Dive
Cilium Network ConceptsXDP vs TC Program Types
Unimog BlogLoad Balancing
Facebook BPF FirewallIP Blocklist
Cilium Performance Tuningİleri Konular

Ek Kaynaklar

xdp-tutorial Dizin Rehberi

xdp-tutorial reposu ilerlemeli klasörler halinde düzenlenmiştir. Hangi klasörü ne zaman çalışacağınızı bilmek için bu tabloyu kullanın.

KlasörNe ÖğretiyorNe Zaman Kullanılır
basic01-xdp-passTüm paketleri geçiren minimal XDP programıBuradan başlayın; ilk XDP programı
basic02-prog-by-nameXDP programlarını section name ile yükleme ve bağlamabasic01’den hemen sonra
basic03-map-counterPaketleri saymak için BPF map kullanımıMap’leri öğrenirken (Bölüm 2+)
basic04-pinning-mapsKalıcılık için map’leri BPF filesystem’e pinlemebasic03’ten sonra, multi-program kurulumları öncesinde
packet01-parsingEthernet, IP ve TCP/UDP header’larını güvenli şekilde parse etmeTemel beceri; herhangi bir filter yapmadan önce çalışın
packet02-rewritingPacket header’larını yeniden yazma (MAC, IP)Load balancer ve NAT projeleri için gerekli
packet03-redirectingbpf_redirect ile paketleri interface’ler arasında yönlendirmeLoad balancer ve forwarding kullanım senaryoları
tracing01-xdp-simplebpf_printk ile XDP event’lerini tracingHerhangi bir XDP programını debug etme
tracing02-xdp-perf-eventXDP programlarından perf event outputYapılandırılmış event output’a ihtiyacınız olduğunda
advanced01-xdp-load-balancerTam XDP load balancer örneğipacket01-03’ü tamamladıktan sonra; kendi LB’nizle karşılaştırın
advanced03-AF_XDPUser-space packet processing için AF_XDP socketOpsiyonel; yalnızca user-space fast path gerekiyorsa

Hızlı Referans

Belirli bir ihtiyaçla karşılaştığınızda, doğru BPF primitive veya tekniği bulmak için bu tabloyu kullanın.

İhtiyaçÇözümNotlar
Bir listeden IP’leri engellemeIP key’leri ile BPF_MAP_TYPE_HASHDDoS engine ve IP blocklist’te kullanılır
Kaynak başına paket saymaBPF_MAP_TYPE_PERCPU_HASH veya BPF_MAP_TYPE_LRU_HASHPer-CPU variant lock contention’ı önler
Rate limitingBPF_MAP_TYPE_HASH + BPF’te token bucketHer key için timestamp ve token sayısı saklayın
Round-robin backend seçimiBPF_MAP_TYPE_ARRAY + atomic counter__sync_fetch_and_add ile backend array’e index
Consistent hashing5-tuple hash, mod N backendjhash veya benzeri kullanın; referans için Katran’a bakın
DNS query incelemeL3/L4 header’lardan sonra UDP payload’ı parse edinDNS wire format’taki QNAME field’ı üzerinde eşleştirme
Paketi kernel stack’e geçirmeXDP_PASS return edinİşlem gerekmediğinde varsayılan davranış
Paketi düşürmeXDP_DROP return edinKernel’deki en hızlı discard path
Başka bir interface’e yönlendirmebpf_redirect() + XDP_REDIRECT returnLoad balancer forwarding için gerekli
MAC adreslerini yeniden yazmaxdp_md->data üzerinden doğrudan header değişikliğiDoğru L2 header’ı ayarlamak için redirect sonrası gerekli
XDP ve user space arasında state paylaşımıBPF_MAP_TYPE_HASH veya BPF_MAP_TYPE_ARRAYProgram reload’ları arasında kalıcılık için map’leri BPFFS’e pinleyin
Başka bir BPF programına tail callBPF_MAP_TYPE_PROG_ARRAY + bpf_tail_call()Katran’ın xdp_root.c dosyasında program chaining için kullanılır
IP blocklist (CIDR aralık)BPF_MAP_TYPE_LPM_TRIESubnet seviyesinde engelleme için longest prefix match
DNS query logBPF_MAP_TYPE_RINGBUF + Go consumerPolling olmadan event’leri userspace’e stream etme
Debug outputbpf_printk() + bpftool prog traceKernel trace pipe; yalnızca geliştirme sırasında kullanın
Routing lookupbpf_fib_lookup()Kernel FIB’den next-hop MAC ve interface çözümleme
String karşılaştırmabpf_strncmp()Değişken string’i bir sabit ile karşılaştırma
Substring aramabpf_strstr() (kernel 6.x+)Bir buffer içinde bir alt string bulma
Kernel memory okumabpf_probe_read_kernel_str()Kernel adres alanından güvenli okuma
User memory okumabpf_probe_read_user_str()User adres alanından güvenli okuma
Process adını almabpf_get_current_comm()Çalışan task’in comm (ad) değerini döndürür
Port dönüşümü (network to host)bpf_ntohs()16-bit network byte order’dan host byte order’a
IP dönüşümü (network to host)bpf_ntohl()32-bit network byte order’dan host byte order’a

Çalışma Sırası Özeti

Bu fazları sırayla takip edin. Her faz bir öncekinin üzerine kuruludur.

FazOdakAna Çıktı
Faz 1: TemellerC temelleri, kernel data type’ları, byte order, BPF verifier kurallarıBölüm 1’deki tüm alıştırmaları geçin
Faz 2: Packet ParsingEthernet/IP/UDP header parsing, bounds checking, XDP return code’larıCanlı paketleri parse edin ve sınıflandırın
Faz 3: Map’ler ve StateBPF map type’ları, per-CPU map’ler, map pinning, user-space etkileşimiDinamik güncellemeli IP blocklist
Faz 4: Ana ProjelerL4 Load Balancer, DDoS mitigation engine, DNS policy filterÜç çalışan XDP programı
Faz 5: Cilalama ve GenişletmePerformance tuning, metrics export, opsiyonel DNS resolver/forwarderDokümantasyonlu production-ready kod

Neleri Atlayabilirsiniz

Aşağıdaki konular genel C veya system programming müfredatında yaygındır ancak eBPF/XDP geliştirme için gerekli değildir. Odaklı kalmak için bunları atlayın.

KonuNeden Gerekli Değil
time.h / date-time fonksiyonlarıBPF programları libc time fonksiyonları yerine bpf_ktime_get_ns() kullanır
File I/O (fopen, fread, fwrite)BPF programları dosya sistemine erişemez; tüm state map’ler üzerinden geçer
Dynamic memory (malloc, free)BPF verifier dinamik allocation’ı yasaklar; tüm bellek stack veya map tabanlıdır
RecursionBPF programları recursive olamaz; verifier geriye doğru atlayışları reddeder
Floating point arithmeticBPF’te floating point desteği yoktur; integer math kullanın
Signal handling (signal.h)Yalnızca user-space loader kodunda geçerlidir, BPF programlarında değil
Multi-threading (pthread)BPF programları çağrı başına single-threaded’dir; concurrency per-CPU map’ler ile yönetilir
Standard I/O (printf, scanf)Debug output için bpf_printk() kullanın; kernel context’te standard I/O yoktur
struct tm, strftimeBPF’te mevcut değil; timestamp’ler ham nanosaniye değerleridir
Rastgele sayı üretimiBPF’te bpf_get_prandom_u32() vardır; libc random fonksiyonlarına gerek yoktur
Binary search treePrefix matching için BPF_MAP_TYPE_LPM_TRIE kullanın; BPF özel ağaç yapılarını kısıtlar
Linear/binary search algoritmalarıBPF map’ler O(1) hash lookup sağlar; arama algoritmalarını manuel uygulamaya gerek yoktur
Karmaşık veri yapıları (linked list, tree)BPF map’ler hash table ve array sağlar; özel veri yapıları verifier tarafından kısıtlanır

Opsiyonel ama pointer pratiği için faydalı: Linked list ve stack/queue implementasyonları. Bunları BPF’te kullanmayacaksınız, ancak iyi struct + pointer pratiği sağlarlar.

TC Hook Gerekli mi?

Kısa cevap: Hayır. Bu yol haritasındaki DDoS engine, DNS filter ve L4 load balancer projeleri için XDP yeterlidir. TC (Traffic Control) BPF hook’larını öğrenmek zorunda değilsiniz.

ÖzellikXDPTC (cls_bpf)
Hook noktasıNIC driver, SKB allocation öncesindeSKB oluşturulduktan sonra, qdisc katmanında
YönYalnızca ingressHem ingress hem egress
PerformansMümkün olan en hızlı; kernel network stack’inden önce çalışırDaha yavaş; SKB overhead zaten ödenmiş
Kullanım senaryosu uyumuDDoS drop, DNS filtering, L4 LB forwardingEgress shaping, container networking, routing sonrası policy
SKB erişimiSKB yok; ham xdp_md ile çalışırMetadata, mark, priority ile tam SKB
Ne zaman gerekirLine rate’te filtreleme veya yönlendirme istediğinizdeEgress hook’ları veya SKB-level feature’lara ihtiyacınız olduğunda (örneğin skb->mark)

Bu yol haritası için XDP neden yeterli:

  • DDoS mitigation hızlı ingress drop gerektirir - XDP’nin XDP_DROP’u en hızlı path’tir.
  • DNS filtering gelen UDP query’leri inceler - tamamen ingress, egress hook gerekmez.
  • L4 load balancing, kernel SKB allocate etmeden önce paketleri bpf_redirect ile iletir, bu da tüm performans avantajının kendisidir.
  • TC, egress policy’lere ihtiyaç duyduğunuzda (örneğin Cilium’un container networking’i) veya SKB metadata’sını okumak gerektiğinde devreye girer. Bu, bu yol haritasının kapsamı dışındadır.

İleride container networking üzerinde çalışırsanız veya egress filtering’e ihtiyaç duyarsanız, o noktada TC’ye dönün. Şimdilik tamamen XDP’ye odaklanın.

Hedef Çıktılar

Bunlar, bu öğrenme yolunun sonunda üretmeniz gereken projelerdir:

  1. L4 Load Balancer - eBPF/XDP tabanlı (challenge)
  2. DDoS Engine - XDP ingress filtering
  3. DNS Policy Filter - DNS query tabanlı filtreleme
  4. DNS Resolver (opsiyonel) - challenge
  5. DNS Forwarder (opsiyonel) - challenge