XDP란 무엇인가?
- XDP(eXpress Data Path)는 리눅스 커널에서 패킷을 매우 빠르게 처리하기 위한 패킷 처리 프레임워크 기술
- 패킷이 커널의 네트워크 스택을 거치기 전에 처리할 수 있어 더 빠르다
- 네트워크 드라이버 레벨에서 eBPF 프로그램을 실행.
- Q. 그럼 NIC 카드가 중요하겠네? 카드 따라 안될수도 있고 , VM이면??

을 나타낸다. Cilium은 eBPF 기술을 사용하여 커널의 더 낮은 단계(XDP, TC)에서 패킷을 가로채 성능을 극대화한다.
| 처리 지점 | 작동 위치 | 성능 (속도) | 주요 특징 및 역할 |
|---|---|---|---|
| XDP | NIC 드라이버 단계 | 가장 빠름 | 커널 스택 진입 전 패킷 처리. DDoS 방어 및 초고속 로드밸런싱에 최적이다. |
| TC (eBPF) | 커널 네트워크 진입 직후 | 매우 빠름 | Cilium의 주력 동작 지점이다. L3/L4 보안 정책과 컨테이너 간 라우팅을 담당한다. |
| Netfilter | 커널 스택 내부 | 보통 (기존 방식) | iptables가 동작하는 지점이다. 규칙이 많아질수록 CPU 부하가 증가하고 속도가 느려진다. |
| Socket | 애플리케이션 접점 | 가장 느림 | 실제 사용자 프로세스가 데이터를 받는 단계이다. 커널 처리가 모두 끝난 상태이다. |
Cilium XDP를 실제로 활성화했을 때의 성능 벤치마크 결과나, 특정 NIC 드라이버에서의 설정 방법이 궁금하신가요?
Network Card → Driver → Kernel Network Stack → Application
↓ ↓ ↓ ↓
하드웨어 인터럽트 프로토콜 처리 사용자 공간

Network Card → XDP Program → Decision
↓ ↓ ↓
하드웨어 eBPF 실행 즉시 결정

