[Daily morning study] eBPF 개념과 활용 사례 (네트워킹, 보안, 관측성)

#daily morning study

Image


eBPF란

eBPF(extended Berkeley Packet Filter)는 리눅스 커널 안에서 샌드박스 프로그램을 안전하게 실행할 수 있게 해주는 기술이다. 커널 소스 코드를 수정하거나 커널 모듈을 작성하지 않고도 커널의 동작을 동적으로 확장할 수 있다.

원래 BPF(Berkeley Packet Filter)는 1992년 BSD에서 네트워크 패킷 필터링을 위해 만들어졌다. 리눅스 커널 3.18(2014년)부터 대대적으로 확장되어 eBPF라는 이름으로 자리잡았고, 이제는 단순한 패킷 필터를 넘어서 커널 전반의 기능을 프로그래밍 방식으로 제어할 수 있게 됐다.

eBPF 동작 원리

사용자 공간                    커널 공간
─────────────────────────────────────────────────────
eBPF 프로그램 (C로 작성)
      ↓
LLVM/Clang 컴파일
      ↓
eBPF 바이트코드
      ↓ (syscall: bpf())
                         Verifier (안전성 검증)
                              ↓
                         JIT 컴파일러 (네이티브 코드로 변환)
                              ↓
                         커널 훅 포인트에 부착
                         (kprobe, tracepoint, XDP, tc 등)

Verifier

eBPF 프로그램이 커널에 로드될 때 Verifier가 정적 분석을 수행한다.

  • 무한 루프 없음 (유한 실행 보장)
  • 유효하지 않은 메모리 접근 없음
  • 권한 없는 커널 함수 호출 없음
  • 항상 정상 종료됨

이 덕분에 커널 패닉이나 시스템 크래시 없이 안전하게 실행된다.

훅 포인트 (Hook Points)

eBPF 프로그램이 부착될 수 있는 위치들이다.

훅 유형설명주요 활용
kprobe/kretprobe커널 함수 진입/반환 시점시스템 콜 추적, 성능 분석
tracepoint커널에 미리 정의된 이벤트 지점안정적인 커널 이벤트 추적
XDP (eXpress Data Path)NIC 드라이버 레벨에서 패킷 처리고성능 패킷 필터링, DDoS 방어
TC (Traffic Control)네트워크 스택에서 패킷 처리네트워크 정책 적용
uprobe사용자 공간 함수 추적애플리케이션 프로파일링
LSM hookLinux Security Module 훅보안 정책 적용

맵 (Maps)

eBPF 프로그램은 상태를 유지하기 위해 맵을 사용한다. 맵은 커널과 사용자 공간 사이에서 데이터를 공유하는 자료구조다.

// 해시 맵 정의 예시
struct {
    __uint(type, BPF_MAP_TYPE_HASH);
    __uint(max_entries, 1024);
    __type(key, __u32);    // IP 주소
    __type(value, __u64);  // 패킷 카운트
} pkt_count SEC(".maps");

맵 종류: Hash, Array, Ring Buffer, LRU Hash, Perf Event Array 등 다양한 종류가 있다.

주요 활용 사례

1. 네트워킹

XDP를 이용한 고성능 패킷 처리

XDP는 패킷이 커널 네트워크 스택에 도달하기 전, NIC 드라이버 수준에서 처리한다. 기존 iptables 대비 수배에서 수십 배 빠른 처리가 가능하다.

패킷 수신
   ↓
NIC 드라이버
   ↓
XDP 훅 (eBPF 프로그램 실행)
   ↓
XDP_DROP    → 패킷 즉시 폐기 (DDoS 방어)
XDP_TX      → 같은 NIC로 다시 전송 (로드밸런서)
XDP_PASS    → 일반 커널 네트워크 스택으로 전달
XDP_REDIRECT → 다른 인터페이스나 CPU로 전달

Kubernetes 네트워킹 최적화

기존 kube-proxy는 iptables 규칙을 대량으로 생성하고 관리한다. 서비스 수가 많아질수록 iptables 규칙이 기하급수적으로 늘어 성능이 저하된다.

eBPF 기반 네트워킹(Cilium)은 iptables 없이 eBPF 맵으로 서비스 라우팅을 처리하므로 O(1) 시간 복잡도로 패킷을 처리할 수 있다.

2. 보안 (Runtime Security)

시스템 콜 모니터링

// execve 시스템 콜 추적 예시 (간략화)
SEC("tracepoint/syscalls/sys_enter_execve")
int trace_execve(struct trace_event_raw_sys_enter *ctx)
{
    struct event *event;
    char comm[TASK_COMM_LEN];
    
    bpf_get_current_comm(&comm, sizeof(comm));
    // 이벤트 로그 기록
    return 0;
}

