eBPF와 XDP로 설계하는 커널 네트워크 패킷 처리

eBPF, XDP, DPDK, AF_XDP의 실행 위치와 패킷 처리 경로를 비교하고 DDoS 방어와 L4 로드 밸런서 설계에 적용하는 방법을 정리한다.

2026-08-14 · 최초 발행 2026-01-19

패킷 경로가 길어질수록 커지는 비용

현대 네트워크 애플리케이션은 수백만 패킷/초(Mpps) 처리량과 마이크로초 단위 지연시간을 요구한다. 범용성을 전제로 만든 전통적 커널 네트워크 스택은 이런 조건에서 여러 단계의 처리 비용을 감수한다.

NIC(네트워크 카드)하드웨어인터럽트소프트IRQ(NET_RX_SOFTIRQ)네트워크 드라이버(sk_buff 할당)IP 레이어(라우팅, 필터링)전송 레이어(TCP/UDP)소켓 버퍼(커널 공간)사용자 공간복사애플리케이션처리 지연(수십 마이크로초)

NIC에서 애플리케이션까지의 경로에는 메모리 복사, 컨텍스트 스위칭, 프로토콜 처리가 겹친다. 패킷마다 CPU 인터럽트가 발생하고, 커널과 사용자 공간 사이의 복사가 이어진다. 프로세스 전환은 캐시를 무효화할 수 있으며, sk_buff 할당과 IP·TCP 체크섬, 세그먼테이션 처리도 누적 비용이 된다.

커널 안에서 실행되는 eBPF 프로그램

eBPF는 커널에서 안전하게 실행되는 샌드박스 가상머신이다. C로 작성한 프로그램을 커널에서 실행할 수 있으며, 네트워크뿐 아니라 트레이싱과 보안 관련 훅에도 붙일 수 있다.

C 소스 코드(eBPF 프로그램)Clang/LLVM(컴파일)eBPF 바이트코드(.o 파일)bpf() 시스템eBPF 검증기(안전성 검사)JIT 컴파일러(x86/ARM 코드)커널 메모리(실행 준비) 포인트부착

프로그램은 Clang으로 컴파일돼 eBPF 바이트코드가 되고, bpf() 시스템 콜을 통해 커널로 전달된다. 검증기가 무한 루프와 메모리 침범 가능성을 검사한 뒤 JIT 컴파일러가 네이티브 머신 코드로 바꾸고, 그 결과를 원하는 훅 포인트에 부착한다.

커널과 사용자 공간이 상태를 주고받을 때는 eBPF 맵을 사용한다. 플로우 상태 추적에는 BPF_MAP_TYPE_HASH, 통계 카운터에는 BPF_MAP_TYPE_ARRAY를 쓸 수 있다. BPF_MAP_TYPE_LRU_HASH는 LRU 기반 제거가 필요한 해시 테이블이고, BPF_MAP_TYPE_PERCPU_ARRAY는 CPU별로 분리된 락 없는 통계에 적합하다.

이 구조는 XDP 기반 DDoS 방어나 방화벽, kprobe·uprobe 기반 함수 추적, 실시간 트래픽 분석과 플로우 통계, Seccomp-BPF 및 LSM(Linux Security Module) 훅에 활용된다.

XDP가 패킷을 초기에 분기하는 방식

XDP(eXpress Data Path)는 NIC 드라이버 수준에서 eBPF 프로그램을 실행한다. 패킷이 일반 커널 네트워크 스택에 도착하기 전에 처리 방향을 결정할 수 있다는 점이 핵심이다.

XDP_PASSXDP_DROPXDP_TXXDP_REDIRECT메모리 해제NIC(네트워크 카드)RX Ring(수신 큐)XDP Hook(드라이버 레벨)eBPF 프로그램판단커널 네트워크스택즉시 폐기(DDoS 방어)동일 인터페이스재전송다른 인터페이스전달상위 프로토콜처리다른 NIC

