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

🚀 eBPF (Extended Berkeley Packet Filter) 완벽 가이드

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

🔍 1. eBPF란?

eBPF(Extended Berkeley Packet Filter)는 커널을 수정하지 않고도 고성능 네트워크 필터링 및 모니터링을 수행할 수 있는 기술입니다.

 

eBPF의 핵심 특징

  • 🔥 초고속 패킷 처리 → 커널 네트워크 스택을 우회하여 직접 실행
  • 🚀 고성능 필터링 → TCP/UDP 패킷을 즉시 분석 및 드롭 가능
  • 🛠 실시간 네트워크 모니터링 → IDS/IPS(침입 탐지 시스템) 등에 활용
  • 🔄 동적 프로그램 실행 → 커널을 다시 빌드하지 않고 eBPF 프로그램을 로드 가능
  • ☁ 클라우드 친화적 → AWS, GCP, Azure와 함께 사용 가능

🔎 2. eBPF의 동작 방식

eBPF는 리눅스 커널 내에서 실행되는 가상 머신(VM) 으로 작동합니다.
일반적인 네트워크 패킷 필터링 흐름과 비교하면 다음과 같습니다:

🚫 기존 네트워크 패킷 필터링 방식

패킷 → 커널 네트워크 스택 → 방화벽(Iptables) → 유저 공간(User Space) → 분석 & 처리

 

⛔ 문제점

  • 패킷이 커널 네트워크 스택을 통과해야 하므로 속도가 느림
  • User Space에서 패킷 분석 시 성능 저하 발생
  • 필터링 규칙을 변경하려면 시스템을 재시작해야 함

✅ eBPF 기반 네트워크 패킷 필터링 방식

패킷 → eBPF(XDP) → 드롭/패스 결정 → User Space (필요 시 전송)

 

🔥 성능 최적화

  • eBPF는 커널 레벨에서 직접 실행되므로 패킷 처리가 초고속
  • 커널 네트워크 스택을 우회하여 Zero-Copy 방식으로 데이터 처리
  • 커널을 재시작하지 않고도 필터링 규칙을 실시간으로 변경 가능

🔎 3. eBPF 핵심 기능

1) XDP (eXpress Data Path)

  • TCP/UDP 패킷을 초고속 필터링 가능
  • NIC(Network Interface Card)에서 패킷을 처리하므로 Zero-Copy로 성능 향상
  • DDoS 방어, 방화벽, 패킷 필터링 등에 활용

2) kprobe / uprobe

  • kprobe: 리눅스 커널 함수 실행을 모니터링 (ex: 시스템 콜 감시)
  • uprobe: 유저 공간(User Space)에서 프로그램 실행을 추적

3) tracepoints

  • 특정 커널 이벤트(파일 오픈, 프로세스 생성 등)를 실시간으로 분석

4) perf events

  • CPU 성능 분석 및 네트워크 트래픽 모니터링

5) cgroup-bpf

  • 컨테이너 및 클라우드 환경에서 네트워크 및 리소스 제어 가능

🔎 4. eBPF 실전 코드 예제

🔥 목표: TCP/UDP 패킷에서 Client IP와 Server IP를 기반으로 필터링

✅ (1) eBPF/XDP 코드: TCP/UDP 패킷 필터링

📌 filter.c (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";
 

설명

  • bpf_hdr_pointer()을 사용해 패킷 헤더에서 IP 주소를 추출
  • XDP_PASS: 허용된 패킷만 네트워크 스택으로 전달
  • XDP_DROP: 차단된 패킷을 즉시 드롭하여 CPU 부담 감소
  • 192.168.1.1 (Client) / 192.168.1.2 (Server) 패킷만 허용

✅ (2) eBPF 프로그램 로드 및 실행

📌 load_bpf.py (eBPF 프로그램 실행)

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); // 192.168.1.1
    __u32 server_ip = bpf_htonl(0xC0A80102); // 192.168.1.2

    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("eBPF 프로그램 로드 완료. TCP/UDP 패킷 필터링 시작...")
try:
    bpf.trace_print()
except KeyboardInterrupt:
    pass
bpf.remove_xdp("eth0", 0)
 

설명

  • Python bcc 라이브러리를 사용하여 eBPF 프로그램을 로드 및 실행
  • eth0 인터페이스에서 Client IP 및 Server IP 기반 필터링 수행
  • XDP_DROP을 통해 불필요한 패킷을 즉시 차단하여 성능 최적화

🔎 5. eBPF의 실제 활용 사례

🔥 DDoS 공격 방어 (Cloudflare)

  • XDP를 활용하여 DDoS 공격 패킷을 100Gbps 이상 필터링

🔥 클라우드 네트워크 모니터링 (AWS Nitro, Google GVE)

  • eBPF를 사용하여 클라우드 네트워크의 실시간 트래픽 분석 수행

🔥 컨테이너 보안 (Cilium)

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

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

  • eBPF 기반 악성 프로세스 및 네트워크 위협 탐지

🚀 결론: eBPF의 강력한 성능

 

기술 역할 효과
XDP TCP/UDP 패킷 필터링 Zero-Copy 기반 초고속 필터링
kprobe/uprobe 시스템 콜 모니터링 프로세스 및 파일 액세스 감지
tracepoints 네트워크 이벤트 추적 실시간 로그 분석

 

🚀 결론:

eBPF/XDP를 활용하면 초고속 패킷 필터링 및 보안 분석이 가능!

 

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

반응형

댓글