(출처 : SOSCON 2019 ‘Faster Packet Processing in Linux: XDP 이호연님)
XDP 프로그램은 패킷에 대해 다음 중 하나의 액션을 반환합니다:
// XDP 액션 타입들
enum xdp_action {
XDP_ABORTED = 0, // 오류로 인한 패킷 드롭
XDP_DROP, // 패킷 드롭
XDP_PASS, // 네트워크 스택으로 전달
XDP_TX, // 같은 인터페이스로 패킷 재전송
XDP_REDIRECT, // 다른 인터페이스로 리다이렉트
};
#include <linux/bpf.h>
#include <linux/if_ether.h>
#include <linux/ip.h>
SEC("xdp")
int xdp_drop_tcp(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_ABORTED;
// IP 패킷인지 확인
if (eth->h_proto != __constant_htons(ETH_P_IP))
return XDP_PASS;
// IP 헤더 파싱
struct iphdr *ip = (void *)(eth + 1);
if ((void *)(ip + 1) > data_end)
return XDP_ABORTED;
// TCP 패킷 드롭
if (ip->protocol == IPPROTO_TCP)
return XDP_DROP;
return XDP_PASS;
}
Pod Traffic → veth → XDP Program → Policy Decision
↓ ↓ ↓ ↓
애플리케이션 네트워크 eBPF 실행 보안 정책 적용
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
name: ddos-protection
spec:
endpointSelector:
matchLabels:
app: web-server
ingress:
- fromEntities:
- "world"
toPorts:
- ports:
- port: "80"
protocol: TCP
rules:
# XDP 레벨에서 즉시 처리
l3_l4:
- action: DENY
source:
cidr: "10.0.0.0/8"
// XDP 로드 밸런서 예시
SEC("xdp_lb")
int xdp_load_balancer(struct xdp_md *ctx)
{
// 패킷 파싱
if (parse_packet(ctx) < 0)
return XDP_ABORTED;
// 백엔드 서버 선택
__u32 backend = select_backend();
// NAT 수행
if (do_nat(ctx, backend) < 0)
return XDP_ABORTED;
// 백엔드로 리다이렉트
return bpf_redirect(backend_ifindex, 0);
}
# Cilium XDP 정책 확인
cilium bpf lb list
cilium bpf policy get <endpoint-id>
# XDP 프로그램 상태 확인
ip link show dev eth0
# xdpgeneric/id:123 <-- XDP 프로그램 로드됨
| 모드 | 설명 | 성능 | 호환성 |
|---|---|---|---|
| Native XDP | 하드웨어 드라이버에서 직접 실행 | 최고 | 드라이버 지원 필요 |
| Offloaded XDP | NIC 하드웨어에서 실행 | 극한 | 특수 하드웨어 필요 |
| Generic XDP | 커널 네트워크 스택에서 실행 | 보통 | 모든 인터페이스 |
# XDP 성능 테스트 결과 예시
Traditional Stack: 1.2 Mpps (Million packets per second)
Generic XDP: 2.5 Mpps (2배 향상)
Native XDP: 14.7 Mpps (12배 향상)
Offloaded XDP: 25+ Mpps (20배 이상 향상)
# values.yaml
datapathMode: "veth"
bpf:
preallocateMaps: true
# XDP 관련 설정
lbMapMax: 65536
policyMapMax: 16384
monitorAggregation: "medium"
# XDP 모드 설정
xdpMode: "native" # native, generic, disabled
# Cilium ConfigMap 수정
kubectl edit configmap cilium-config -n kube-system
# XDP 관련 설정 추가
data:
enable-xdp-prefilter: "true"
xdp-mode: "native"
xdp-device: "eth0"
# XDP 프로그램 상태 확인
cilium status --verbose
# XDP 메트릭 확인
cilium metrics list | grep xdp
# BPF 맵 상태 확인
cilium bpf lb list
cilium bpf policy get <endpoint-id>
# 패킷 플로우 추적
cilium monitor --type=drop
cilium monitor --type=trace
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
name: microservice-optimization
spec:
endpointSelector:
matchLabels:
app: payment-service
ingress:
- fromEndpoints:
- matchLabels:
app: order-service
toPorts:
- ports:
- port: "8080"
protocol: TCP
# XDP에서 즉시 처리되는 정책
# 외부 로드 밸런서 설정
kubectl apply -f - <<EOF
apiVersion: v1
kind: Service
metadata:
name: frontend-lb
annotations:
service.cilium.io/xdp-offload: "true"
spec:
type: LoadBalancer
selector:
app: frontend
ports:
- port: 80
targetPort: 8080
EOF
// 고성능 보안 필터링
SEC("xdp_security")
int security_filter(struct xdp_md *ctx)
{
// IP 블랙리스트 체크 (해시맵 O(1) 조회)
if (is_blacklisted_ip(src_ip))
return XDP_DROP;
// Rate limiting (per-IP)
if (exceeds_rate_limit(src_ip))
return XDP_DROP;
// 정상 트래픽은 통과
return XDP_PASS;
}
# 드라이버 XDP 지원 확인
ethtool -i eth0 | grep driver
# 지원되는 경우 native 모드 사용
# XDP 모드 설정
cilium config set xdp-mode native
# BPF 맵 크기 조정
bpf:
mapSizePolicy: "static"
policyMapMax: 32768 # 정책 맵 크기
lbMapMax: 131072 # 로드밸런서 맵 크기
natMapMax: 524288 # NAT 맵 크기
# XDP 처리를 특정 CPU 코어에 바인딩
echo 2 > /sys/class/net/eth0/queues/rx-0/rps_cpus
echo 4 > /sys/class/net/eth0/queues/rx-1/rps_cpus
# 문제 진단
dmesg | grep -i xdp
journalctl -u cilium-agent | grep -i xdp
# 해결 방법
# 1. 커널 버전 확인 (4.8+ 필요)
uname -r
# 2. 드라이버 XDP 지원 확인
ethtool -k eth0 | grep xdp
# 3. Generic 모드로 폴백
cilium config set xdp-mode generic
# 성능 모니터링
cilium metrics list | grep -E "(xdp|drop|redirect)"
# BPF 맵 사용률 확인
cilium bpf lb list | wc -l
cilium bpf nat list | wc -l
# 맵 크기 조정이 필요한 경우
kubectl edit configmap cilium-config -n kube-system