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가 채우고 있다.