Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- AZ-900
- EC2
- cpu
- POD
- Role
- ansible
- K8S
- asgi
- 자바스크립트
- docker
- RBAC
- Service
- AZ-104
- kernel
- Django
- FastAPI
- leetcode
- IAC
- elasticsearch
- IAM
- Python
- ebs
- DevOps
- AZURE
- Kubernetes
- asyncio
- AWS
- Deployment
- terraform
- Network
Archives
- Today
- Total
궁금한게 많은 개발자 노트
[ DDoS ] ipset+iptabels vs XDP+eBPF 차단 방식 비교 본문
항목 | ipset + iptables | XDP + eBPF |
구성 요소 | iptables, ipset | eBPF 프로그램, XDP hook |
동작 위치 | 커널 네트워크 스택 내부 (INPUT, PREROUTING) | 커널 진입 전, NIC 드라이버 수준 |
속도 | 빠르지만 skb 생성 이후 처리 | 초고속 (us 단위), skb 생성 이전 처리 |
조건 처리 | ipset으로 다양한 IP 리스트 필터링 가능 | IP 비교는 가능하지만 복잡한 조건(국가, GeoIP)은 직접 구현 |
리소스 소비 | 커널 conntrack, NAT, skb 등 사용 | 매우 적음 (소켓/커널 구조체 생성 전 차단) |
로깅, 추적 | iptables LOG 가능 | 기본은 없음, 별도 eBPF 로깅 추가 필요 |
유지 보수 편의성 | ipset로 외부 리스트 쉽게 갱신 가능 | 직접 프로그램 수정 필요, 자동화 도구 필요 |
주요 용도 | 일반적인 방화벽, 정책 제어 | 대규모 DDoS 대응, 공격 차단, 초고속 필터링에 적합 |
예시 기술 | ipset create blocklist hash:ip + iptables -m set | xdp_blocklist_kern.c + bpftool, ip link set xdp |
# conntrack이란 netfilter하위 시스템으로 네트워크 연결 상태를 추적하는 기능입니다. 커널이 들어온 패킷이 기존 연결에 속한 것인지, 새로운 연결인지, 이미 종료된 연결인지를 인식하게 해주는 기술입니다. 일반적으로 패킷 필터링은 stateless이지만, 실제 트래픽은 연결 지향적(TCP handshake, UDP session)이므로 이 연결이 유효한지를 판단할 필요가 있음
ipset + iptables를 활용하여 INPUT체인에서 커널이 skb를 분석하여 해당 IP를 찾아 DROP
ipset create blocklist hash:ip
ipset add blocklist 1.2.3.4
iptables -I INPUT -m set --match-set blocklist src -j DROP
iptabels의 트래픽을 조건에 따라 제한하거나 추적할 때 사용하는 옵션을 사용
- hashlimit : 속도 기반 제한시 사용하며, 지정된 시간 동안 허용할 수 있는 패킷 수를 제한하는 모듈
- recent : 특정 조건에 맞는 패킷의 접속 이력을 저장해두고, 이후 들어오는 패킷이 일정 시간 내 같은 조건을 만족할 경우 필터링
DDoS차단 방식
- hashlimit으로 pps측정
- pps기반으로 일정수치(5000 PPS) 이상의 IP를 recent에 IP등록해서 차단
- blocked list에 추가된 IP들은 5분동안 차단
# iptables rules
# UDP 트래픽(포트 10000~30000)을 초당 5000패킷 이상 보내는 IP를 감지하고, 로그를 남기는 명령어 (순간적으로 PPS 6000까지 허용) 테이블 엔트리 5분 후 만료, 로그는 분당 6회
iptables -A INPUT -p udp --dport 10000:30000 -m hashlimit --hashlimit-above 5000/second --hashlimit-burst 6000 --hashlimit-mode srcip --hashlimit-name pps_limit_5000 --hashlimit-htable-expire 300000 -m limit --limit 6/minute -j LOG --log-prefix "HASHLIMIT_DROP_5000: "
# UDP 트래픽(포트 10001~30000)을 초당 5000패킷 이상 보내는 IP감지하여 blocked_udp리스트에 등록
iptables -A INPUT -p udp --dport 10001:30000 -m hashlimit --hashlimit-above 5000/second --hashlimit-burst 6000 --hashlimit-mode srcip --hashlimit-name pps_limit_5000 -m recent --name blocked_udp --set
# 위에서 등록한 IP리스트인 blocked_udp리스트를 사용하여 매치된 IP가 이미 있다면 시간 갱신하고, 최근 5분 이내 등록된 IP만 매치하여 5분동안 등록된 IP차단
iptables -A INPUT -m recent --name blocked_udp --update --seconds 300 --hitcount 1 -j DROP
XDP를 통한 차단 eBPF프로그램 예시로 NIC 드라이버 수준에서 바로 DROP하여 커널 진입 자체를 차단
#include <linux/bpf.h>
#include <linux/if_ether.h>
#include <linux/ip.h>
#include <linux/in.h>
#include "bpf_helpers.h"
struct bpf_map_def SEC("maps") blocked_ips = {
.type = BPF_MAP_TYPE_HASH,
.key_size = sizeof(__u32), // IPv4 address
.value_size = sizeof(__u8),
.max_entries = 1024,
};
SEC("xdp")
int xdp_filter(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_PASS;
if (eth->h_proto != htons(ETH_P_IP)) return XDP_PASS;
struct iphdr *ip = data + sizeof(*eth);
if ((void *)(ip + 1) > data_end) return XDP_PASS;
__u32 src_ip = ip->saddr;
__u8 *val = bpf_map_lookup_elem(&blocked_ips, &src_ip);
if (val) return XDP_DROP;
return XDP_PASS;
}
char _license[] SEC("license") = "GPL";
좀 더 자세히 XDP + eBPF프로그램을 통한 차단 방법 고안
- 특정 IP/지역 IP 대역을 eBPF Map에 저장
- XDP에서 수신 패킷의 Source IP를 BPF Map과 비교
- 일치 시 XDP_DROP, 아니면 XDP_PASS
필요 요소 | 설명 |
xdp_prog.c | eBPF 프로그램 (커널 모드) |
xdp_loader.c | 프로그램 로더 (유저 모드) |
bpftool or libbpf | eBPF map 관리 도구 |
blocked_ips.map | IP 블랙리스트 map (key: IP 주소, value: dummy) |
clang + llvm | eBPF C 코드 컴파일용 |
필요 작업
# eBPF 프로그램 컴파일
$ clang -O2 -target bpf -c xdp_blocklist_kern.c -o xdp_blocklist_kern.o
# 네트워크 드라이버 인터페이스에 attach
$ ip link set dev eth0 xdp obj xdp_blocklist_kern.o sec xdp
# blocklist map에 IP 삽입 (bpftool 또는 사용자 로더)
# 192.168.0.1 = 0xC0A80001
$ bpftool map list # map ID 확인
$ bpftool map update id <id> key 0xC0A80001 value 0x1
# 유저 공간에서 bpf_map_update_elme()을 통해 IP추가 가능
# map에 실시간 차단 IP추가 스크립트
ip_to_hex() {
ip=$1
IFS=. read -r a b c d <<< "$ip"
printf '0x%02X%02X%02X%02X\n' $d $c $b $a
}
add_block() {
hex=$(ip_to_hex "$1")
bpftool map update id <map_id> key $hex value 0x1
}
GeoIP기반 국가 차단은 IP대역 DB가 필요하며 MaxMind DB사용하여 국가 대역 추출하여 blocklist.txt구성 후 삽입
grep "KR" GeoLite2-Country-Blocks-IPv4.csv | cut -d, -f1 > kr_ips.txt
XDP+eBPF방식은 ipset보다 빠르고 리소스 효율적인 차단 솔루션으로 IP리스트만 있으면 아주 빠르게 특정 지역 또는 악성 IP를 차단할 수 있으며 보안 강화, DDoS 대층, L4차단에 매우 적합할 수 있습니다.
'DevOps' 카테고리의 다른 글
[ K8S ] 쿠버네티스 네트워크 모델 (0) | 2025.04.24 |
---|---|
[ Azure ] Service Principal, Role, Action (0) | 2025.02.19 |
[ AZ-104 ] Entra ID, Domain Service (0) | 2025.01.18 |
[ AZ-104 ] Azure Cloud Shell, PowerShell, JSON ARM (0) | 2025.01.17 |
Service Mesh, Istio란? (0) | 2025.01.14 |
Comments