XDP và eBPF cho xử lý gói tin trên Linux

14 phút đọc - 27 tháng 5, 2026

hero section cover
Mục lục
  • XDP và eBPF cho xử lý gói tin hiệu suất cao
  • Cách eBPF và XDP hoạt động cùng nhau
  • XDP so với iptables: So sánh hiệu suất
  • Giảm thiểu DDoS và bảo mật
  • Công cụ, triển khai và yêu cầu phần cứng
  • Bắt đầu với XDP
Chia sẻ

Cách XDP và eBPF xử lý hàng triệu gói tin mỗi giây ở cấp trình điều khiển NIC. Các bài kiểm tra hiệu năng, trường hợp sử dụng DDoS, thiết lập chuỗi công cụ và yêu cầu phần cứng

XDP và eBPF cho xử lý gói tin hiệu suất cao

XDP (eXpress Data Path) và eBPF (extended Berkeley Packet Filter) cho phép Linux xử lý các gói tin mạng trước khi ngăn xếp mạng thông thường của kernel tham gia. Thay vì phân bổ cấu trúc bộ nhớ cho mỗi gói tin đến, XDP chặn lưu lượng ngay tại trình điều khiển NIC, quyết định phải làm gì với nó, và sau đó loại bỏ, chuyển tiếp hoặc chuyển hướng nó. Kết quả là khả năng xử lý gói tin lên đến hàng triệu gói tin mỗi giây trên mỗi lõi, với chi phí CPU chỉ bằng một phần nhỏ so với các công cụ truyền thống như iptables.


 

Cách eBPF và XDP hoạt động cùng nhau

eBPF là một máy ảo bên trong nhân Linux. Nó chạy mã bytecode tùy chỉnh đã được kiểm tra về tính an toàn (không có vòng lặp vô hạn, không truy cập bộ nhớ trái phép) và sau đó được biên dịch JIT thành các lệnh CPU gốc. Các chương trình có phạm vi giới hạn. Chúng không thể gọi các hàm nhân tùy ý, mà chỉ có thể sử dụng một tập hợp các hàm trợ giúp được định nghĩa sẵn cho các tác vụ như tra cứu bản đồ và chuyển hướng gói tin.

Để quản lý trạng thái, eBPF sử dụng các bản đồ, là các kho lưu trữ khóa/giá trị (bảng băm, mảng, cây tìm kiếm LPM) tồn tại qua các gói tin đến. Các bản đồ có thể đọc và ghi từ không gian người dùng, do đó bạn có thể cập nhật danh sách chặn hoặc quy tắc định tuyến mà không cần tải lại chương trình.

XDP là một điểm móc eBPF. Nó gắn vào đường dẫn nhận của trình điều khiển NIC, trước khi kernel phân bổ cấu trúc sk_buff cấu trúc (đối tượng siêu dữ liệu 200-300 byte cho mỗi gói tin mà ngăn xếp mạng truyền thống phụ thuộc vào). Việc bỏ qua quá trình phân bổ đó là nguồn gốc của sự cải thiện hiệu suất.

XDP chạy ở ba chế độ:

  • Chế độ gốc: chạy bên trong trình điều khiển NIC. Hiệu suất tốt nhất.
  • Chế độ Offloaded: chạy trên ASIC của NIC. Giải phóng hoàn toàn CPU.
  • Chế độ chung: chạy sau khi sk_buff quá trình phân bổ. Hữu ích cho việc thử nghiệm trên phần cứng không được hỗ trợ, nhưng không mang lại lợi ích về hiệu suất.

Sau khi xử lý mỗi gói tin, chương trình XDP trả về kết quả:

Kết quảHành động
XDP_DROPLoại bỏ gói tin ở cấp trình điều khiển
XDP_PASSChuyển tiếp đến ngăn xếp mạng thông thường
XDP_TXGửi lại qua cùng một giao diện
XDP_REDIRECTChuyển hướng sang NIC khác hoặc socket không gian người dùng AF_XDP
XDP_ABORTEDBỏ qua do lỗi chương trình, ghi lại sự kiện theo dõi

XDP so với iptables: So sánh hiệu suất

Các con số rất rõ ràng. iptables xử lý khoảng 200.000 gói tin mỗi giây trên mỗi lõi. nftables cải thiện con số đó lên khoảng 400.000 pps. XDP ở chế độ gốc xử lý 10 đến 40 triệu pps trên mỗi lõi trên cùng một phần cứng.

