Về cơ bản, lớp định hình lưu lượng của kernel là một bộ lập lịch gói được gắn vào card mạng của bạn. Vì vậy, một chính sách định hình lưu lượng áp dụng cho một card mạng.
Trong trường hợp của bạn, những gì bạn có thể làm là tạo một danh sách IP và băng thông được đính kèm, và sau đó, với mỗi IP, bạn tạo:
- Một quy tắc định hình lưu lượng được xác định bởi một classid
- Một quy tắc bộ lọc mạng sẽ đánh dấu các gói đến một giá trị đánh dấu cụ thể
- Một Bộ lọc sẽ liên kết các gói tin đó với classid, do đó áp dụng quy tắc kiểm soát lưu lượng cho các gói được chỉ định.
Ví dụ được đưa ra bởi @Zoredache hoạt động, nhưng cá nhân tôi thích sử dụng khả năng Netfilter thay vì TC để lọc các gói và HTB thay vì CBQ cho thuật toán chuyển đổi. Vì vậy, bạn có thể thử một cái gì đó như thế này (yêu cầu Bash 4 cho mảng kết hợp):
#! /bin/bash
NETCARD=eth0
MAXBANDWIDTH=100000
# reinit
tc qdisc del dev $NETCARD root handle 1
tc qdisc add dev $NETCARD root handle 1: htb default 9999
# create the default class
tc class add dev $NETCARD parent 1:0 classid 1:9999 htb rate $(( $MAXBANDWIDTH ))kbit ceil $(( $MAXBANDWIDTH ))kbit burst 5k prio 9999
# control bandwidth per IP
declare -A ipctrl
# define list of IP and bandwidth (in kilo bits per seconds) below
ipctrl[192.168.1.1]="256"
ipctrl[192.168.1.2]="128"
ipctrl[192.168.1.3]="512"
ipctrl[192.168.1.4]="32"
mark=0
for ip in "${!ipctrl[@]}"
do
mark=$(( mark + 1 ))
bandwidth=${ipctrl[$ip]}
# traffic shaping rule
tc class add dev $NETCARD parent 1:0 classid 1:$mark htb rate $(( $bandwidth ))kbit ceil $(( $bandwidth ))kbit burst 5k prio $mark
# netfilter packet marking rule
iptables -t mangle -A INPUT -i $NETCARD -s $ip -j CONNMARK --set-mark $mark
# filter that bind the two
tc filter add dev $NETCARD parent 1:0 protocol ip prio $mark handle $mark fw flowid 1:$mark
echo "IP $ip is attached to mark $mark and limited to $bandwidth kbps"
done
#propagate netfilter marks on connections
iptables -t mangle -A POSTROUTING -j CONNMARK --restore-mark
- chỉnh sửa: quên lớp mặc định và để truyền dấu ở cuối tập lệnh.