eBPF ëíìí/ëì/ëëíë ìëí ìë ìì í ëìëì

íì ìììí (3ì ìì)

  1. ëì: eBPF(Extended Berkeley Packet Filter)ë ëëì ìë ëìì "ììíê ìíëë" íëêëì ììíê ììí ì ìê íë êìë, ëíìí íí ìë, ëì ëëíë, ìë ìì ëì ìë ìììì ììí ììì ìì ëììë ìíí ì ìê íë.
  2. êì: eBPFë êì ìë ëëì ìíì(ìë íë ìë êë)ê ììì êê íëêëì ìëíë(ìíìí ììì ëì)ë ëìì íêíë, ìë ìëë ìëíë ìëí ì ìë êìëì ìêíë.
  3. ìí: eBPFë ìë êìê(Verifier)ë íí ììì ëì, LLVM/Clang êë Cìì ìíì, ë(Maps)ì íí ìí ìì, íí íìí(Hook Points)ë íí ëíìí/ëì/ìì êë ííìëë 4ë íì ììë êìëë.

1. êì ë íìì

êë ë ìì

eBPFë ìë 1992ë BSDìì ëíìí íí ííëì ìí íìí BPFë êëìë, 2014ë ëëì ìë 3.18ìì "Extended" êëì ìêëì ìë íëêëì ìì ë ëì ììì êëíì êììë. eBPF íëêëì ìëì ììëê ìì "êìê(Verifier)"ë íí ìììì êìëê, ìë(native code)ë ìíìëì ìë ëìì JIT(Just-In-Time) ìíìëì ìí ìíëë.

eBPFì íì íìì ëìê êë:

  • ììì: êìêê íëêëì ëë ìí êëë ëìíì ëí ëí,ëëëëë ìê ëì ìì ìë
  • íìì: ììì êêì ìë ìë ëìì ìì ìíëì ìíìí ììì ìëíë ìì
  • ëì ëë: ììí ìëí ìì íëêëì ììê ìêê êë
  • ëì íí ìí ìì: ìëê ììì êê ìììì ìê êëí íì ë, ëì, ìí ë ëìí ëìí êì ìê

ì eBPFê ììíê

êì ìë ëë ëìì êëíìë ìííë. ìë ëëì ìë ììì ëìí êíìë ìíëëë ëêê ììë ììí ììê ëì ì ìë. ëë ììì êê íëêëì ììí ìì íí ìëê íìíì íëë ìì ìíìí ìììë ìë ìëíëê ëìíë. eBPFë ì ë ëìì ììë ìíëì ëìì êëíë.

[êì ëìì ëìì]

[ìë ëë ëì]
ìì: ìë êêìì ìì ìí -> êìë
ëì: êì ììì ëê ì ìë íë -> ììí ìì ëì
      ëí ì ìë íì, ìëí íìí ì ìì

[ììì êê íëêë ëì]
ìì: ììí, êì ìì
ëì: ììí ì íì -> ëë ìíìí ììì -> ìë ìëíë
      ìì íì ì latency ìê


[eBPF ëì]
ìì: ìë êêìì ìì ìí -> êìë
      êìê íê íì -> ììì íë
      ëì ëë/ìëë -> ììì
ëì: êìêì ìí ìíë êëë êë
      íì êìì ìì

[ëììêë íì] eBPFë "ìë êêì ìì"ìëê í ì ìë. ìë ììì ììì ìíì ëì ì ìë ëëí ìëë ìíìíì ìê, êìêëë ììí êëìì "ì íëêëì ììíë ìíììë ëë"ê íëí íëêëë ìë êêìì ëëë êìë. ìë ìí êì ìë ëëì ìêíë ìëê, ììì íëêëì ìììì ëìì íëíë.

  • ìì ëì: eBPFë "íìê ììì ìë êìëë íêìí"ì êë. ëë ìë(ììí ì)ì íêìíë ìëì íê, êìëì ìì ìëì ììì êëëë, êìë ìëì êììë íêìíë íêíë. êì ìë ëëì êì ìì ëìê íêìíë êìê, ììì êê íëêëì êìëë ìëë ìííë êê êë.