Lý do rất đơn giản: một XDP_DROP tốn một lần kiểm tra giới hạn và một giá trị trả về. Một iptables DROP yêu cầu sk_buff việc phân bổ bộ nhớ, duyệt chuỗi netfilter, tra cứu theo dõi kết nối, hành động DROP chính nó, và sau đó là giải phóng bộ nhớ. Ở tốc độ 100 Gbps với các gói tin 64 byte, một máy chủ phải xử lý 148 triệu gói tin mỗi giây, chỉ còn khoảng 100 nano giây cho mỗi gói tin. Ở quy mô đó, sk_buff việc phân bổ bộ nhớ trở thành điểm nghẽn.

Tiết kiệm CPU cũng đáng kể không kém. Việc chuyển danh sách chặn từ iptables sang XDP trong một bài kiểm tra hiệu năng đã giảm mức sử dụng CPU do ngắt phần mềm từ 28% xuống 3% ở tốc độ 1 triệu gói tin mỗi giây. Dung lượng được giải phóng đó có thể dùng để chạy các quy trình ứng dụng, cơ sở dữ liệu hoặc máy ảo trên cùng một máy chủ.

Giảm thiểu DDoS và bảo mật

Trường hợp sử dụng hosting mạnh nhất của XDP là giảm thiểu DDoS. Vì nó hoạt động ở cấp độ trình điều khiển, các gói tin độc hại sẽ bị loại bỏ trước khi chạm vào ngăn xếp mạng của kernel. Một lõi duy nhất chạy XDP có thể loại bỏ 26 triệu gói tin mỗi giây.

Cloudflare đã sử dụng một hệ thống dựa trên XDP có tên L4Drop để giảm thiểu DDoS khối lượng lớn ít nhất từ năm 2018. Hệ thống này xử lý và loại bỏ lưu lượng tấn công trong bối cảnh XDP, ngăn không cho nó tiếp cận lớp ứng dụng. Katran của Meta, một bộ cân bằng tải Lớp 4 XDP mã nguồn mở, xử lý lưu lượng cho Facebook và Instagram với tốc độ hơn 10 triệu gói tin mỗi giây trên mỗi lõi.

Đối với lọc động, các bản đồ eBPF như BPF_MAP_TYPE_LPM_TRIE cho phép bạn quản lý danh sách chặn IP bao gồm các IP riêng lẻ và mạng con CIDR trong một lần tra cứu duy nhất. Các cập nhật diễn ra từ không gian người dùng theo thời gian thực, không cần tải lại chương trình. Trong một cuộc tấn công đang diễn ra, bạn có thể đẩy các chữ ký mới trong vài mili giây bằng cách sử dụng bpftool:

bpftool map update id <MAP_ID> key <KEY_VALUE> value <VALUE>

Để đảm bảo khả năng quan sát, eBPF thu thập các chỉ số theo ứng dụng, theo IP và theo luồng trực tiếp từ đường dẫn dữ liệu kernel. xdp_md bối cảnh này cung cấp các dữ liệu đo lường như ingress_ifindexrx_queue_index, giúp bạn xác định giao diện hoặc hàng đợi nào đang chịu áp lực. Đối với giám sát dài hạn, các công cụ như ebpf_exporter chuyển đổi dữ liệu bản đồ eBPF thô thành các chỉ số tương thích với Prometheus để hiển thị trong Grafana.

Công cụ, triển khai và yêu cầu phần cứng

Chuỗi công cụ bắt đầu với ClangLLVM để biên dịch C hạn chế thành mã byte eBPF. Từ đó, bạn cần một thư viện tải:

  • libbpf: thư viện C tiêu chuẩn để sử dụng trong sản xuất. Hỗ trợ CO-RE (Compile Once, Run Everywhere) để đảm bảo tính di động giữa các hạt nhân.
  • libxdp: dành riêng cho XDP, hỗ trợ chạy nhiều chương trình XDP trên một giao diện duy nhất.
  • cilium/ebpf: thư viện Go thuần túy cho các ngăn xếp dựa trên Go.

