본문 바로가기
장인으로의 여정/유용한 TIP

🚀 XDP와 eBPF의 관계

by 유기농프로그래밍 2025. 2. 23.
반응형

📌 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의 주요 기능

  1. XDP_DROP → 패킷을 즉시 차단 (DDoS 방어, 방화벽)
  2. XDP_PASS → 패킷을 커널 네트워크 스택으로 전달
  3. XDP_REDIRECT → 패킷을 다른 인터페이스로 전달
  4. 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)에서 사용할지, 온프레미스 환경에서 사용할지 알려주시면 추가 최적화 가능! 🚀

반응형

댓글