실행 파일 실행, 네트워크 연결, 파일 접근 등 시스템 콜 수준에서 실시간 모니터링이 가능하다. 컨테이너 내부에서도 호스트 커널을 통하므로 탐지를 피할 수 없다.

LSM (Linux Security Module) 기반 강제 접근 제어

eBPF + LSM을 결합하면 동적으로 보안 정책을 적용할 수 있다. 기존 SELinux나 AppArmor와 달리, 재부팅 없이 정책을 업데이트할 수 있다.

3. 관측성 (Observability)

성능 프로파일링

# bpftrace로 특정 함수 실행 시간 추적
bpftrace -e 'kprobe:vfs_read { @start[tid] = nsecs; }
             kretprobe:vfs_read /@start[tid]/ {
               @ns = hist(nsecs - @start[tid]);
               delete(@start[tid]);
             }'

애플리케이션 레벨 추적 (Zero-instrumentation)

애플리케이션 코드 수정 없이 uprobe를 통해 함수 호출, HTTP 요청, 데이터베이스 쿼리 등을 추적할 수 있다.

기존 방식: 애플리케이션에 에이전트/SDK 삽입 필요
eBPF 방식: 바이너리 수정 없이 커널에서 투명하게 추적

네트워크 플로우 모니터링

TCP 연결 생성/종료, 지연 시간, 오류율을 서비스 단위로 집계할 수 있다. 사이드카 프록시(Envoy 등) 없이 서비스 메시의 L7 관측성을 구현하는 것도 가능하다.

주요 eBPF 기반 도구

도구분야설명
Cilium네트워킹/보안Kubernetes CNI, eBPF 기반 네트워크 정책, 로드밸런싱
Falco보안런타임 위협 탐지, 시스템 콜 기반 이상 행동 감지
Pixie관측성코드 변경 없이 자동 원격 측정 데이터 수집
bpftrace디버깅/트레이싱커널/애플리케이션 동적 추적 스크립트 도구
BCC개발 도구Python/Lua로 eBPF 프로그램 작성 도구 모음
Hubble네트워크 관측성Cilium 기반 Kubernetes 네트워크 플로우 가시화
Tetragon보안Cilium 프로젝트의 런타임 보안 및 감사 도구

eBPF vs 기존 접근 방식

기능기존 방식eBPF 방식
네트워크 정책iptables 규칙eBPF 맵 + XDP/TC
성능 추적sysfs, perfkprobe/tracepoint + 맵
보안 모니터링커널 모듈 or 에이전트LSM + kprobe
서비스 메시사이드카 프록시eBPF 기반 커널 처리
커널 수정 비용커널 재빌드, 재부팅동적 로드, 재부팅 불필요

eBPF의 제약 사항

런타임 제한

  • 프로그램 크기 제한 (명령어 수 제한, 커널 버전마다 다름)
  • 스택 크기 제한 (512 바이트)
  • 루프는 제한적으로만 허용 (bounded loops)
  • 커널 함수 중 eBPF에서 호출 가능한 것만 사용 가능 (bpf helpers)

커널 버전 의존성

eBPF 기능은 커널 버전마다 지원 범위가 다르다. 주요 기능 기준:

  • 리눅스 4.1: perf events
  • 리눅스 4.8: XDP 지원
  • 리눅스 5.2: BTF (BPF Type Format) 기반 CO-RE 지원
  • 리눅스 5.7: LSM BPF 지원

BTF와 CO-RE

커널 버전마다 내부 자료구조가 다르기 때문에, 예전에는 대상 커널에 맞게 eBPF 프로그램을 재컴파일해야 했다. BTF(BPF Type Format)와 CO-RE(Compile Once – Run Everywhere)가 도입되면서 한 번 컴파일한 eBPF 프로그램이 여러 커널 버전에서 실행될 수 있게 됐다.

핵심 정리

  • eBPF는 커널을 수정하거나 재부팅하지 않고 커널 동작을 안전하게 확장하는 기술이다.
  • Verifier가 안전성을 보장하고, JIT 컴파일로 네이티브 코드 수준의 성능을 낸다.
  • 네트워킹(XDP, Cilium), 보안(Falco, Tetragon), 관측성(Pixie, bpftrace) 분야에서 활발히 사용된다.
  • Kubernetes 환경에서 iptables를 대체하거나 사이드카 없이 서비스 메시 기능을 구현하는 데 핵심 역할을 한다.
  • 커널 버전 의존성이 존재하고 BTF/CO-RE로 이식성 문제를 해결해가고 있다.