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

🚀 XDP (eXpress Data Path) 완벽 가이드

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

🔍 1. XDP란?

XDP (eXpress Data Path)Linux 커널 내에서 네트워크 패킷을 초고속으로 처리할 수 있는 기술입니다.
XDP를 사용하면 커널 네트워크 스택을 우회하여 패킷을 즉시 필터링, 수정 및 전달할 수 있습니다.

 

XDP의 주요 특징

  • 🔥 초고속 네트워크 패킷 처리 (Zero-Copy 기반)
  • 🚀 커널 네트워크 스택을 거치지 않고 NIC에서 직접 필터링
  • 🛠 TCP/UDP 패킷 분석, 방화벽, DDoS 방어 등에 최적
  • 🔄 실시간으로 eBPF 코드를 변경 가능
  • ☁ 클라우드, 컨테이너 환경 (AWS, GCP, Kubernetes)과 완벽 호환

🔎 2. XDP vs 기존 네트워크 처리 방식

XDP는 기존 네트워크 패킷 처리 방식과 비교했을 때 훨씬 빠른 성능을 제공합니다.

🚫 기존 네트워크 처리 방식 (iptables, Netfilter, Userspace 처리)

 
패킷 → 커널 네트워크 스택 → iptables / Netfilter → Userspace 프로그램 처리

 

⛔ 문제점

  • 패킷이 커널 네트워크 스택을 통과해야 하므로 지연(latency) 발생
  • Userspace 프로그램으로 전송하면 성능 저하 (syscall 비용 증가)
  • DDoS 공격 방어에 취약 (처리 속도가 낮음)

✅ XDP 기반 네트워크 처리 방식

패킷 → XDP 프로그램 (NIC 수준에서 필터링) → 패킷 드롭/수정/전달

 

🔥 성능 최적화

  • NIC에서 직접 패킷을 분석 및 필터링 (Zero-Copy)
  • 커널 네트워크 스택을 우회하여 초고속 패킷 처리 가능
  • DDoS 방어, 방화벽, DPI (Deep Packet Inspection)에 최적

🔎 3. XDP의 동작 방식

XDP는 NIC(Network Interface Card)에서 패킷을 즉시 필터링하고 조작할 수 있도록 설계된 eBPF 기술입니다.

XDP 주요 기능

  1. 패킷 필터링 → 특정 Client IP/Server IP만 허용하거나 차단
  2. 패킷 수정 → 패킷 헤더를 변경하여 경로 재지정 가능
  3. 패킷 리디렉션 → 특정 인터페이스로 패킷을 전달
  4. DDoS 방어 → 비정상적인 대량 트래픽을 NIC에서 즉시 차단

XDP가 반환하는 동작

XDP  동작설명
XDP_ABORTED 패킷을 즉시 드롭 (비정상 패킷)
XDP_DROP 패킷을 차단 (DDoS 방어, 방화벽)
XDP_PASS 패킷을 커널 네트워크 스택으로 전달
XDP_TX 패킷을 다시 전송 (패킷 재전송, 로드밸런싱)
XDP_REDIRECT 패킷을 다른 인터페이스로 전달 (로드밸런싱)

🔎 4. XDP 기반 실전 코드 예제

🔥 목표: Client IP & Server IP 기반으로 TCP/UDP 패킷을 초고속 필터링

(1) XDP 기반 TCP/UDP 패킷 필터링 (C 코드)

📌 xdp_filter.c (XDP eBPF 프로그램)

#include <linux/bpf.h>
#include <linux/if_ether.h>
#include <linux/ip.h>
#include <linux/tcp.h>
#include <linux/udp.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에서 직접 패킷을 필터링
  • 192.168.1.1 (Client IP) 및 192.168.1.2 (Server IP) 패킷만 허용
  • 나머지 패킷은 XDP_DROP을 통해 즉시 차단

(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 라이브러리를 활용해 eBPF XDP 프로그램을 실행
  • eth0 인터페이스에서 Client IP 및 Server IP 기반 필터링 수행
  • 불필요한 패킷은 XDP_DROP을 통해 즉시 차단

🔎 5. XDP 실제 활용 사례

🔥 DDoS 공격 방어 (Cloudflare)

  • XDP를 활용하여 100Gbps 이상 초고속 DDoS 필터링

🔥 AWS Nitro, Google GVE 네트워크 가속

  • XDP를 사용하여 AWS, GCP 클라우드 네트워크 트래픽 최적화

🔥 컨테이너 보안 (Cilium)

  • XDP 기반 Kubernetes 네트워크 정책 적용 및 보안 강화

🔥 실시간 보안 로깅 (Falco, Suricata)

  • XDP 기반 실시간 네트워크 위협 탐지

🚀 결론: XDP의 강력한 성능

 

기술 역할 효과
XDP_DROP 패킷 차단 DDoS 방어, 방화벽 성능 향상
XDP_PASS 패킷 허용 특정 IP만 허용
XDP_REDIRECT 인터페이스 변경 로드 밸런싱, 트래픽 조작

 

🚀 결론:

 

XDP를 활용하면 초고속 네트워크 패킷 필터링 및 보안 분석이 가능!

➡ XDP를 클라우드(AWS, GCP)에서 사용할지, 로컬 네트워크에서 사용할지 알려주시면 추가 최적화 가능! 🚀

반응형

댓글