Điều này có thể thực hiện được trong linux với iptables
và tc
. Bạn định cấu hình iptables cho các MARK
gó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. tc
khô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 eth0
và 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ế FOWARD
bằ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 ifb
có 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à connbytes
phụ thuộc vào conntrack
mô-đ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