XDP 프로그램은 XDP_PASS, XDP_DROP, XDP_TX, XDP_REDIRECT 가운데 하나를 반환한다. 정상 패킷은 커널 스택으로 통과시키고, 불필요하거나 악성으로 판단한 패킷은 즉시 폐기할 수 있다. 같은 인터페이스로 재전송하거나 다른 인터페이스로 넘기는 경로도 제공한다.

실행 방식은 NIC 드라이버가 네이티브로 지원하는 Native XDP, SmartNIC에서 실행하는 Offloaded XDP, 드라이버 지원 없이 커널에서 에뮬레이션하는 Generic XDP로 구분된다. 성능과 호환성의 조건이 서로 다르다.

원본의 성능 특성은 단일 코어에서 1000만 pps(패킷/초) 이상 처리량, DDoS 필터링에서 100ns 이하 지연시간이다. 패킷 메모리를 재사용하는 Zero-Copy와 여러 패킷을 묶는 배치 처리도 복사 비용과 캐시 효율에 영향을 준다.

다음 코드는 소스 IP별 패킷 레이트를 조회하고, 임계값을 넘은 패킷을 XDP 단계에서 폐기하는 예시다.

SEC("xdp")
int xdp_ddos_filter(struct xdp_md *ctx) {
    void *data_end = (void *)(long)ctx->data_end;
    void *data = (void *)(long)ctx->data;
    struct ethhdr *eth = data;

    // 패킷 경계 검사
    if ((void *)(eth + 1) > data_end)
        return XDP_DROP;

    // IP 헤더 파싱
    struct iphdr *ip = (void *)(eth + 1);
    if ((void *)(ip + 1) > data_end)
        return XDP_DROP;

    // 소스 IP 기반 레이트 리밋 (맵 조회)
    __u32 src_ip = ip->saddr;
    __u64 *rate = bpf_map_lookup_elem(&rate_limit_map, &src_ip);

    if (rate && *rate > THRESHOLD)
        return XDP_DROP;  // 임계값 초과 시 폐기

    return XDP_PASS;  // 정상 패킷은 커널 스택으로
}

커널을 거치지 않는 DPDK와 AF_XDP

DPDK(Data Plane Development Kit)는 사용자 공간에서 NIC를 직접 제어하는 프레임워크다. PMD(Poll Mode Driver)는 인터럽트 대신 폴링으로 패킷을 받고, Huge Pages의 2MB/1GB 페이지는 TLB 미스를 줄이는 데 사용된다. CPU Affinity로 스레드를 특정 코어에 고정해 캐시 효율을 높이고, 커널 우회와 Zero-Copy로 메모리 복사를 제거한다.

NIC(DPDK PMD)사용자 공간DMA 메모리rte_mbuf(패킷 버퍼)DPDK 애플리케이션(패킷 처리)전송(TX Ring)NIC 전송커널 우회(시스템 없음)Huge Pages(TLB 최적화)

DPDK는 NIC를 사용자 공간에서 직접 제어하고 DMA로 패킷 메모리를 읽으므로 커널을 완전히 우회한다. 라우터와 VNF처럼 전용 애플리케이션에서 극한 성능이 필요할 때의 선택지다.

특성 DPDK XDP
실행 위치 사용자 공간 커널 공간
커널 통합 우회 통합
성능 극한 성능 매우 높음
유연성 전용 애플리케이션 범용 패킷 처리
학습 곡선 가파름 중간
사용 사례 라우터, VNF DDoS 방어, LB

AF_XDP는 XDP 프로그램이 처리한 패킷을 사용자 공간으로 Zero-Copy로 전달하는 소켓 계열이다. 사용자 공간 메모리인 UMEM을 커널과 공유하고, RX/TX Queue Pair로 비동기 통신을 수행한다. XDP 프로그램은 XDP_REDIRECT로 패킷을 AF_XDP 소켓으로 보낸다.