2. ìííì ë íì ìë

eBPF ììí ìííì êì ìì

êì ìììíìì
eBPF íëêëìë ëìì ìíëëìëCììë ìì, LLVM/Clangìë ìíì
êìê(Verifier)íëêëì ìììì ìì êìëí ëí íì, ëëë ìê ëì êì, íì êì
JIT ìíìëëìíìëë ëìíë ìëë ëíx86, ARM ë ê ìííìë ììí ìë ìì
ë(Maps)ìëê ììì êêì êìíë ëìí ìììíì ë, ëì, ìí, í ë ëìí ìëêì
íí íìí(Hook Points)íëêëì ììëë ìë ë ììììí ì, ëíìí ìì, íëë ë
** attach/maps API**ììì êêìì eBPF íëêëì ììíë ìííììbpf() ììí ì, BCC, libbpf ë

eBPF íëêë ìí íë

[1ëê: Cììë íëêë ìì]

#include <linux/bpf.h>
#include <bpf/bpf_helpers.h>

SEC("tracepoint/syscalls/sys_enter_openat")
int trace_openat(struct trace_event_raw_sys_enter *ctx) {
    char filename[256];
    bpf_probe_read_user_str(filename, sizeof(filename), (void *)ctx->args[1]);
    bpf_printk("Opening: %s\n", filename);
    return 0;
}

|
| LLVM/Clangë ëìíìëë ìíì
|
v

[2ëê: êìê(Verifier)ë íí ììì êì]
- ëë ìí êëê ìëëëê?
- ëí ëíê ìëê?
- ëëë ìêì ìííê?
- íìì ììíëê?
|
| êì ìí -> íëêë êë
| êì íê -> ëì ëê
|
v

[3ëê: JIT ìíìëë íí ëìíë ìë ëí]
- ëìíìë -> x86_64 ëë ARM ëìíë ìë
- ìë ëìì ìì ìí êëí êêìë ëí
|
v

[4ëê: íí íìíì ìê ë ìí]
- ììë ììí ì ììììì ìë ìí
- ëë ììí ì íì ì íëêë ìí
|
v

[5ëê: êê ìë]
- bpf_printk() -> /sys/kernel/debug/tracing/trace_pipe ìë
- ëì ëìí êë -> ììì êêìì ìê

[ëììêë íì] eBPF íëêëì ìëìêë "ìí -> ììêì -> ìì -> ëì -> íë"ìë ëìí ì ìë. Cììë ììë íëêëì êìêëë ìí ìë ìììì êìëê, JIT ìíìëëë êìêìì êì ëìíë ìëë ìííê ë ë, ììí ììì ëìëìíë. ì êììì êìêê íëêëì êìíë "ìí êì"ì ëê ëìêì íë.

ìì íí íìí(Hook Points)

