XDP (hay Express Data Path) là một tiện ích mạng có sẵn trong Linux kernel. XDP được sử dụng phổ biến trong nhiều công ty để giải quyết một số vấn đề mạng nghiêm trọng mà họ gặp phải trong khi xử lý hàng triệu yêu cầu mỗi giây. Đây là một chương trình mã nguồn mở được cấp phép của MIT, hợp nhất trong Linux kernel từ phiên bản 4.8.
XDP là một bộ xử lý gói dữ liệu mạng hiệu suất và có thể lập trình được. Nó tồn tại để giảm thiểu một số vấn đề nghiêm trọng phía máy chủ như các cuộc tấn công DDoS (Từ chối dịch vụ phân tán) hoặc như một trình cân bằng tải.
Nhu cầu đối với XDP
Nhu cầu về một đường dẫn dữ liệu mạng hiệu quả luôn là một tính năng bắt buộc đối với các máy chủ Linux. Nhưng khả năng lập trình của các đường dẫn dữ liệu đó cũng nên có để những nhà phát triển tạo ra thứ gì đó có thể sử dụng được từ nó. Mặc dù XDP khá phức tạp, nhưng do sự phát triển gần đây của nhiều công cụ và framework, việc viết code XDP ngày nay khá dễ tiếp cận.
Ưu điểm rất lớn của XDP là tốc độ của nó. Ưu điểm chính của XDP là các nhà phát triển có thể xây dựng chức năng mới để lọc ra gói mà không cần sửa đổi kernel.
Có vài tình huống khi một số gói không cần phải di chuyển qua toàn bộ ngăn xếp mạng (network stack) để quyết định chuyển tiếp hoặc bỏ gói. Nó sẽ được thực hiện trên lớp đầu tiên của ngăn xếp mạng bằng cách đặt một số bộ lọc. Các bộ lọc này phải được lập trình theo cách mà chúng có thể dễ dàng nhận ra một gói dữ liệu độc hại và thả nó ngay ở đầu ngăn xếp. Điều này có thể tiết kiệm rất nhiều công suất và thời gian xử lý.
Với XDP, việc lọc này có thể thực hiện được ngay ở phía trước của ngăn xếp mạng.
Bây giờ sử dụng XDP, nhà phát triển có thể lọc ra bất kỳ gói tin nào có thể được gửi bởi tin tặc để thực hiện một cuộc tấn công DDoS. Điều này có thể giảm phần lớn chi phí trong ngăn xếp mạng kernel thông thường. Tính năng này gần đây đã được Cloudflare chứng minh trong phần demo khả năng bảo vệ DDoS của họ.
Một số tính năng đáng chú ý của XDP như sau:
1. Không yêu cầu bất kỳ phần cứng chuyên dụng nào: XDP có thể chạy bất kỳ phần cứng nào bạn đưa vào. Tốc độ có thể bị ảnh hưởng nếu bạn không có thiết bị được tối ưu hóa hoặc driver của nó, nhưng vì mục đích thử nghiệm, bạn không cần bất kỳ phần cứng chuyên dụng nào.
2. Không yêu cầu bỏ qua kernel: XDP chạy trước khi gói truy cập vào ngăn xếp mạng kernel. Hàm gọi lại được kích hoạt khi một gói được nhận và XDP xử lý nó nhanh nhất có thể.
3. Không thay thế ngăn xếp TCP/IP: XDP hiện diện ở cấp thấp nhất của ngăn xếp mạng. Sau đó gói đi vào ngăn xếp mạng kernel bình thường bao gồm ngăn xếp TCP/IP.
4. Hoạt động cùng với TCP/IP với tất cả các tính năng của BPF (Berkeley Packet Filter): XDP không thay thế bất cứ thứ gì. Nó thậm chí còn sử dụng eBPF để xử lý các gói tin và cung cấp cho nhà phát triển thời gian viết code dễ dàng hơn.
Tại sao XDP lại nhanh đến vậy?
XDP là một đường dẫn dữ liệu mạng hiệu suất cao, có thể lập trình dựa trên eBPF trong Linux kernel. Hiệu suất đạt được của XDP là do xử lý gói bare metal ở mức thấp nhất của ngăn xếp phần mềm. Điều này nghĩa là gói dữ liệu đến từ mạng sẽ tác động tới XDP đầu tiên trước bất kỳ tiến trình nào khác của kernel.
Do đó, các kỹ sư có thể lập trình XDP để tối ưu hóa nó cho nhiều trường hợp sử dụng khác nhau, từ bảo vệ DDoS đến cân bằng tải.
XDP được load trực tiếp trên ngăn xếp mạng. Khi một gói tin được nhận bởi ngăn xếp mạng, nó sẽ nhận được gọi lại và xử lý nhanh nhất có thể. XDP có thể giảm 26 triệu gói mỗi giây trên mỗi lõi trong phần cứng thương mại.
Lý do chính khiến XDP có tốc độ rất nhanh là bởi người dùng được phép trực tiếp đọc hoặc thực hiện các thay đổi đối với dữ liệu gói mạng và đưa ra quyết định về cách xử lý gói ở giai đoạn trước đó. Điều này đòi hỏi chi phí quy trình rất ít hơn và dẫn đến tốc độ tốt hơn.
Kết nối ngăn xếp mạng với XDP
Bạn có thể kết nối mạng với XDP bằng nhiều cách khác nhau, nhưng bài viết sẽ chỉ đề cập đến một số phương pháp phổ biến ở đây.
1. Generic XDP: Trong quá trình này, XDP được load trong kernel, nhưng nhận được rất ít lợi ích về hiệu suất. Đây là cách dễ dàng để chạy một chương trình XDP mà không cần bất kỳ sự hỗ trợ nào từ phần cứng.
2. Native XDP: Native XDP (XDP gốc) được load bởi chính driver mạng. Nó yêu cầu sự hỗ trợ từ driver card mạng.
Các loại hoạt động XDP thực hiện
Một số hoạt động mà XDP có thể thực hiện khi interface mạng nhận được gói là:
1. XDP_DROP: Thả các gói và không xử lý chúng. Sử dụng chương trình eBPF để phân tích mẫu lưu lượng và có thể thả các gói trong thời gian thực.
2. XDP_PASS: Chuyển tiếp các gói đến ngăn xếp mạng để xử lý thêm. Nó có thể sửa đổi nội dung của gói tin trước khi chuyển tiếp.
3. XDP_ABORTED: Thả gói dữ liệu mạng, để lại một ngoại lệ về điểm theo dõi.
4. XDP_TX: Chuyển tiếp các gói đến cùng một interface mạng nhận chúng. Các gói tin có thể được sửa đổi nếu chưa được xử lý.
5. XDP_REDIRECT: Chuyển hướng gói tin đến một NIC (Network Interface Controller) khác.
XDP và eBPF
eBPF là phiên bản mở rộng của Berkeley Packet Filter. Nó giống như một máy ảo trừu tượng chạy bên trong Linux kernel. eBPF được sử dụng để chạy chương trình do người dùng định nghĩa bên trong môi trường sandbox thuộc Linux kernel. Nói chung, nó được sử dụng để chạy các công cụ mạng và giám sát trong máy chủ Linux nhằm đảm bảo hiệu suất tối ưu.
XDP là một framework được sử dụng để ghi xử lý gói tốc độ rất cao trong các ứng dụng BPF. Để làm cho nó nhanh hơn nữa, XDP chạy BPF ngay lập tức sau khi gói được một ngăn xếp mạng nhận.
XDP rất phức tạp. Do đó, các nhà phát triển đang tạo ra các công cụ và framework để dễ dàng lập trình bằng eBPF. Nó làm cho viết code để xử lý xử lý mạng tần số rất cao sử dụng XDP và eBPF trở nên dễ dàng. Ưu điểm cốt lõi của XDP là nó không yêu cầu bạn sửa đổi kernel, đây là một vấn đề rất đau đầu đối với các kỹ sư.
Nhưng, quyền lực đi kèm với trách nhiệm. Vì XDP chạy eBPF càng sớm càng tốt trước khi các gói được chính kernel phân tích cú pháp, các chương trình eBPF phải tự thực hiện tất cả việc phân tích cú pháp và không thể dựa vào kernel để làm bất cứ điều gì cho chúng.
Là một lập trình viên, hầu hết thời gian của bạn là làm việc với terminal. Đây là hướng dẫn để trang trí dấu nhắc lệnh terminal, bạn có thể tham khảo thêm.
Các trường hợp sử dụng phổ biến của XDP và eBPF
1. Tấn công DDoS: Trường hợp sử dụng chính của XDP là bảo vệ DDoS (tấn công Từ chối Dịch vụ Phân tán). Trong cuộc tấn công DDoS, kẻ tấn công cố gắng sử dụng càng nhiều tài nguyên của máy chủ càng tốt, bằng cách không để lại bất kỳ tiến trình nào cho người dùng cuối. Sử dụng XDP làm lớp rất nhanh của ngăn xếp mạng, không có chi phí xử lý liên quan đến việc bỏ một gói dữ liệu mạng. Sau khi lọc XDP, gói tin sẽ đi qua tất cả các phương pháp lọc khác mà Linux kernel cung cấp.
2. Bộ cân bằng tải: XDP cũng được sử dụng như một bộ cân bằng tải để xử lý một lượng lớn lưu lượng truy cập vào máy chủ. Ngoài Facebook, rất nhiều công ty công nghệ khổng lồ sử dụng công nghệ này. Trước đó, các kỹ sư sử dụng một máy chủ chuyên dụng làm bộ cân bằng tải. Điều này rất khó quản lý và phải hoạt động rất tốt để phục vụ hàng triệu khách hàng. Nhưng hãy tưởng tượng sử dụng lớp XDP như một bộ cân bằng tải mà không có máy chủ trung tâm, kết quả là không có điểm lỗi nào.
3. Tường lửa: XDP với eBPF có thể được sử dụng để viết các quy tắc tường lửa khác nhau nhằm bảo vệ hệ thống với chi phí rất nhỏ.