사용자 공간애플리케이션UMEM(공유 메모리)XDP 프로그램NIC사용자 공간애플리케이션UMEM(공유 메모리)XDP 프로그램NIC패킷 수신eBPF 필터링XDP_REDIRECT(UMEM 주소)poll()(패킷 대기)패킷 디스크립터(포인터 전달)패킷 처리TX 큐 삽입패킷 전송

애플리케이션은 poll()로 UMEM의 패킷을 기다리고, 복사 대신 패킷 디스크립터의 포인터를 전달받는다. 처리 후에는 TX 큐에 넣어 NIC로 전송한다.

L4 로드 밸런서 경로에 XDP를 배치할 때

XDP 기반 로드 밸런서는 패킷의 5-튜플 해시로 백엔드를 고른다. DSR(Direct Server Return)을 사용하면 응답 트래픽은 로드 밸런서를 경유하지 않는다.

DSR(Direct Server Return)응답 직접 전송클라이언트요청XDP 프로그램(로드 밸런서)해시 기반백엔드 선택백엔드 1(192.168.1.10)백엔드 2(192.168.1.11)백엔드 3(192.168.1.12)

백엔드 목록은 eBPF 맵에 두고 사용자 공간에서 동적으로 갱신할 수 있다. 사용자 공간 데몬은 백엔드 상태를 주기적으로 확인하며, Weighted Round Robin으로 백엔드별 부하를 조절한다. 세션 친화성이 필요하면 Conntrack 맵으로 연결을 추적한다.

측정과 운영 통제

XDP 성능을 측정할 때는 pktgen 같은 도구로 XDP가 없는 커널 스택의 처리량을 먼저 확인한다. 이어서 모든 패킷을 폐기하는 XDP_DROP, 다른 인터페이스로 전달하는 XDP_REDIRECT 경로를 측정하고, 멀티 코어에서 선형 확장 여부를 살핀다.

프로파일링에는 eBPF 프로그램의 CPU 사이클을 분석하는 perf, 프로그램과 맵 상태를 조회하는 bpftool, 패킷 처리 경로를 동적으로 추적하는 bpftrace, CPU 프로파일에서 병목을 찾는 flamegraph를 사용할 수 있다.

커널에서 실행되는 코드는 검증과 권한 통제가 전제다. eBPF 검증기는 제한된 반복 횟수만 허용해 무한 루프를 막고, 범위 검사로 커널 메모리 침범을 방지한다. 임의 포인터 산술을 제한하며, 커널 API도 허용된 헬퍼 함수로만 노출한다.

XDP 프로그램 로드에는 CAP_BPF 또는 CAP_SYS_ADMIN 권한이 필요하다. 프로그램 서명 검증으로 무결성을 확인하고, 맵 크기와 프로그램 복잡도를 제한해 DoS를 방지하며, 로드·언로드 이벤트는 Audit 로깅으로 기록한다.

DDoS 방어와 Katran에서 보이는 적용 형태

Cloudflare는 XDP를 사용해 초당 수억 패킷의 DDoS 공격을 방어한다. 드라이버 레벨에서 악성 트래픽을 조기에 차단하고, 소스 IP별 패킷 레이트를 추적해 제한한다. 알려진 공격 패턴은 eBPF 맵에 저장해 빠르게 매칭하며, 공격 유형별 실시간 통계는 Prometheus로 전송한다.

Facebook은 XDP 기반 L4 로드 밸런서 Katran을 오픈소스로 공개했다. Katran은 Maglev 해싱으로 백엔드 변경 중에도 세션을 유지하고, 백엔드 전달에는 IPIP 캡슐화를 사용한다. 여러 로드 밸런서 노드 간 상태를 공유하며, 단일 서버에서 초당 1000만 pps 처리량을 달성했다.

eBPF와 XDP는 커널 통합과 안전성 검증을 유지하면서 패킷 판단을 드라이버 레벨로 앞당긴다. 커널을 완전히 우회해야 하는 경로에는 DPDK를, XDP의 초기 분기와 사용자 공간 처리를 함께 써야 하는 경로에는 AF_XDP를 검토할 수 있다.

eBPFXDP커널 네트워크DPDK패킷 처리