이 프로젝트는 Kali Linux에서 XDP와 iptables를 함께 사용해 DDoS 공격을 2단계로 완화하는 실험용 시스템입니다.
iptables는 정밀한 정책 판단을 담당하고, 탐지된 출발지 IP는 Python bridge를 통해 XDP BPF map으로 승격됩니다. 이후 같은 IP의 패킷은 네트워크 스택에 들어오기 전에 XDP에서 빠르게 차단됩니다.
-
xdp_hybrid_ddos_kern.c
XDP/eBPF 커널 프로그램입니다. XDP blocklist map에 등록된 출발지 IP를 즉시XDP_DROP합니다. -
iptables_to_xdp_bl.py
커널 로그를 감시하다가SYN-DROP:,UDP-DROP:,ICMP-DROP:로그 prefix가 있는 패킷의SRCIP를 XDP blocklist map에 추가합니다. -
app.py
Flask 기반 방화벽 관리 UI입니다. iptables 정책 관리, CLI 정책 조회, XDP blocklist 조회/추가/삭제, 실시간 대시보드를 제공합니다. -
templates/,static/
웹 UI 화면, 스타일, 대시보드 그래프 JavaScript 파일입니다. -
KALI_AMD_COMMANDS.md
Kali Linux AMD64 환경에서 필요한 설치, 컴파일, 실행, 정책, 정리 명령어 모음입니다.
패킷 유입
-> XDP: blocklist map에 있는 IP면 즉시 DROP
-> XDP: 없으면 PASS
-> Linux 네트워크 스택
-> iptables: 정책 조건 판단, LOG/DROP/ACCEPT 적용
-> Python bridge: iptables LOG에서 SRC IP 추출
-> bpftool: XDP blocklist map에 IP 추가
-> 이후 같은 IP는 XDP에서 즉시 차단
- 대시보드에서 정책 수, XDP 차단 IP 수, XDP drop 증가량을 확인할 수 있습니다.
- 실시간 그래프는 3초마다 갱신됩니다.
- 그래프는 누적값이 아니라 최근 갱신 구간의 drop 증가량을 기준으로 아래 기준선에서 위로 올라가도록 표시됩니다.
- 좌측 메뉴를 클릭하면 해당 화면만 표시됩니다.
- 정책 추가/삭제 후에도 대시보드로 이동하지 않고 기존 정책 화면에 머무릅니다.
- XDP blocklist IP 추가/삭제 후에도 XDP Blocklist 화면에 머무릅니다.
- CLI에서 직접 설정한 iptables 정책도 UI 정책 목록에 표시됩니다.
- CLI로 직접 추가한 XDP blocklist IP도
bpftool map dump결과를 통해 UI에 표시됩니다.
정책 UI는 프리셋 중심이 아니라 iptables 명령어 구문을 입력칸과 선택칸으로 나눈 방식입니다.
지원하는 주요 입력 항목:
- Chain:
XDP_DDOS_POLICY,INPUT등 - Source IP/CIDR:
-s - Destination IP/CIDR:
-d - Protocol:
tcp,udp,icmp,all - Protocol Options:
--sport,--dport,--syn,--tcp-flags,--icmp-type - Match Module:
none,limit,length,hashlimit,connlimit,state - Match Options: 선택한 match module에 맞는 세부 옵션
- Target:
LOG,DROP,ACCEPT,LOG then DROP - Log Prefix:
SYN-DROP:,UDP-DROP:,ICMP-DROP:등 - Additional Options: UI에 별도 입력칸이 없는 iptables 확장 옵션
Additional Options에는 예를 들어 다음과 같은 추가 match 옵션을 넣을 수 있습니다.
-m recent --name badsrc --update --seconds 60단, -A, -D, -I, -j, --jump, --comment처럼 룰 구조나 타깃을 바꾸는 옵션은 별도 필드에서 관리되므로 Additional Options에서는 차단됩니다.
가상환경을 사용할 경우:
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txtUI 실행:
export XDP_BLOCKLIST_MAP=/sys/fs/bpf/blocklist
sudo -E python3 app.py브라우저에서 접속:
http://127.0.0.1:8080
원격에서 접속해야 한다면 SSH 터널 사용을 권장합니다.
ssh -L 8080:127.0.0.1:8080 user@kali-hostUI와 bridge 스크립트는 기본적으로 다음 pinned BPF map을 사용합니다.
/sys/fs/bpf/blocklist
XDP 프로그램을 로드한 뒤 map을 pin합니다.
MAP_ID=$(sudo bpftool map show | awk '/blocklist/ { gsub(":", "", $1); print $1; exit }')
sudo bpftool map pin id "$MAP_ID" /sys/fs/bpf/blocklist다른 경로를 쓰려면 환경 변수로 지정합니다.
XDP_BLOCKLIST_MAP=/sys/fs/bpf/blocklist sudo -E python3 app.pyiptables 로그를 XDP blocklist에 반영하려면 bridge 스크립트를 별도 터미널에서 실행합니다.
chmod +x iptables_to_xdp_bl.py
sudo ./iptables_to_xdp_bl.py --pinned-map /sys/fs/bpf/blocklist백그라운드 실행:
sudo nohup ./iptables_to_xdp_bl.py --pinned-map /sys/fs/bpf/blocklist \
> xdp-bridge.log 2>&1 &bridge가 인식하는 기본 로그 prefix:
SYN-DROP:UDP-DROP:ICMP-DROP:
iptables 정책 확인:
sudo iptables -S
sudo iptables -L XDP_DDOS_POLICY -n -v --line-numbersXDP blocklist 확인:
sudo bpftool map dump pinned /sys/fs/bpf/blocklist커널 로그 확인:
journalctl -k -f자세한 Kali Linux AMD64 설치, 컴파일, 실행, 정책 적용, 테스트, 정리 명령어는 KALI_AMD_COMMANDS.md를 참고하세요.