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:
| Kaynak | Ne Sağlar |
|---|---|
| eBPFHub exercises | Tarayı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-tutorial | Temel 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
| Kaynak | Açıklama |
|---|---|
| Katran | Facebook L4 load balancer (XDP). README.md dosyasını şimdi okuyun; xdp_root.c dosyasını sonraki bölümlerde inceleyeceksiniz. |
| lb-from-scratch | Liz Rice’ın sıfırdan yazılmış load balancer’ı - bunu tamamlamalısınız |
| reuseport-ebpf-go | lb-from-scratch’i tamamladıktan sonra okuyun |
| DnsTrace | DNS tracing projesi |
| eBPFeXPLOIT | eBPF exploit örnekleri |
| bng | BNG projesi |
Okuma Materyalleri
Bu kaynaklar ilgili bölümlerde tekrar referans verilecektir:
| Kaynak | İlgili Bölüm |
|---|---|
| Computer Networking Fundamentals | Byte Order + Network Tracing |
| XDP Paper | XDP Packet Processing |
| Cilium BPF Architecture | BPF Deep Dive |
| Cilium Network Concepts | XDP vs TC Program Types |
| Unimog Blog | Load Balancing |
| Facebook BPF Firewall | IP Blocklist |
| Cilium Performance Tuning | İleri Konular |
Ek Kaynaklar
- Load Balancer Challenge - L4 LB eBPF-XDP load balancer
- Deep Dive into Cloudflare’s Cache Mechanism - Cloudflare cache iç yapısı
- Scratch to Success LB - Adım adım LB yapımı
- VLAN Filter Support - Bridge VLAN filtering
- Edge-FaaS Scheduling
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ör | Ne Öğretiyor | Ne Zaman Kullanılır |
|---|---|---|
basic01-xdp-pass | Tüm paketleri geçiren minimal XDP programı | Buradan başlayın; ilk XDP programı |
basic02-prog-by-name | XDP programlarını section name ile yükleme ve bağlama | basic01’den hemen sonra |
basic03-map-counter | Paketleri saymak için BPF map kullanımı | Map’leri öğrenirken (Bölüm 2+) |
basic04-pinning-maps | Kalıcılık için map’leri BPF filesystem’e pinleme | basic03’ten sonra, multi-program kurulumları öncesinde |
packet01-parsing | Ethernet, IP ve TCP/UDP header’larını güvenli şekilde parse etme | Temel beceri; herhangi bir filter yapmadan önce çalışın |
packet02-rewriting | Packet header’larını yeniden yazma (MAC, IP) | Load balancer ve NAT projeleri için gerekli |
packet03-redirecting | bpf_redirect ile paketleri interface’ler arasında yönlendirme | Load balancer ve forwarding kullanım senaryoları |
tracing01-xdp-simple | bpf_printk ile XDP event’lerini tracing | Herhangi bir XDP programını debug etme |
tracing02-xdp-perf-event | XDP programlarından perf event output | Yapılandırılmış event output’a ihtiyacınız olduğunda |
advanced01-xdp-load-balancer | Tam XDP load balancer örneği | packet01-03’ü tamamladıktan sonra; kendi LB’nizle karşılaştırın |
advanced03-AF_XDP | User-space packet processing için AF_XDP socket | Opsiyonel; 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üm | Notlar |
|---|---|---|
| Bir listeden IP’leri engelleme | IP key’leri ile BPF_MAP_TYPE_HASH | DDoS engine ve IP blocklist’te kullanılır |
| Kaynak başına paket sayma | BPF_MAP_TYPE_PERCPU_HASH veya BPF_MAP_TYPE_LRU_HASH | Per-CPU variant lock contention’ı önler |
| Rate limiting | BPF_MAP_TYPE_HASH + BPF’te token bucket | Her key için timestamp ve token sayısı saklayın |
| Round-robin backend seçimi | BPF_MAP_TYPE_ARRAY + atomic counter | __sync_fetch_and_add ile backend array’e index |
| Consistent hashing | 5-tuple hash, mod N backend | jhash veya benzeri kullanın; referans için Katran’a bakın |
| DNS query inceleme | L3/L4 header’lardan sonra UDP payload’ı parse edin | DNS wire format’taki QNAME field’ı üzerinde eşleştirme |
| Paketi kernel stack’e geçirme | XDP_PASS return edin | İşlem gerekmediğinde varsayılan davranış |
| Paketi düşürme | XDP_DROP return edin | Kernel’deki en hızlı discard path |
| Başka bir interface’e yönlendirme | bpf_redirect() + XDP_REDIRECT return | Load balancer forwarding için gerekli |
| MAC adreslerini yeniden yazma | xdp_md->data üzerinden doğrudan header değişikliği | Doğ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_ARRAY | Program reload’ları arasında kalıcılık için map’leri BPFFS’e pinleyin |
| Başka bir BPF programına tail call | BPF_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_TRIE | Subnet seviyesinde engelleme için longest prefix match |
| DNS query log | BPF_MAP_TYPE_RINGBUF + Go consumer | Polling olmadan event’leri userspace’e stream etme |
| Debug output | bpf_printk() + bpftool prog trace | Kernel trace pipe; yalnızca geliştirme sırasında kullanın |
| Routing lookup | bpf_fib_lookup() | Kernel FIB’den next-hop MAC ve interface çözümleme |
| String karşılaştırma | bpf_strncmp() | Değişken string’i bir sabit ile karşılaştırma |
| Substring arama | bpf_strstr() (kernel 6.x+) | Bir buffer içinde bir alt string bulma |
| Kernel memory okuma | bpf_probe_read_kernel_str() | Kernel adres alanından güvenli okuma |
| User memory okuma | bpf_probe_read_user_str() | User adres alanından güvenli okuma |
| Process adını alma | bpf_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.
| Faz | Odak | Ana Çıktı |
|---|---|---|
| Faz 1: Temeller | C 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 Parsing | Ethernet/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 State | BPF map type’ları, per-CPU map’ler, map pinning, user-space etkileşimi | Dinamik güncellemeli IP blocklist |
| Faz 4: Ana Projeler | L4 Load Balancer, DDoS mitigation engine, DNS policy filter | Üç çalışan XDP programı |
| Faz 5: Cilalama ve Genişletme | Performance tuning, metrics export, opsiyonel DNS resolver/forwarder | Dokü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.
| Konu | Neden 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 |
| Recursion | BPF programları recursive olamaz; verifier geriye doğru atlayışları reddeder |
| Floating point arithmetic | BPF’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, strftime | BPF’te mevcut değil; timestamp’ler ham nanosaniye değerleridir |
| Rastgele sayı üretimi | BPF’te bpf_get_prandom_u32() vardır; libc random fonksiyonlarına gerek yoktur |
| Binary search tree | Prefix 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.
| Özellik | XDP | TC (cls_bpf) |
|---|---|---|
| Hook noktası | NIC driver, SKB allocation öncesinde | SKB oluşturulduktan sonra, qdisc katmanında |
| Yön | Yalnızca ingress | Hem ingress hem egress |
| Performans | Mümkün olan en hızlı; kernel network stack’inden önce çalışır | Daha yavaş; SKB overhead zaten ödenmiş |
| Kullanım senaryosu uyumu | DDoS drop, DNS filtering, L4 LB forwarding | Egress shaping, container networking, routing sonrası policy |
| SKB erişimi | SKB yok; ham xdp_md ile çalışır | Metadata, mark, priority ile tam SKB |
| Ne zaman gerekir | Line rate’te filtreleme veya yönlendirme istediğinizde | Egress 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_redirectile 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: