Linux eBPF 관측성 심화

eBPF란?

eBPF(extended Berkeley Packet Filter)는 Linux 커널 내부에서 샌드박스된 프로그램을 실행하는 기술이다. 커널 모듈을 빌드하거나 커널을 재컴파일하지 않고도 네트워크, 보안, 성능 관측을 커널 수준에서 수행할 수 있다. Netflix, Meta, Google, Cloudflare 등이 프로덕션에서 적극 활용하고 있다.

eBPF 동작 원리

eBPF 프로그램은 사용자 공간에서 작성된 후 커널의 JIT 컴파일러Verifier를 거쳐 커널 내부에서 실행된다.

사용자 공간                     커널 공간
┌──────────┐    시스템콜     ┌─────────────┐
│ C/Rust   │ ──bpf()────→ │  Verifier    │ → 안전성 검증
│ 프로그램  │               │  JIT Compile │ → 네이티브 코드 변환
└──────────┘               │  Hook 부착   │ → kprobe/tracepoint/XDP
                           └─────────────┘
                                  ↓
                           ┌─────────────┐
                           │  BPF Map    │ → 커널↔사용자 공간 데이터 공유
                           └─────────────┘
  • Verifier — 무한 루프, 잘못된 메모리 접근, 스택 오버플로우를 차단. eBPF 프로그램이 커널을 크래시시키지 않도록 보장한다.
  • JIT Compiler — eBPF 바이트코드를 x86/ARM 네이티브 코드로 변환. 오버헤드가 거의 없다.
  • BPF Map — 해시맵, 배열, 링버퍼 등 커널과 사용자 공간 간 데이터 교환 채널.

Hook 포인트: 어디에 부착하나?

Hook 타입 용도 예시
kprobe/kretprobe 커널 함수 진입/반환 추적 tcp_connect, vfs_read
tracepoint 커널 정적 추적점 sched:sched_switch, syscalls:sys_enter_open
uprobe/uretprobe 사용자 공간 함수 추적 SSL_read, malloc
XDP NIC 드라이버 레벨 패킷 처리 DDoS 방어, 로드밸런싱
tc (Traffic Control) 네트워크 스택 패킷 필터링 대역폭 제어, 패킷 조작
LSM 보안 정책 적용 파일 접근 제어, 프로세스 격리

bpftrace: 원라이너 관측

bpftrace는 eBPF의 awk라 불리는 고수준 트레이싱 언어다. 커널 이벤트를 한 줄로 관측할 수 있다.

# 프로세스별 시스템콜 횟수 (5초간)
bpftrace -e 'tracepoint:raw_syscalls:sys_enter { @[comm] = count(); } interval:s:5 { exit(); }'

# 파일 열기 추적 (어떤 프로세스가 어떤 파일을?)
bpftrace -e 'tracepoint:syscalls:sys_enter_openat { printf("%s → %sn", comm, str(args->filename)); }'

# TCP 연결 지연시간 히스토그램
bpftrace -e 'kprobe:tcp_v4_connect { @start[tid] = nsecs; }
  kretprobe:tcp_v4_connect /@start[tid]/ {
    @usecs = hist((nsecs - @start[tid]) / 1000);
    delete(@start[tid]);
  }'

# 블록 I/O 지연시간 (디스크 느린 원인 분석)
bpftrace -e 'tracepoint:block:block_rq_issue { @start[args->dev, args->sector] = nsecs; }
  tracepoint:block:block_rq_complete /@start[args->dev, args->sector]/ {
    @usecs = hist((nsecs - @start[args->dev, args->sector]) / 1000);
    delete(@start[args->dev, args->sector]);
  }'

BCC 도구 실전 활용

BCC(BPF Compiler Collection)는 사전 빌드된 eBPF 도구 모음이다. 설치만 하면 바로 사용할 수 있다.

# 설치 (Ubuntu)
apt install bpfcc-tools linux-headers-$(uname -r)

# execsnoop: 새로 실행되는 모든 프로세스 추적
execsnoop-bpfcc

# opensnoop: 파일 오픈 이벤트 추적
opensnoop-bpfcc -p $(pidof nginx)

# tcplife: TCP 연결 수명 추적 (어디로, 얼마나 오래, 얼마나 전송?)
tcplife-bpfcc

# biolatency: 블록 I/O 지연시간 히스토그램
biolatency-bpfcc -D 10  # 10초간 디스크별 분리

# runqlat: CPU 스케줄러 큐 대기시간 (CPU 포화 상태 확인)
runqlat-bpfcc 10 1

# profile: CPU 프로파일링 (FlameGraph 생성용)
profile-bpfcc -F 99 -f 30 > /tmp/profile.folded
flamegraph.pl /tmp/profile.folded > /tmp/flame.svg

실전 시나리오: 프로덕션 지연 원인 분석

API 응답이 간헐적으로 느려지는 상황을 eBPF로 단계적으로 진단하는 워크플로우다.

# 1단계: CPU 포화 확인 — 큐 대기시간이 높으면 CPU 부족
runqlat-bpfcc 5 1

# 2단계: 디스크 I/O 확인 — 지연시간이 밀리초 단위면 디스크 병목
biolatency-bpfcc 5 1

