Çekirdeğin trafik şekillendirme katmanı, temel olarak, ağ kartınıza bağlı bir paket zamanlayıcıdır. Dolayısıyla, bir trafik şekillendirme politikası bir ağ kartı için geçerlidir.
Sizin durumunuzda yapabileceğiniz şey, ekli bir IP ve bant genişliği listesi oluşturmaktır ve ardından her bir IP için şunları yaratırsınız:
- Sınıf kimliği tarafından tanımlanan bir trafik şekillendirme kuralı
- Paketleri belirli bir işaret değerine işaretleyecek bir netfilter kuralı
- Bu paketleri bağlayacak bir Filtre, sınıf kimliğini işaretler ve böylece trafik kontrol kuralını belirtilen paketlere uygular.
@Zoredache tarafından verilen örnek çalışıyor, ama ben şahsen paketleri filtrelemek için TC yerine Netfilter özelliğini ve shapping algoritması için CBQ yerine HTB kullanmayı tercih ediyorum. Böylece böyle bir şey deneyebilirsiniz (ilişkilendirilebilir diziler için Bash 4 gerektirir):
#! /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: varsayılan sınıfı unuttum ve kodun sonunda işaretler yaymak için.