Tài liệu

Tùy chọn Datagram Guard

Thời gian đọc 4 phút Gói: Nalix.Network / Nalix.Runtime
Trên trang này

DatagramGuardOptions cấu hình việc theo dõi cửa sổ nguồn có giới hạn được DatagramGuard của listener UDP sử dụng. Guard giới hạn tốc độ gói theo từng nguồn thông qua ConnectionGuardOptions.MaxPacketPerSecond, trong khi kiểu tùy chọn này kiểm soát số lượng cửa sổ nguồn IPv4/IPv6 có thể được theo dõi cùng lúc và cách dọn dẹp các cửa sổ đã cũ.

Ánh xạ mã nguồn

  • src/Nalix.Network/Options/DatagramGuardOptions.cs
  • src/Nalix.Network/RateLimiting/Datagram.Guard.cs
  • src/Nalix.Network/Listeners/UdpListener/UdpListener.Core.cs

Kết nối với UDP listener

UdpListenerBase nạp và kiểm tra hợp lệ các tùy chọn này trong static constructor của nó:

s_datagramGuardOptions = ConfigurationManager.Instance.Get<DatagramGuardOptions>();
s_datagramGuardOptions.Validate();

Mỗi instance listener sau đó tạo một DatagramGuard với:

  • ConnectionGuardOptions.MaxPacketPerSecond
  • DatagramGuardOptions.IPv4Windows
  • DatagramGuardOptions.IPv6Windows
  • DatagramGuardOptions.CleanupInterval
  • DatagramGuardOptions.IdleTimeout
  • DatagramGuardOptions.IPv4Capacity
  • DatagramGuardOptions.IPv6Capacity
Architecture Diagram
flowchart LR
    A["UdpListenerBase"] --> B["ConnectionGuardOptions.MaxPacketPerSecond"]
    A --> C["DatagramGuardOptions"]
    B --> D["DatagramGuard"]
    C --> D
    D --> E["TryAccept(IPEndPoint)"]
    E --> F["IPv4/IPv6 source window"]
    F --> G["CAS packet count per second"]

Giá trị mặc định và kiểm tra hợp lệ

Thuộc tínhMặc địnhPhạm vi hợp lệHành vi trong mã nguồn
IPv4Windows65_5361..10_000_000Số cửa sổ nguồn IPv4 tối đa được theo dõi cùng lúc.
IPv6Windows16_3841..10_000_000Số cửa sổ nguồn IPv6 tối đa được theo dõi cùng lúc.
IPv4Capacity10241..10_000_000Gợi ý dung lượng ban đầu cho bản đồ nguồn IPv4.
IPv6Capacity641..10_000_000Gợi ý dung lượng ban đầu cho bản đồ nguồn IPv6.
CleanupInterval00:01:0000:00:01..01:00:00Khoảng thời gian giữa các lượt loại bỏ cửa sổ nguồn đã cũ.
IdleTimeout00:00:1000:00:01..01:00:00Thời gian giữ cửa sổ nguồn không hoạt động trước khi bị loại bỏ.
FailOpenWhenFullfalseBooleanKhi true, cho phép gói đi qua khi bản đồ theo dõi đã đầy, tránh việc khóa người dùng hợp lệ trong lúc bị flood với nguồn giả mạo. Khi false (mặc định), guard từ chối gói đến khi bản đồ đầy (fail-closed).
UdpReplayWindowSize51264..65536Kích thước bit của cửa sổ trượt chống phát lại UDP; cửa sổ lớn hơn tốn nhiều bộ nhớ hơn nhưng chịu được gói đến không đúng thứ tự tốt hơn.

Validate() chạy kiểm tra DataAnnotation và ném ValidationException khi vi phạm ràng buộc.

Hành vi lúc chạy

DatagramGuard.TryAccept(IPEndPoint) trả về false khi:

  • guard đã bị hủy;
  • endpoint là null;
  • bản đồ cửa sổ nguồn IPv4 hoặc IPv6 đã đạt giới hạn cấu hình;
  • nguồn đã đạt MaxPacketPerSecond trong giây hiện tại.

Guard lưu mỗi nguồn trong một WindowSlot với một long đóng gói duy nhất:

Trường đóng góiÝ nghĩa
32 bit caotoken của giây hiện tại từ Environment.TickCount64 / 1000
32 bit thấpsố gói trong giây đó

Việc cập nhật dùng Interlocked.CompareExchange, nên đường nóng không dùng lock nhưng vẫn giữ được bộ đếm gói chính xác theo từng giây cho mỗi nguồn.

Theo dõi IPv4 và IPv6

Họ địa chỉKiểu khóaGhi chú nguồn
IPv4uint từ IPAddress.AddressĐược chọn để tránh cấp phát khóa IPAddress và chi phí băm.
IPv6string từ IPAddress.ToString()Được dùng làm đường dự phòng ít gặp hơn cho các kịch bản DDoS qua UDP.

Dọn dẹp và giải phóng

Constructor khởi động CleanupLoopAsync ngay lập tức. Vòng lặp chờ CleanupInterval, sau đó loại bỏ các cửa sổ có giây được thấy lần cuối cũ hơn IdleTimeout.

Dispose() đánh dấu guard đã bị hủy, hủy và giải phóng token source của tác vụ dọn dẹp, rồi xóa cả bản đồ IPv4 và IPv6.

Hướng dẫn vận hành

  • Chỉ tăng IPv4Windows / IPv6Windows khi số lượng nguồn hợp lệ đủ lớn để cần thiết.

  • Giữ IdleTimeout ngắn đối với các endpoint UDP công khai khi đang chịu áp lực từ nguồn giả mạo.

  • Điều chỉnh ConnectionGuardOptions.MaxPacketPerSecond riêng biệt; đây là giới hạn tốc độ gói theo từng nguồn mà DatagramGuard sử dụng.

API liên quan