Linux 패킷 처리를 위한 XDP 및 eBPF
14분 소요 - 2026년 5월 27일
NIC 드라이버 수준에서 초당 수백만 개의 패킷을 처리하는 XDP와 eBPF의 방식. 벤치마크, DDoS 사용 사례, 툴체인 설정 및 하드웨어 요구 사항.
고성능 패킷 처리를 위한 XDP 및 eBPF
XDP(eXpress Data Path)와 eBPF(extended Berkeley Packet Filter)는 커널의 일반 네트워킹 스택이 개입하기 전에 리눅스가 네트워크 패킷을 처리할 수 있게 해줍니다. XDP는 들어오는 모든 패킷에 대해 메모리 구조를 할당하는 대신, NIC 드라이버 단계에서 바로 트래픽을 가로채어 처리 방식을 결정한 후, 패킷을 삭제(drop), 전달(forward) 또는 재전송(redirect)합니다. 그 결과 코어당 초당 수백만 개의 패킷을 처리할 수 있으며, 다음과 같은 기존 도구에 비해 CPU 오버헤드는 극히 일부에 불과합니다. iptables.
eBPF와 XDP의 연동 방식
eBPF는 리눅스 커널 내부의 가상 머신입니다. eBPF는 안전성(무한 루프 없음, 무단 메모리 액세스 없음)이 검증된 사용자 정의 바이트코드를 실행한 후, 이를 네이티브 CPU 명령어로 JIT(Just-In-Time) 컴파일합니다. 프로그램의 범위는 제한적입니다. 임의의 커널 함수를 호출할 수 없으며, 맵 조회나 패킷 리디렉션과 같은 작업을 위한 미리 정의된 헬퍼 세트만 사용할 수 있습니다.
상태 관리를 위해 eBPF는 맵(map)을 사용합니다. 맵은 패킷 도착 간에도 유지되는 키/값 저장소(해시 테이블, 배열, LPM 트라이)입니다. 맵은 사용자 공간에서 읽기 및 쓰기가 가능하므로, 프로그램을 재로드하지 않고도 차단 목록이나 라우팅 규칙을 업데이트할 수 있습니다.
XDP는 eBPF의 훅 지점입니다. 이는 커널이 sk_buff (기존 네트워킹 스택이 의존하는 패킷당 200~300바이트 크기의 메타데이터 객체)를 할당하기 전에 연결됩니다. 이 할당 과정을 건너뛰는 것이 바로 성능 향상의 원천입니다.
XDP는 세 가지 모드로 실행됩니다:
- 네이티브 모드: NIC 드라이버 내부에서 실행됩니다. 최고의 성능을 제공합니다.
- 오프로드 모드: NIC의 ASIC에서 실행됩니다. CPU를 완전히 해방시킵니다.
- 일반 모드: 할당 후 실행됩니다.
sk_buff할당 후 실행됩니다. 지원되지 않는 하드웨어에서 테스트할 때 유용하지만, 성능 이점은 없습니다.
각 패킷을 처리한 후, XDP 프로그램은 판정을 반환합니다:
| 판정 | 조치 |
|---|---|
XDP_DROP | 드라이버 수준에서 패킷을 폐기 |
XDP_PASS | 일반 네트워킹 스택으로 전달 |
XDP_TX | 동일한 인터페이스를 통해 다시 전송 |
XDP_REDIRECT | 다른 NIC 또는 AF_XDP 사용자 공간 소켓으로 리디렉션 |
XDP_ABORTED | 프로그램 오류로 인해 드롭하고, 추적 이벤트를 기록 |
XDP 대 iptables: 성능 벤치마크
수치는 확연합니다. iptables 코어당 초당 약 200,000개의 패킷을 처리합니다. nftables 이는 약 400,000 pps로 향상됩니다. 네이티브 모드의 XDP는 동일한 하드웨어에서 코어당 1,000만~4,000만 pps를 처리합니다.
이유는 간단합니다. XDP_DROP 한 번의 경계 검사 및 반환 값이 소요됩니다. iptables DROP은 sk_buff 할당, netfilter 체인 탐색, 연결 추적 조회, DROP 작업 자체, 그리고 할당 해제를 필요로 합니다. 64바이트 패킷으로 100Gbps를 처리할 경우, 서버는 초당 1억 4,800만 개의 패킷을 처리하게 되며, 패킷당 약 100나노초가 남게 됩니다. 이러한 규모에서는 sk_buff 할당이 병목 현상이 됩니다.
CPU 사용량 절감 효과도 그만큼 큽니다. 한 벤치마크에서 차단 목록을 iptables XDP로 전환한 결과, 100만 pps에서 소프트웨어 인터럽트 CPU 사용량이 28%에서 3%로 감소했습니다. 이렇게 확보된 여유 자원을 활용하여 동일한 서버에서 애플리케이션 프로세스, 데이터베이스 또는 가상 머신을 실행할 수 있습니다.
DDoS 완화 및 보안
XDP의 가장 강력한 호스팅 활용 사례는 DDoS 완화입니다. 드라이버 수준에서 작동하기 때문에 악성 패킷은 커널의 네트워킹 스택에 도달하기 전에 차단됩니다. XDP를 실행하는 단일 코어는 초당 2,600만 개의 패킷을 차단할 수 있습니다.
Cloudflare는 적어도 2018년부터 대용량 DDoS 완화를 위해 L4Drop이라는 XDP 기반 시스템을 사용해 왔습니다. 이 시스템은 XDP 컨텍스트 내에서 공격 트래픽을 처리하고 차단하여, 해당 트래픽이 애플리케이션 계층에 도달하는 것을 방지합니다. 오픈소스 XDP 레이어 4 로드 밸런서인 Meta의 Katran은 코어당 초당 1,000만 개 이상의 패킷으로 Facebook과 Instagram의 트래픽을 처리합니다.
동적 필터링의 경우, 다음과 같은 eBPF 맵을 사용하면 BPF_MAP_TYPE_LPM_TRIE 를 사용하면 단일 조회로 개별 IP와 CIDR 서브넷을 아우르는 IP 차단 목록을 관리할 수 있습니다. 업데이트는 사용자 공간에서 실시간으로 이루어지며, 프로그램 재시작이 필요하지 않습니다. 공격이 진행 중일 때 bpftool:
bpftool map update id <MAP_ID> key <KEY_VALUE> value <VALUE>가시성을 위해 eBPF는 커널 데이터 경로에서 직접 애플리케이션별, IP별, 플로우별 메트릭을 수집합니다. xdp_md 컨텍스트는 다음과 같은 텔레메트리 정보를 제공합니다 ingress_ifindex 및 rx_queue_index와 같은 텔레메트리 데이터를 제공하므로, 어떤 인터페이스나 큐에 부하가 걸려 있는지 파악할 수 있습니다. 장기적인 모니터링을 위해 ebpf_exporter 와 같은 도구를 사용하여 원시 eBPF 맵 데이터를 Prometheus 호환 메트릭으로 변환하여 Grafana에서 시각화할 수 있습니다.
도구, 배포 및 하드웨어 요구 사항
이 툴체인은 제한된 C 코드를 eBPF 바이트코드로 컴파일하기 위해 Clang과 LLVM으로 시작됩니다. 그 다음에는 로더 라이브러리가 필요합니다:
libbpf: 프로덕션 환경에서 사용되는 표준 C 라이브러리입니다. 커널 간 이식성을 위해 CO-RE(Compile Once, Run Everywhere)를 지원합니다.libxdp: XDP 전용으로, 단일 인터페이스에서 여러 XDP 프로그램을 실행할 수 있도록 지원합니다.cilium/ebpf: Go 기반 스택을 위한 순수 Go 라이브러리입니다.
관리용으로는 bpftool 실행 중인 프로그램과 맵 내용을 검사할 수 있게 해줍니다. xdp-loader ( xdp-tools )는 로딩 및 언로딩을 처리합니다. BCC는 Python/Lua 프론트엔드를 사용한 프로토타이핑에 유용하지만, libbpf 실전 환경에서는 CO-RE를 사용하는 것이 더 나은 선택입니다.
배포 전에 BPF JIT 컴파일러를 활성화하십시오:
sysctl -w net.core.bpf_jit_enable=1다운타임 없는 업데이트를 위해 XDP_FLAGS_REPLACE 플래그를 사용하여 실행 중인 프로그램을 원자적으로 교체하십시오. 맵을 /sys/fs/bpf/ 로 고정하여 로더 종료 후에도 유지되도록 하십시오.
하드웨어 및 커널 호환성
XDP는 커널 4.8에서 도입되었으나, 전체 기능을 사용하려면 5.x 이상을 권장합니다. 다음 명령어로 커널 버전을 확인하고 uname -r 를 사용하여 커널을 확인하고, /sys/fs/bpf/.
사용 가능한 XDP 기능은 NIC 드라이버에 따라 결정됩니다:
| 드라이버 | 기본 XDP | 리디렉션 | 제로 카피 (AF_XDP) |
|---|---|---|---|
mlx5_core | 예 | 예 | 예 |
i40e | 예 | 예 | 예 |
ixgbe | 예 | 예 | 예 |
virtio_net | 예 | 예 | 아니요 |
ena (아마존) | 예 | 예 | 아니요 |
다음 링크에서 드라이버를 확인하세요 ethtool -i <interface>. 네이티브 모드가 지원되지 않으면 시스템은 일반 모드로 전환되며, 이 모드는 sk_buff 할당 후 실행되며 성능상의 이점을 제공하지 않습니다.
XDP 프로그램을 연결하기 전에 GRO와 LRO를 비활성화하십시오. 이 둘은 충돌합니다:
ethtool -K <iface> gro off lro off표준 XDP는 패킷이 단일 4,096바이트 메모리 페이지에 들어갈 것을 요구합니다. i40e 및 ice 드라이버에서 x86 MTU 제한은 3,046바이트입니다.
XDP 시작하기
먼저 환경을 평가해 보십시오. uname -r 명령어를 실행하여 커널 4.8 이상(5.x 권장)인지 확인하고, ethtool -i <interface> 명령어를 실행하여 네이티브 XDP 드라이버 지원 여부를 확인하십시오.
강제 적용이 아닌 가시성 확보부터 시작하십시오. eBPF 맵을 사용하여 트래픽을 분류하고 집계함으로써 정상 활동의 기준선을 확보하십시오. 트래픽 패턴을 파악한 후에는 강제 적용 단계로 넘어가십시오: 먼저 xdpgeneric 모드로 테스트한 후, xdpdrv (네이티브) 모드로 전환하십시오.
XDP는 원시 대역폭이 아닌 패킷 수준 필터링을 처리한다는 점을 명심하십시오. 100Gbps 규모의 대규모 공격의 경우, 베어메탈 인프라 및 BGP FlowSpec과 함께 사용하여 서버에 도달하기 전에 업스트림 트래픽을 관리하십시오.
빠른 패킷 필터링이 필요한 트래픽이 많은 워크로드를 실행 중인 경우, FDC의 전용 서버는 XDP의 성능을 최대한 활용할 수 있는 베어메탈 기반을 제공합니다.
Linux 패킷 처리를 위한 XDP 및 eBPF
NIC 드라이버 수준에서 초당 수백만 개의 패킷을 처리하는 XDP와 eBPF의 방식. 벤치마크, DDoS 사용 사례, 툴체인 설정 및 하드웨어 요구 사항.
14분 소요 - 2026년 5월 27일
강력하고 계량되지 않는 VPS가 중요한 이유
3분 소요 - 2025년 5월 9일

질문이 있거나 맞춤형 솔루션이 필요하신가요?
유연한 옵션
글로벌 도달 범위
즉시 배포
유연한 옵션
글로벌 도달 범위
즉시 배포