XDP(Express Data Path)는 리눅스 커널에서 사용할 수 있는 네트워킹 유틸리티입니다. XDP는 초당 수백만 개의 요청을 처리하는 동안 회사가 직면하는 심각한 네트워킹 문제를 해결하기 위해 많은 유명한 기업에서 사용됩니다. 이는 MIT 라이센스를 가진 오픈 소스 프로그램으로, 4.8 버전부터 리눅스 커널에 통합되었습니다.
XDP는 성능이 뛰어나고 프로그래머블한 네트워크 데이터 패킷 프로세서입니다. 이는 DDoS(분산 서비스 거부) 공격과 같은 심각한 서버 측 문제를 완화하거나 로드 밸런서로 작용하기 위해 존재합니다.
목차
- XDP의 필요성
- XDP가 매우 빠른 이유
- XDP와 네트워킹 스택 연결하기
- XDP가 수행하는 작업 유형
- XDP와 eBPF
- XDP 및 eBPF의 일반적인 사용 사례
- 자주 묻는 질문들
또한 읽어보세요: 자신의 리눅스 커널을 컴파일할 때 유용한 5가지 팁
XDP의 필요성
성능이 우수한 네트워킹 데이터 경로는 항상 리눅스 서버에 필요한 기능입니다. 그러나 이러한 데이터 경로의 프로그래머블성이 있어야 개발자가 이를 사용하여 뭔가 유용한 것을 만들 수 있습니다. 비록 XDP는 꽤 가파른 학습 곡선이 있지만, 최근 많은 도구와 프레임워크가 개발되면서 XDP 코드를 작성하는 것이 요즘 비교적 접근 가능해졌습니다.
XDP의 가장 큰 장점은 속도입니다. XDP의 주요 기능은 개발자가 커널 자체를 수정하지 않고도 패키지를 필터링할 수 있는 새로운 기능을 구축할 수 있다는 것입니다.
일부 시나리오에서는 패키지가 전체 네트워크 스택을 통해 이동할 필요 없이 패킷을 전달하거나 드롭할지를 결정해야 할 수도 있습니다. 이것은 네트워킹 스택의 첫 번째 레이어에서 필터를 배치하여 수행해야 합니다. 이러한 필터는 악성 패킷을 쉽게 인식하고 스택의 시작 부분에서 이를 드롭할 수 있도록 프로그래밍되어야 합니다. 이는 많은 처리 능력과 시간을 절약할 수 있습니다.
XDP를 사용하면, 이 필터링은 네트워킹 스택의 맨 앞에서 가능합니다.
이제 XDP를 사용하여 개발자는 DDoS 공격을 위해 해커가 보낼 수 있는 패킷을 필터링할 수 있습니다. 이는 일반 커널 네트워킹 스택에서 많은 오버헤드를 줄일 수 있습니다. 이 기능은 최근 Cloudflare가 DDoS 보호 시연에서 입증되었습니다.

XDP의 주목할 만한 기능은 다음과 같습니다:
- 전문 하드웨어가 필요하지 않습니다: XDP는 사용자가 제공하는 모든 하드웨어에서 실행할 수 있습니다. 최적화된 장치나 드라이버가 없다면 속도가 저하될 수 있지만, 테스트 목적을 위해서는 전문 하드웨어가 필요하지 않습니다.
- 커널 우회를 요구하지 않습니다: XDP는 패킷이 커널 네트워킹 스택에 도달하기 전에 실행됩니다. 패킷이 수신되면 콜백 함수가 호출되고, XDP는 가능한 한 빨리 이를 처리합니다.
- TCP/IP 스택을 대체하지 않습니다: XDP는 네트워킹 스택의 최하위 수준에 존재합니다. 패킷이 전달되면, 패킷은 TCP/IP 스택을 포함하는 정상 커널 네트워킹 스택으로 들어갑니다.
- 모든 BPF(Berkeley Packet Filter) 기능과 함께 TCP/IP와 함께 작동합니다: XDP는 어떤 것도 대체하지 않으며, 패킷을 처리하기 위해 eBPF를 사용하여 개발자가 코드를 작성하는 데 더 쉽게 도움을 줍니다.
또한 읽어보세요: Ubuntu에서 사용자 지정 커널을 빌드하고 설치하는 방법
XDP가 매우 빠른 이유
XDP는 리눅스 커널에서 eBPF 기반의 프로그래머블 고성능 네트워크 데이터 경로입니다. XDP의 성능 향상은 소프트웨어 스택의 최하위 수준에서의 베어 메탈 패킷 처리 덕분입니다. 즉, 네트워크에서 오는 데이터 패킷이 커널의 다른 프로세스에 도달하기 전에 XDP에 먼저 도달합니다.
따라서 엔지니어는 다양한 사용 사례에 최적화할 수 있도록 XDP를 프로그래밍할 수 있습니다. DDoS 보호부터 로드 밸런서까지.
XDP는 네트워킹 스택에 직접 로드됩니다. 네트워킹 스택에서 패킷을 수신하면, 콜백이 발생하고 가능한 한 빨리 패킷을 처리합니다. XDP는 일반 하드웨어에서 코어당 초당 2600만 패킷을 드롭할 수 있습니다.
XDP가 매우 빠른 주요 이유는 사용자가 네트워크 패킷 데이터를 직접 읽거나 변경하고 패킷을 처리하는 방법에 대한 결정을 더 이른 단계에서 내릴 수 있도록 허용하기 때문입니다. 이는 매우 적은 처리 오버헤드를 요구하며 더 나은 속도를 결과로 가져옵니다.
XDP와 네트워킹 스택 연결하기
XDP와 네트워킹을 연결하는 방법은 여러 가지가 있지만, 여기에서 몇 가지 인기 있는 방법을 언급하겠습니다.
- 일반 XDP: 이 프로세스에서는 XDP가 커널에 로드되지만 성능 이점이 거의 없습니다. 하드웨어의 지원 없이 XDP 프로그램을 실행하는 쉬운 방법입니다.
- 네이티브 XDP: 네이티브 XDP는 네트워킹 드라이버 자체에 의해 로드됩니다. 네트워크 카드 드라이버의 지원이 필요합니다.
또한 읽어보세요: Windows에서 커널 데이터 인페이지 오류를 수정하는 방법
XDP가 수행하는 작업 유형
XDP가 네트워킹 인터페이스에서 패킷을 수신한 후 수행할 수 있는 몇 가지 작업은 다음과 같습니다:
- XDP_DROP: 패킷을 드롭하고 처리하지 않습니다. 트래픽 패턴을 분석하기 위해 eBPF 프로그램을 사용하여 실시간으로 패킷을 드롭할 수 있습니다.
- XDP_PASS: 패킷을 네트워킹 스택으로 전달하여 추가 처리를 수행합니다. 처리되기 전에 패킷의 내용을 수정할 수 있습니다.
- XDP_ABORTED: 네트워크 데이터 패킷을 드롭하고 추적점 예외를 남깁니다.
- XDP_TX: 패킷을 수신한 동일한 네트워킹 인터페이스로 전달합니다. 패킷은 수정되지 않은 상태로 이동할 수 있습니다.
- XDP_REDIRECT: 패킷을 다른 NIC(네트워크 인터페이스 제어기)로 리디렉션합니다.