# 3단계: 네트워크 지연 확인 — 외부 API 호출 지연?
bpftrace -e 'kprobe:tcp_v4_connect { @start[tid] = nsecs; }
  kretprobe:tcp_v4_connect /@start[tid]/ {
    $lat = (nsecs - @start[tid]) / 1000000;
    if ($lat > 100) { printf("slow connect: %dms comm=%sn", $lat, comm); }
    delete(@start[tid]);
  }'

# 4단계: 특정 프로세스 CPU 프로파일링
profile-bpfcc -p $(pidof java) -F 99 30 > /tmp/java.folded

Kubernetes에서 eBPF 활용

K8s 환경에서 eBPF는 Cilium 네트워킹과 보안 관측에 핵심 역할을 한다.

# kubectl debug + bpftrace로 노드 레벨 트레이싱
kubectl debug node/worker-01 -it --image=quay.io/iovisor/bpftrace:latest

# Hubble (Cilium의 관측 도구) — eBPF 기반 네트워크 플로우
hubble observe --pod my-namespace/my-pod --protocol TCP
hubble observe --verdict DROPPED  # 드롭된 패킷만

# Tetragon — eBPF 기반 보안 관측
# 특정 바이너리 실행 감지
kubectl apply -f - <<EOF
apiVersion: cilium.io/v1alpha1
kind: TracingPolicy
metadata:
  name: detect-shell
spec:
  kprobes:
  - call: "security_bprm_check"
    syscall: false
    args:
    - index: 0
      type: "linux_binprm"
    selectors:
    - matchBinaries:
      - operator: "In"
        values: ["/bin/sh", "/bin/bash"]
EOF

보안 관측: 런타임 위협 탐지

eBPF는 런타임 보안에서 기존 도구(auditd, seccomp)를 보완한다. 커널 레벨에서 이벤트를 캡처하므로 사용자 공간 우회가 불가능하다.

  • 파일 무결성 모니터링kprobe:vfs_write으로 /etc/passwd, /etc/shadow 변경 감지
  • 네트워크 이상 탐지 — Pod에서 예상치 못한 외부 IP 연결 감지
  • 권한 상승 감지tracepoint:syscalls:sys_enter_setuid로 UID 변경 추적
  • 암호화 트래픽 관측uprobe:SSL_write/SSL_read로 TLS 복호화 전 데이터 캡처 (디버깅용)

XDP: 초고속 패킷 처리

XDP(eXpress Data Path)는 NIC 드라이버 레벨에서 패킷을 처리하는 eBPF 훅이다. 커널 네트워크 스택을 거치기 전에 패킷을 필터링하므로 수백만 PPS(Packets Per Second)를 처리할 수 있다.

// XDP 프로그램 예시 (C) — 특정 IP 차단
SEC("xdp")
int xdp_firewall(struct xdp_md *ctx) {
    void *data = (void *)(long)ctx->data;
    void *data_end = (void *)(long)ctx->data_end;
    struct ethhdr *eth = data;

    if ((void *)(eth + 1) > data_end) return XDP_PASS;
    if (eth->h_proto != htons(ETH_P_IP)) return XDP_PASS;

    struct iphdr *ip = (void *)(eth + 1);
    if ((void *)(ip + 1) > data_end) return XDP_PASS;

    // 차단 대상 IP → XDP_DROP (커널 스택 진입 전 차단)
    if (ip->saddr == blocked_ip)
        return XDP_DROP;

    return XDP_PASS;  // 나머지는 정상 처리
}

Cloudflare는 XDP로 L4 DDoS 방어를 구현해 초당 수천만 패킷을 드롭한다. nftables 방화벽보다 10~100배 빠르다.

주의사항과 제약

  • 커널 버전 의존 — eBPF 기능은 커널 버전마다 다르다. 5.8+ 권장, 6.x에서 대부분의 기능 사용 가능.
  • CO-RE (Compile Once – Run Everywhere) — BTF(BPF Type Format) 지원 커널에서 빌드된 eBPF 바이너리를 다른 커널에서도 실행 가능. CONFIG_DEBUG_INFO_BTF=y 확인 필요.
  • Verifier 제약 — 루프 횟수 제한, 스택 512바이트, 최대 100만 명령어. 복잡한 로직은 Tail Call로 분리.
  • 권한 필요CAP_BPF + CAP_PERFMON (5.8+) 또는 root 권한. 프로덕션에서는 권한 있는 DaemonSet으로 운영.
  • 오버헤드 — 일반적으로 1~5% 미만이지만, 고빈도 Hook(예: 모든 시스템콜)에서는 측정 후 사용.

정리

eBPF는 Linux 관측성의 패러다임 전환이다. 커널을 수정하지 않고도 네트워크, 보안, 성능을 커널 수준에서 관측하고 제어할 수 있다. 프로덕션 트러블슈팅에는 BCC/bpftrace, Kubernetes 환경에는 Cilium/Tetragon, 고성능 패킷 처리에는 XDP — 각 도구를 상황에 맞게 선택하면 된다. 기존의 strace, tcpdump, perf가 해결하지 못한 영역을 eBPF가 채우고 있다.

위로 스크롤
WordPress Appliance - Powered by TurnKey Linux