Mạng giới hạn tốc độ nhưng cho phép bùng nổ trên mỗi kết nối TCP trước khi giới hạn


8

Chúng tôi có bộ định tuyến của Cisco cho phép giới hạn tốc độ (họ gọi đó là kiểm soát chính sách) nhưng cho phép bùng nổ trên cơ sở kết nối trên mỗi TCP. Ví dụ: chúng ta có thể giới hạn băng thông ở mức 50mbit nhưng giới hạn sẽ không bị áp đặt cho đến khi 4 megabyte được chuyển. Điều này được thi hành trên mỗi kết nối TCP được thực hiện.

Có một số cách để làm điều này trong Linux? Ngoài ra, có bất kỳ nhược điểm cho một giải pháp như vậy? Trong trường hợp nó hữu ích với bất kỳ ai, lệnh Cisco để cài đặt cụm từ là tham số thứ ba cho lệnh cảnh sát được chạy dưới bản đồ chính sách (ít nhất là trên ASA 5505 của chúng tôi).

Mục tiêu của việc này là cho phép một máy chủ tận dụng sự bùng nổ 95/5 và phục vụ các trang web nhanh nhất có thể cho người dùng bình thường nhưng giảm cơ hội bùng nổ hơn 5% thời gian (chẳng hạn như làm máy chủ cho máy chủ chuyển hoặc các tập tin lớn đang được tải xuống từ một trang web). Tôi hiểu với một cuộc tấn công DDoS đã diễn ra quá lâu, đây có thể không phải là một giải pháp, nhưng vì nhiều lý do không phải là vấn đề đáng lo ngại ở đây.

Câu trả lời:


6

Điều này có thể thực hiện được trong linux với iptablestc. Bạn định cấu hình iptables cho các MARKgói trên một kết nối nơi một số byte đã được chuyển. Sau đó, bạn sử dụng tcđể đặt các gói được đánh dấu đó vào một lớp trong một môn học xếp hàng để xác định lại băng thông.

Một phần khó khăn là hạn chế kết nối cho cả tải lên và tải xuống. tckhông hỗ trợ định hình lưu lượng truy cập. Bạn có thể khắc phục điều này bằng cách định hình đầu ra trên giao diện máy chủ web (sẽ định hình các bản tải xuống cho máy chủ web của bạn) và định hình đi ra trên giao diện đối diện với nhà cung cấp ngược dòng của bạn (sẽ định hình tải lên từ máy chủ web của bạn). Bạn không thực sự định hình lưu lượng truy cập (tải xuống), vì bạn không thể kiểm soát tốc độ nhà cung cấp ngược dòng của mình gửi dữ liệu. Tuy nhiên, việc định hình giao diện máy chủ web của bạn sẽ dẫn đến việc các gói bị bỏ và trình tải lên thu nhỏ cửa sổ TCP của chúng để phù hợp với giới hạn băng thông.

Ví dụ: (giả sử đây là trên một bộ định tuyến dựa trên linux, nơi giao diện đối diện với máy chủ web eth0và ngược dòng là eth1)

# mark the packets for connections over 4MB being forwarded out eth1
# (uploads from webserver)
iptables -t mangle -A FORWARD -p tcp -o eth1 -m connbytes --connbytes 4194304: --connbytes-dir both --connbytes-mode bytes -j MARK --set-mark 50

# mark the packets for connections over 4MB being forwarded out eth0
# (downloads to webserver)
iptables -t mangle -A FORWARD -p tcp -o eth0 -m connbytes --connbytes 4194304: --connbytes-dir both --connbytes-mode bytes -j MARK --set-mark 50

# Setup queuing discipline for server-download traffic
tc qdisc add dev eth0 root handle 1: htb
tc class add dev eth0 parent 1: classid 1:50 htb rate 50mbit

# Setup queuing discipline for server-upload traffic
tc qdisc add dev eth1 root handle 1: htb
tc class add dev eth1 parent 1: classid 1:50 htb rate 50mbit

# set the tc filters to catch the marked packets and direct them appropriately
tc filter add dev eth0 parent 1:0 protocol ip handle 50 fw flowid 1:50
tc filter add dev eth1 parent 1:0 protocol ip handle 50 fw flowid 1:50

Nếu bạn muốn làm điều này trên chính máy chủ web thay vì trên bộ định tuyến linux, bạn vẫn có thể sử dụng các phần tải lên của nội dung trên. Một thay đổi đáng chú ý là bạn sẽ thay thế FOWARDbằng OUTPUT. Để tải xuống, bạn cần thiết lập một kỷ luật xếp hàng bằng cách sử dụng thiết bị "Khối chức năng trung gian" hoặc ifb. Nói tóm lại, nó sử dụng một giao diện ảo để bạn có thể coi lưu lượng truy cập là đầu ra và định hình nó từ đó bằng cách sử dụng tc. Thông tin thêm về cách thiết lập một ifbcó thể được tìm thấy ở đây: https://serverfault.com/questions3530023/tc-ingress-policing-and-ifb-mirroring

Lưu ý rằng loại công cụ này có xu hướng đòi hỏi nhiều điều chỉnh theo tỷ lệ. Một mối quan tâm ngay lập tức là connbytesphụ thuộc vào conntrackmô-đun, có xu hướng đánh vào các bức tường tỷ lệ với số lượng lớn các kết nối. Tôi khuyên bạn nên thử tải nặng.

Một cảnh báo khác là điều này hoàn toàn không hoạt động đối với UDP, vì nó không trạng thái. Có nhiều kỹ thuật khác để giải quyết vấn đề đó, nhưng có vẻ như các yêu cầu của bạn chỉ dành cho TCP.

Ngoài ra, để hoàn tác tất cả những điều trên, hãy làm như sau:

# Flush the mangle FORWARD chain (don't run this if you have other stuff in there)
iptables -t mangle -F FORWARD

# Delete the queuing disciplines
tc qdisc del dev eth0 root
tc qdisc del dev eth1 root
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.