Lapisan pembentuk lalu lintas dari kernel pada dasarnya adalah penjadwal paket yang dilampirkan ke kartu jaringan Anda. Jadi satu kebijakan pembentukan traffic berlaku untuk satu kartu jaringan.
Apa yang dapat Anda lakukan, dalam kasus Anda, adalah membuat daftar IP dan bandwidth yang terpasang, dan kemudian, untuk setiap IP, Anda membuat:
- Satu aturan pembentukan lalu lintas diidentifikasi oleh classid
- Satu aturan netfilter yang akan menandai paket ke nilai tanda tertentu
- Satu Filter yang akan mengikat tanda paket ke classid, sehingga menerapkan aturan kontrol lalu lintas ke paket yang ditentukan.
Contoh yang diberikan oleh @Zoredache berfungsi, tapi saya pribadi lebih suka menggunakan kemampuan Netfilter daripada TC untuk menyaring paket, dan HTB daripada CBQ untuk algoritma shapping. Jadi Anda dapat mencoba sesuatu seperti ini (membutuhkan Bash 4 untuk array asosiatif):
#! /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
- edit: lupa kelas default dan untuk menyebarkan tanda di akhir skrip.