📌 XDP와 eBPF는 어떻게 연결될까?
✅ XDP (eXpress Data Path)는 eBPF 기술을 활용하여 초고속 패킷 처리를 가능하게 하는 네트워크 기술입니다.
✅ eBPF (Extended Berkeley Packet Filter)는 커널에서 동적으로 실행할 수 있는 경량 가상 머신(VM) 환경입니다.
✅ XDP는 eBPF 프로그램을 실행하는 한 가지 방법이며, eBPF 기반으로 네트워크 패킷을 필터링, 수정 및 리디렉트할 수 있음.
🔎 1. XDP와 eBPF의 관계
XDP는 eBPF의 특정한 활용 방식 중 하나입니다.
🔹 eBPF는 커널에서 실행되는 동적 프로그램이며, 다양한 기능을 수행할 수 있음.
🔹 XDP는 eBPF를 사용하여 네트워크 인터페이스(NIC) 수준에서 패킷을 초고속으로 처리하는 기술.
🔥 eBPF와 XDP의 관계
┌──────────────────────────┐
│ eBPF │
│ ┌──────────────────────┐ │
│ │ XDP │ │ <--- eBPF 프로그램을 사용하여 패킷 필터링 (L2~L4 처리)
│ │ kprobe │ │ <--- eBPF 프로그램을 사용하여 커널 함수 추적
│ │ tracepoints │ │ <--- eBPF 프로그램을 사용하여 이벤트 로깅
│ │ cgroup-bpf │ │ <--- eBPF 프로그램을 사용하여 컨테이너 리소스 관리
│ └──────────────────────┘ │
└──────────────────────────┘
✅ eBPF는 XDP의 기반 기술이며, XDP는 eBPF 프로그램을 실행하여 네트워크 패킷을 처리하는 역할을 합니다.
🔎 2. XDP와 eBPF의 차이점
기능 | XDP | eBPF |
역할 | 초고속 네트워크 패킷 처리 | 커널 내에서 동적 프로그래밍 가능 |
주 사용처 | 패킷 필터링, DDoS 방어, 네트워크 가속 | 네트워크, 보안, 시스템 모니터링 |
패킷 처리 위치 | NIC (Network Interface Card) 수준 | 커널 내부의 다양한 위치 |
패킷 조작 가능 여부 | 가능 (Drop, Pass, Redirect) | 가능 (필터링, 로깅, 수정 등) |
속도 | 초고속 (Zero-Copy 기반) | 속도는 사용 위치에 따라 다름 |
✅ XDP는 eBPF의 하위 개념이며, 네트워크 패킷을 초고속으로 처리하는 역할을 합니다.
✅ eBPF는 XDP뿐만 아니라, 다양한 기능을 수행하는 커널 확장 기술입니다.
🔎 3. XDP가 eBPF를 활용하는 방식
✅ XDP는 eBPF 프로그램을 로드하여 NIC에서 패킷을 처리합니다.
✅ 즉, XDP 프로그램은 eBPF로 작성되며, eBPF 가상 머신에서 실행됩니다.
🔥 XDP를 사용하면 패킷이 커널 네트워크 스택을 거치지 않고 바로 처리됨!
패킷 → XDP (eBPF 프로그램 실행) → Drop, Modify, Redirect, Pass 결정
📌 XDP의 주요 기능
- XDP_DROP → 패킷을 즉시 차단 (DDoS 방어, 방화벽)
- XDP_PASS → 패킷을 커널 네트워크 스택으로 전달
- XDP_REDIRECT → 패킷을 다른 인터페이스로 전달
- XDP_TX → 패킷을 다시 전송 (로드밸런싱)
🔎 4. XDP/eBPF 실전 코드 예제
✅ (1) XDP + eBPF를 사용한 패킷 필터링
📌 xdp_filter.c (XDP 프로그램 - eBPF 기반)
#include <linux/bpf.h>
#include <linux/if_ether.h>
#include <linux/ip.h>
#include <linux/tcp.h>
#include <bpf/bpf_helpers.h>
SEC("xdp") // XDP 프로그램
int xdp_filter(struct __sk_buff *skb) {
struct ethhdr *eth = bpf_hdr_pointer(skb, 0, sizeof(*eth));
if (!eth) return XDP_PASS;
struct iphdr *ip = bpf_hdr_pointer(skb, sizeof(*eth), sizeof(*ip));
if (!ip) return XDP_PASS;
__u32 client_ip = bpf_htonl(0xC0A80101); // 192.168.1.1
__u32 server_ip = bpf_htonl(0xC0A80102); // 192.168.1.2
if (ip->saddr == client_ip || ip->daddr == server_ip) {
bpf_printk("Allowed Packet: Client IP or Server IP matched\n");
return XDP_PASS;
}
return XDP_DROP; // 패킷 차단
}
char LICENSE[] SEC("license") = "GPL";
✅ 설명
- XDP 프로그램이 NIC에서 직접 패킷을 필터링
- 특정 Client IP / Server IP 패킷만 허용
- DDoS 방어, 방화벽 역할 가능
✅ (2) eBPF XDP 프로그램 실행하기
📌 load_xdp.py (Python으로 XDP 프로그램 실행)
from bcc import BPF
bpf_code = """
#include <linux/bpf.h>
#include <linux/if_ether.h>
#include <linux/ip.h>
#include <linux/tcp.h>
SEC("xdp")
int xdp_filter(struct __sk_buff *skb) {
struct ethhdr *eth = bpf_hdr_pointer(skb, 0, sizeof(*eth));
if (!eth) return XDP_PASS;
struct iphdr *ip = bpf_hdr_pointer(skb, sizeof(*eth), sizeof(*ip));
if (!ip) return XDP_PASS;
__u32 client_ip = bpf_htonl(0xC0A80101);
__u32 server_ip = bpf_htonl(0xC0A80102);
if (ip->saddr == client_ip || ip->daddr == server_ip) {
return XDP_PASS;
}
return XDP_DROP;
}
"""
bpf = BPF(text=bpf_code)
fn = bpf.load_func("xdp_filter", BPF.XDP)
bpf.attach_xdp("eth0", fn, 0)
print("XDP 프로그램 로드 완료. TCP/UDP 패킷 필터링 시작...")
try:
bpf.trace_print()
except KeyboardInterrupt:
pass
bpf.remove_xdp("eth0", 0)
✅ 설명
- Python bcc 라이브러리를 사용하여 XDP eBPF 프로그램 실행
- 특정 Client IP 및 Server IP 필터링 수행
- 불필요한 패킷을 XDP_DROP으로 즉시 차단
🚀 결론: XDP와 eBPF의 관계 정리
비교 항목 | XDP | eBPF |
역할 | 네트워크 패킷을 초고속으로 처리 | 커널에서 동적 프로그램 실행 |
사용 목적 | DDoS 방어, 방화벽, 패킷 필터링 | 네트워크, 보안, 시스템 모니터링 |
실행 위치 | NIC 수준에서 실행 (L2~L4) | 커널 내부 다양한 위치에서 실행 가능 |
속도 | 초고속 (Zero-Copy 기반) | 속도는 위치에 따라 다름 |
🚀 결론:
- XDP는 eBPF 프로그램을 실행하여 네트워크 패킷을 초고속으로 처리하는 역할
- eBPF는 네트워크뿐만 아니라 시스템 모니터링, 보안 등 다양한 역할 수행 가능
➡ XDP를 클라우드(AWS, GCP)에서 사용할지, 온프레미스 환경에서 사용할지 알려주시면 추가 최적화 가능! 🚀
'장인으로의 여정 > 유용한 TIP' 카테고리의 다른 글
🚀 XDP 기반 세션 관리 방법 (0) | 2025.02.23 |
---|---|
🚀 XDP (eXpress Data Path) 완벽 가이드 (1) | 2025.02.23 |
🚀 eBPF (Extended Berkeley Packet Filter) 완벽 가이드 (0) | 2025.02.23 |
댓글