Đối với quản lý, bpftool cho phép bạn kiểm tra các chương trình đang chạy và nội dung bản đồ. xdp-loader (từ xdp-tools bộ công cụ) xử lý việc tải và dỡ bỏ. BCC hữu ích cho việc tạo mẫu với các giao diện người dùng Python/Lua, nhưng libbpf với CO-RE là lựa chọn tốt hơn cho sản xuất.

Kích hoạt trình biên dịch BPF JIT trước khi triển khai:

sysctl -w net.core.bpf_jit_enable=1

Để cập nhật mà không gây gián đoạn, hãy sử dụng XDP_FLAGS_REPLACE cờ này để hoán đổi một chương trình đang chạy một cách nguyên tử. Ghim các bản đồ vào /sys/fs/bpf/ để chúng vẫn tồn tại sau khi trình tải kết thúc.

Tương thích phần cứng và nhân hệ điều hành

XDP được giới thiệu trong kernel 4.8, nhưng khuyến nghị sử dụng phiên bản 5.x trở lên để có đầy đủ tính năng. Kiểm tra kernel của bạn bằng uname -r và xác minh hệ thống tệp BPF tồn tại tại /sys/fs/bpf/.

Trình điều khiển NIC của bạn quyết định các tính năng XDP nào có sẵn:

Trình điều khiểnXDP cơ bảnChuyển hướngKhông sao chép (AF_XDP)
mlx5_core
i40e
ixgbe
virtio_netKhông
ena (Amazon)Không

Kiểm tra trình điều khiển của bạn bằng ethtool -i <interface>. Nếu chế độ gốc không được hỗ trợ, hệ thống sẽ chuyển sang chế độ chung, chế độ này chạy sau sk_buff việc phân bổ và không mang lại lợi ích về hiệu suất.

Vui lòng tắt GRO và LRO trước khi gắn chương trình XDP, vì chúng gây xung đột:

ethtool -K <iface> gro off lro off

XDP tiêu chuẩn yêu cầu các gói dữ liệu phải vừa với một trang bộ nhớ 4.096 byte. Trên i40eice trình điều khiển, giới hạn MTU của x86 là 3.046 byte.

Bắt đầu với XDP

Bắt đầu bằng cách đánh giá môi trường của bạn. Chạy uname -r để xác nhận kernel 4.8+ (ưu tiên 5.x), và ethtool -i <interface> để kiểm tra hỗ trợ trình điều khiển XDP gốc.

Bắt đầu với khả năng quan sát, không phải thực thi. Sử dụng bản đồ eBPF để phân loại và đếm lưu lượng để bạn có cơ sở về hoạt động bình thường. Khi bạn đã hiểu các mẫu lưu lượng của mình, hãy chuyển sang thực thi: thử nghiệm với xdpgeneric chế độ trước, sau đó chuyển sang xdpdrv (bản địa) cho môi trường sản xuất.

Hãy lưu ý rằng XDP xử lý lọc ở cấp độ gói tin, không phải băng thông thô. Đối với các cuộc tấn công quy mô lớn ở tốc độ 100 Gbps, hãy kết hợp nó với cơ sở hạ tầng bare-metal và BGP FlowSpec để quản lý lưu lượng truy cập ngược dòng trước khi nó đến máy chủ.

Nếu bạn đang chạy các khối lượng công việc có lưu lượng truy cập cao cần lọc gói tin nhanh, các máy chủ chuyên dụng của FDC cung cấp nền tảng bare-metal để tận dụng tối đa XDP.

Blog

Nổi bật trong tuần

Các bài viết khác
XDP và eBPF cho xử lý gói tin trên Linux

XDP và eBPF cho xử lý gói tin trên Linux

Cách XDP và eBPF xử lý hàng triệu gói tin mỗi giây ở cấp trình điều khiển NIC. Các bài kiểm tra hiệu năng, trường hợp sử dụng DDoS, thiết lập chuỗi công cụ và yêu cầu phần cứng

14 phút đọc - 27 tháng 5, 2026

Tại sao việc sở hữu một VPS mạnh mẽ và không giới hạn băng thông lại quan trọng

3 phút đọc - 9 tháng 5, 2025

Các bài viết khác
background image

Bạn có thắc mắc hoặc cần giải pháp tùy chỉnh?

icon

Các tùy chọn linh hoạt

icon

Phạm vi toàn cầu

icon

Triển khai ngay lập tức

icon

Các tùy chọn linh hoạt

icon

Phạm vi toàn cầu

icon

Triển khai ngay lập tức