ëëíí íìíìë
ììí ìsys_enter_*, sys_exit_*ììí ì ìì/ìë ì ìí
ëíìíxdp, tc, socket filterëíìí íí ìë
ìë íìkprobe, kretprobeìë íì ìì/ìë ì ìí
ììì íìuprobe, uretprobeììì êê íì ìì
íëììíìítracepoint/*ìë ë ììë ìì ì

ëíìí XDP(eXpress Data Path) ëì êì

XDPë ëíìí ííì ìë ëíìí ìíì ëëíê ìì ìíëë eBPF íëêëë, ìë ìëë ííì ìëí ì ìë.

[ëíìí íí ìì êì]

 NIC(ëìë)ìì íí ìì
      |
      v
 [íëìì ëëìë ìì] <- XDP íí íìí!
      |
      | XDP íëêëì ì ìììì ìíë
      |
      +--> [XDP_PASS] -> ìë ëíìí ìíìë ìë
      |
      +--> [XDP_DROP] -> íí íê (DDoS ëì ë)
      |
      +--> [XDP_REDIRECT] -> ëë NICìë íëììë ìë
      |
      v
 [ìë ëíìí ìí] -> OSI 7êì ìë

íì ìì:
- ìë ëíìí ìí ìì ììëë ëì ëë
- ìë ììë êìì ìì -> ìëíë ììí
- ìë ììëë ëì íí ìë êë -> DDoS ëìì íêì

[ëììêë íì] XDPë "êìë íê ìì êì íìêë êìë ê"ê êë. ëìê ìëìì ëí(ìë ëíìí ìí)ì ëëíê ìì, êì íìê(XDP íëêë)ë íêìì ìíí ëê(XDP_DROP)ì ëë êëëë. ìëê íë ëêì ìëìì ëí ììë íêí íë ëêíë êëë íì íìììë.

  • ìì ëì: eBPF êìêë "ìí êêì ëëê íë êí ììí"ê êë. êêì ëìêë ëë ëê(íëêë)ì êëì(êìê)ì íêíì íê, êëìì "ì ëêì íëëì ìëê, ëêë ìëê, êê êìë íìë ëêì ìëê"ë êêí íìíë. ìë íêí ëêë êêì ëìê ì ìë.

3. ìí ëê ë ëêë ëì

eBPF vs ìë ëë vs ììì êê íëêë ëê

ëê íëeBPFìë ëëììì êê íëêë
ìììêìê íê íì, ììíêì ìì, ìíí ì ìììì, íëìì êë
ëíëì ëë/ìëë êëìëí íìí ì ìììë ëíì ëì
ìëìë êêê ëì, ëì ëììë êêê ëì, ëì ëìììí ì íì, ìê
êëêìêì ìí ìíëêì ëìííëìì ìê ëê
ìëíëëì ëìëììê~ëì
[eBPFì êì êì ëê]

ìë ëë:          [êìë but ìí]
                        ^
                        |
eBPF:          --------+-------- [êìë + ìì]
                        |
                        v
        ììì íëêë: [ìì but ëë]

[ëììêë íì] eBPFë êì ìë ëëê ììì êê íëêëì ììì êíí êììë. ìë ìëìì ìë ëëê ëìí ììì ëìíëìë, êìêë íí ììì íëë ìë ëëì ëìì êëíë. ìêì eBPFê íë ëëì ìíêìì ëëê íìì ëìêë ìììë.

eBPF êë ëê ìíê

ëêëììì
BCC (BPF Compiler Collection)C + Python/Luaë eBPF íëêë ììexecsnoop, opensnoop, network monitoring
libbpfìì Cëìëëëë eBPF íëêë ëëìë ëì eBPF íëêë
bpftraceëì ìì ììë ëì eBPF ìíëí ììbpftrace -e 'tracepoint:syscalls:sys_enter_open { printf("%s\n", comm); }'
Ciliumìëëíì ëíìí ë ëìL7 ìì ìì, ëíìí ëëíë
Falcoìíìë ëì ëëíëìì íì íì
  • ìì ëì: eBPF ìíêë "ëìí êêë êìë êê ìí"ì êë. BCCë êê êììê ìì Cë ìêí ëêë ëëë íìê, bpftraceë êëìë ìëíë ìììë êëí ëëìë ìììì ëìë ëìíë ëêìë. Ciliumì íëí íê(ìëëíì) ìììë ìêë ëêìê, Falcoë ëì êëì ìíì íë ìë ëêìë.

4. ìë ìì ë êììì íë

ìë ìëëì: DDoS ëìë ìí XDP êë íí ííë

ìí:ë ëêë ì ìëìê DDoS êêì ëì ìëìêëìë. êì ëíëìë ìëíêì êê íëíì ëë ìë.

eBPF/XDP êë ëì:

  1. XDP íëêë ìì: ìëì IP ììë êëìë ííì ëë
  2. ìëì êê íí(íì íí, íì íí íê ë)ì XDP_DROPìë ìì íê
  3. ìì íëíì XDP_PASSë ìë ëíìí ìíì ìë
  4. ë(Maps)ì íí ê IPë ìì ìë ììíê, ìì ìêêì ìêíë ìë ìë

êê: ëíìí ëëìë ìììì ìë ìëë ííì ìëíë, êê íëíì íêììë ìëíê ìì íëíì ìí ìì ìë

ëì ìíëìí

  • ìë ëì íì: eBPFì ëë êëì ììíëë ìë 4.14 ììì êìëë.
  • íìí íê íì: ìë eBPF íëêëì ëí êíê CAP_SYS_ADMINì íìíë, ëì ììì ëê ììíì íë.
  • ë íê êí: eBPF ëì ìë ëëëë ììíëë, ëë í ëì ììí ëììë ëëí ì ìë.

ìííí

  • êìêë ìííëê ëìí íë ìì: êìêë íëìì ììì ëììë íìíëë, ëí ëíë ëëê ìí ëìí íëì êëëë.

  • ëë êì eBPFë ìëíë í: eBPFë êëíìë ëëì ìëë. ëë ëìí ëìì ìë ëëìë ììì êê íëêëìë ëëíë êì ìë.

  • ìì ëì: eBPFë "êìëë íêìíì ìë ììí"ê êë. ìëêë ëë ìëìInspectionsíì ìíë ëê ì ìêë ëê, ìì ìëìSecondary Inspection êììë ëëë, ìì ìëì êë íêìíë. ìë íí êìëë ìì ìëë ëìì ììëìë ëìì ììíë.


5. êëíê ë êë

ìë/ìì êëíê

êëìíì iptables ëíëeBPF/XDP êë ëíë
íí ìëëìë ììë~ìëë ííìë ìëë~ììë íí
CPU ììëìê~ëìëì ëì
ëìíì ìêì ëëìì ëìíëì
ëì ëìêì ëê ì ìêì íìììê êì ìëìí êë

ëë ìë

eBPFë ìëëíì ëíìí(Cilium), ìíìë ëì(Falco), ìë ëëíë(bpftrace) ë íë ìíëìì íì êìë ìëìê ìë. ëí íëìì êì(TPASS)ê êííì ëì ëë íí ìëê êëíìê, ëìëëì íìí ìëí ëíìí ììíìë ììì ììë.

ìê íì

  • ëëì ìë ëì: https://www.kernel.org/doc/html/latest/bpf/

  • BCC (BPF Compiler Collection): https://github.com/iovisor/bcc

  • bpftrace: https://bpftrace.org/

  • ìì ëì: eBPFë "ìëí ìíì íí êí ììí"ê êë. êí ìí, CCTV, êê ìë ìììë ëì ëë íëì ìì ììíìì êëëëì, eBPFë ëíìí, ëì, ëëíë ëì íëì íí íëììíìì ìëíë.


êë êë ë

êë ëìêê ë ìëì ìë
XDP (eXpress Data Path)eBPFë íìí ìêì ëíìí íí ìë íëììíë, ìë ëíìí ìí ììì ííì ìëíë.
êìê(Verifier)eBPF íëêëì ìììì ìëì ììëê ìì êìíë ëëë, ëí ëíìëëëëë ìêì ìì ìëíë.
ë(Maps)ìëê ììì êêì êìíë ëìí ìììë, eBPF íëêëì ìí ìì ë ììì êêêì íìì ììëë.
BCC (BPF Compiler Collection)Cììë eBPF íëêëì ìê ììí ì ìëë íë íëììíìë.

ìëìë ìí 3ì ëì ìë

  1. eBPFë "ìí êê ìêì ìë ëì ììí"ê êë. ëë ìë(íëêë)ì êê(ìë)ì ëìêëë ëì ëì ììí(êìê)ì íêíì íê, ìíí ìëì êëëê ìì ìëì íêìíë.
  2. êëë ì ëì ììíì fastíì ìëëì ìì ìì êëë íìê ìë. ëìë,ï(íí)ì ëë íêíëìë ëììíë.
  3. êëê ìëì ëì êìë ëë ì ìë. ìíì ëì ìêë ìëì êìì ììí ì ììë flexibleíë!