XDP와 eBPF
eBPF는 Berkeley Packet Filter의 확장 버전입니다. 이는 리눅스 커널 내에서 실행되는 추상화된 가상 머신과 유사합니다. eBPF는 리눅스 커널 내 샌드박스 환경에서 사용자가 정의한 프로그램을 실행하기 위해 사용됩니다. 일반적으로 리눅스 서버에서 최적의 성능을 보장하기 위해 네트워킹 및 모니터링 도구를 실행하는 데 사용됩니다.
XDP는 BPF 애플리케이션에서 매우 높은 속도의 패킷 처리를 작성하는 데 사용되는 프레임워크입니다. 더 빠르게 만들기 위해, XDP는 패킷이 네트워킹 스택에 수신된 직후 BPF를 실행합니다.
XDP는 매우 가파른 학습 곡선이 있습니다. 따라서 개발자들은 eBPF를 사용하여 프로그래밍을 쉽게 하기 위한 도구와 프레임워크를 만들고 있습니다. 이를 통해 XDP와 eBPF를 사용하여 매우 높은 주파수의 네트워크 처리를 위한 코드를 작성하는 것이 매우 쉬워졌습니다. XDP의 핵심 장점은 이를 프로그래밍하기 위해 커널을 수정할 필요가 없다는 것입니다. 이는 엔지니어에게 큰 골칫거리였습니다.
하지만 사람들이 말했듯이, 큰 힘에는 큰 책임이 따릅니다. XDP는 패킷이 커널에 의해 파싱되기 전에 가능한 한 이른 시점에 eBPF를 실행하기 때문에 eBPF 프로그램은 파서를 스스로 작성해야 하며, 커널이 이를 위한 어떤 것도 제공하길 기대할 수 없습니다.
프로그래머로서 대부분의 시간은 터미널에서 작업을 하고 있습니다. 이는 귀하의 터미널 프롬프트를 꾸미는 가이드입니다. 꼭 확인해 보세요.
또한 읽어보세요: 리눅스에서 커널을 다운그레이드하는 방법
XDP 및 eBPF의 일반적인 사용 사례
- DDoS 공격: XDP의 주요 사용 사례는 DDoS(분산 서비스 거부) 보호입니다. DDoS 공격 중 공격자는 최종 사용자에게 프로세스를 남기지 않고 서버의 가능한 많은 자원을 사용하려고 합니다. 네트워킹 스택의 매우 빠른 레이어로서 XDP를 사용하면 네트워크 데이터 패킷을 드롭하는 데 관련된 처리 비용이 없습니다. XDP 필터링 후, 패킷은 리눅스 커널이 제공하는 다른 모든 필터링 방법을 거칩니다.
- 로드 밸런서: XDP는 또한 서버로의 대량 트래픽을 처리하기 위한 로드 밸런서로 사용됩니다. Facebook을 포함한 많은 대규모 기술 기업들이 이 기술을 사용합니다. 이전에는 엔지니어들이 전용 서버를 로드 밸런서로 사용했습니다. 이는 관리하기 매우 어렵고 수백만 고객을 위해 잘 작동해야 했습니다. 그러나 XDP 레이어를 중앙 서버 없이 로드 밸런서로 사용하는 것을 상상해 보세요. 결과적으로 단일 실패 지점이 없습니다.
- 방화벽: XDP와 eBPF는 매우 최소한의 오버헤드로 시스템을 보호하기 위해 다양한 방화벽 규칙을 작성하는 데 사용될 수 있습니다.
또한 읽어보세요: 리눅스에서 Rm 명령어 사용하는 방법
자주 묻는 질문들
BCC는 eBPF의 무엇인가요?
BCC는 eBPF 위에 구축되어 있습니다. 이것은 커널 추적 및 조작 프로그램을 위한 도구 키트 또는 프레임워크로, 매우 유용한 명령줄 인터페이스가 제공됩니다. BCC는 C로 커널 명령을 작성하는 데 도움을 줍니다. 또한 LLVM에 대한 래퍼가 포함되어 있습니다.
libBPF란 무엇인가요?
LibBPF는 BPF 애플리케이션을 만들기 위한 대체 도구 세트입니다. C 프로그래밍 언어로 작성되었습니다.