
Minecraft-XDP-eBPF: Java 서버용 커널 DDoS 방어
Outfluencer/Minecraft-XDP-eBPF
공개되어 있는 유일한 Minecraft XDP 필터로, 계층 7 DDoS 공격으로부터 서버를 보호합니다
GitHub에서 보기 ↗공개 Minecraft 서버를 운영해본 사람이라면 이 상황을 알 것입니다, 누군가 대량의 정크 트래픽을 보내면 모든 플레이어가 끊김을 겪습니다. 계층 7 DDoS 공격, 즉 애플리케이션 수준의 공격은 저렴하고 쉽게 시작할 수 있으며, 기존 방화벽으로는 방어하기 매우 어렵습니다. Minecraft-XDP-eBPF는 악의적인 패킷이 서버 소프트웨어에 도달하기 전에 커널 수준에서 차단하여 이 문제를 해결합니다.
이 프로젝트가 하는 일
Minecraft-XDP-eBPF는 eBPF를 사용하여 네트워크 드라이버 수준에서 Minecraft 트래픽을 검사하는 C로 작성된 XDP 방화벽입니다. 복잡하게 들린다면 이렇게 생각해보세요, 정크 패킷이 Java 서버까지 여행하는 대신 네트워크 카드에서 차단되고 서버 리소스를 소비하지 않습니다.
이 프로젝트는 많은 사람들이 깨닫지 못하는 공격의 취약점을 처리합니다, 즉 잘못된 형식의 Minecraft 프로토콜 패킷입니다. 핸드셰이크, 상태 ping, 로그인 요청을 분석하고 Minecraft 프로토콜 사양을 위반하거나 의심스러운 것으로 보이는 패킷을 차단합니다. 여기 핵심입니다, 잘못된 VarInt, 무의미한 패킷 시퀀스, 잘못된 형식의 연결 시도 - 모두 사라집니다.
현재는 IPv4에서 Minecraft 1.8부터 26.1.2까지 지원하며, 기본 포트는 25565입니다. 기본 설정으로 초당 IP당 SYN을 3초마다 10개로 제한하는 SYN 속도 제한도 내장되어 있습니다. 이 모든 필터링은 서버가 패킷의 존재를 알 필요도 없이 진행됩니다.
왜 이것이 필요한가
공개 서버를 운영 중이고 무작위 공격으로 인한 피해를 방지하고 싶다면 이것이 필요합니다. 계층 7 DDoS는 사람들이 생각하는 것보다 훨씬 더 흔하며, ISP의 업스트림 보호만으로는 방어하기 어려운 종류입니다. ISP는 대역폭을 봅니다. 당신은 서버의 반응성을 유지해야 합니다.
이 상황을 상상해보세요, 누군가(또는 봇넷)가 서버 IP를 알아내고 초당 수천 개의 가짜 Minecraft 로그인 시도를 보냅니다. 서버는 이제 이 패킷들을 파싱하고 거부하고 정리하는 데 CPU 사이클을 소비해야 합니다. 실제 플레이어들은 서버가 정크에 잠겨 있기 때문에 끊김을 겪습니다. 이 도구를 사용하면 가짜 패킷이 서버에 도달하지 않습니다.
진정한 이점은 제로 복사 차단입니다. 악의적인 트래픽은 XDP 계층에서 차단되어 (XDP_DROP) 커널이 메모리를 할당하기 전에 처리됩니다. 그것은 빠를 뿐 아니라, 우리가 마이크로초 수준에서 이야기하는 정도입니다.
친구들과 함께 운영하는 작은 생존 서버라면 아마 이것이 필요하지 않을 것입니다. 공개되거나 경쟁적인 서버를 운영 중이라면 - 특히 사람들이 괴롭히고 싶어할 수 있는 PvP 서버라면 고려할 가치가 있습니다.
실행하기
설치에는 여러 부분이 있지만 매우 복잡하지는 않습니다. 루트 접근 권한이 있는 Linux 시스템이 필요합니다.
먼저 필수 요소를 설치하세요. Ubuntu 또는 Debian을 사용 중이라면
sudo apt update
sudo apt install -y gcc-multilib wget gnupg software-properties-common git libbpf-dev
다음으로 LLVM/Clang을 설치하세요. 프로젝트는 최신 버전이 필요합니다 (CI는 LLVM 21로 테스트)
wget https://apt.llvm.org/llvm.sh
chmod +x llvm.sh
sudo./llvm.sh 21 all
Rust 도구 체인도 설치해야 합니다. 모든 것을 설정한 후 저장소를 복제하고 빌드 스크립트를 실행하세요
git clone https://github.com/Outfluencer/Minecraft-XDP-eBPF.git
cd Minecraft-XDP-eBPF./build.sh
빌드가 성공적으로 완료된 후 "target/release/xdp-loader"에 바이너리가 있습니다. 네트워크 인터페이스에 방화벽을 로드하려면
sudo./target/release/xdp-loader eth0
(eth0을 실제 네트워크 인터페이스로 바꾸세요. 잘 모르겠다면 "ip link show"를 사용하면 알 수 있습니다.)
이제 방화벽이 활성화되고 트래픽을 필터링합니다. 무엇을 하는지 모니터링하고 싶나요? Prometheus 메트릭 끝점을 추가하세요
sudo./target/release/xdp-loader eth0 --metrics-addr 0.0.0.0:1999
그런 다음 "http://your-server-ip:1999/metrics"를 방문하여 패킷 수, 차단 통계 등을 확인하세요.
중요한 기능들
심층 패킷 검사
이 도구는 단순히 패킷 헤더를 보는 것이 아니라 실제 Minecraft 프로토콜을 분석합니다. VarInt 인코딩을 검증하고 (많은 공격 도구가 이것을 잘못 함), 패킷 구조를 확인하고 시퀀스 규칙을 적용합니다. Minecraft 프로토콜에 문법적으로 유효하지 않은 패킷은 즉시 차단됩니다.
연결 스로틀링
기본적으로 새로운 TCP 연결을 소스 IP당 3초마다 10개의 SYN으로 제한합니다. 실제 합법적인 트래픽이 많은 경우 "build.rs" 파일에서 이것을 조정할 수 있습니다 (예, 서버를 마이그레이션 중이고 스파이크가 있는 경우), 하지만 기본값은 대부분의 설정에 적합합니다.
제로 복사 차단
솔직히 가장 멋진 부분입니다. XDP는 드라이버 수준에서 커널의 일반적인 네트워크 스택이 관여하기 전에 작동합니다. 악의적인 패킷은 커널 메모리에 복사되지 않고 차단됩니다. 서버는 이것 때문에 깨어나지 않습니다. 그것은 진정한 성능 향상이며, 단순한 이론이 아닙니다.
주의사항 및 피하는 방법
루트 또는 적절한 eBPF 권한으로 이것을 실행해야 합니다. 권한 오류가 발생하면 "sudo"를 사용하고 있는지 확인하세요. 놀랍지 않지만, 그것이 가장 흔한 문제입니다.
"build.rs"의 설정을 조정하는 경우 (포트, 스로틀 속도 등 변경), 편집 후 다시 컴파일해야 한다는 것을 기억하세요. 바이너리만 다시 실행하고 변경 사항이 적용될 것으로 예상하지 마세요. 적용되지 않습니다. 한 번 그 실수를 했는데 포트 구성이 효과가 없는 이유를 10분 동안 궁금해했습니다 (실제로는 내가 아니었습니다. 단순히 가정상의 말입니다).
다른 주의사항, 맵 구성이 변경되는 경우 - 예를 들어 Per-CPU 맵을 활성화하거나 데이터 구조 크기를 조정하는 경우 - 때로는 BPF 파일 시스템이 재시작 시 혼동될 수 있습니다. 수정 방법은 극단적이지만 작동합니다
sudo rm -r /sys/fs/bpf
이는 BPF 파일 시스템을 지웁니다. 로더를 다시 시작하면 새로운 맵을 생성합니다. 맵 생성 오류가 발생하는 경우에만 이를 수행하세요. 정기적으로 수행해야 할 작업이 아닙니다.
또한 사용자 공간 프로그램은 eBPF 맵을 관리하기 위해 계속 실행되어야 합니다. 로더 프로세스를 종료하면 방화벽이 즉시 언로드됩니다. 아마도 systemd 또는 다른 감시자 아래에서 실행하고 싶을 것이므로 충돌 시 다시 시작됩니다.
대안은 무엇인가
정확히 같은 일을 하는 도구는 많지 않습니다. 대부분의 사람들은 ISP의 DDoS 보호에 의존하거나, Cloudflare 같은 상용 서비스를 사용하거나, 단순히 가끔 피해를 입을 수 있다고 수용합니다.
Cloudflare는 Minecraft 전용 서비스를 가지고 있어 트래픽을 프록시하지만, 비용을 지불하고 서버 IP가 프록시 뒤에 숨겨집니다. 이 도구는 자체 호스팅되고 무료입니다 (BSD 라이선스이므로 오픈 소스). 다른 트레이드오프입니다.
일부 사람들은 서버 소프트웨어나 방화벽에서 기본 속도 제한을 사용하지만 이는 패킷이 서버에 도착한 후에 발생합니다. 이 도구는 드라이버 수준에서 이들을 중지하므로 더 빠르고 효율적입니다.
서버 호스팅을 시작하는 경우 먼저 호스트의 내장 DDoS 보호를 확인하세요. 하지만 베어 메탈에서 실행 중이거나 더 많은 제어가 필요한 경우 Minecraft-XDP-eBPF는 제공하는 것에서 진정으로 고유합니다.
배포 전에
가능하면 스테이징 환경에서 테스트하세요. 프로덕션이 아닌 서버나 테스트 VPS에서 실행하여 합법적인 트래픽을 실수로 필터링하지 않는지 확인하세요 (그래야 하지만, 구성 실수는 발생합니다). 또한 실제 플레이어를 위해 켜기 전에 특정 Minecraft 서버 버전과 함께 작동하는지 확인하세요.
생존 서버를 보호하는 경우 위험이 낮습니다. 경쟁적인 PvP 또는 팩션 서버를 운영 중이고 합법적인 플레이어가 이미 좌절하고 있다면, 로그인 패킷을 차단하는 잘못된 구성은 재앙이 될 수 있습니다.
프로젝트는 GitHub에 별 169개를 가지고 있으며 적극적으로 유지됩니다. 최신 릴리스는 varint 읽기 방법을 개선했는데, 이것이 바로 보안 도구에서 보고 싶은 종류의 지루하지만 중요한 작업입니다. 이것은 견고한 작업입니다.
Prometheus 메트릭 내보내기를 설정하세요. 모니터링하세요. 패킷 차단 속도를 주시하세요 - 뭔가 이상해 보이면 일찍 발견할 것입니다. 그리고 DDoS를 진지하게 걱정하고 합법적인 공개 서버를 운영 중이라면 이 도구는 당신의 시간을 투자할 가치가 있습니다.
Lead writer at minecraft.how. Long-time Minecraft player running a small SMP server, testing every build, mod, and seed before writing about it.


