Вообщем пока прищел к такому решению.
- Имеем eth0 - локальная сеть(к пользователям), eth1 - глобальная сеть.
- поднят nat
скорость исходящего канала низкая,поэтому создаем правило приоритезации на интерфейсе "eth1 - глобальная сеть".(РАБОТАЕТ):
Код: Выделить всё
#!/bin/sh
IPTABLES=/sbin/iptables
DEV_IN=eth1
RATE_IN=380
case "$1" in
start)
########################## IN #############################
tc qdisc add dev $DEV_IN root handle 1:0 htb default 99
tc class add dev $DEV_IN parent 1:0 classid 1:1 htb rate ${RATE_IN}kbit ceil ${RATE_IN}kbit
tc class add dev $DEV_IN parent 1:1 classid 1:10 htb rate $[$RATE_IN/6]kbit ceil $[$RATE_IN/2]kbit prio 0
tc class add dev $DEV_IN parent 1:1 classid 1:25 htb rate $[$RATE_IN/6]kbit ceil $[$RATE_IN/2]kbit prio 1
tc class add dev $DEV_IN parent 1:1 classid 1:50 htb rate $[$RATE_IN/4]kbit ceil ${RATE_IN}kbit prio 2
tc class add dev $DEV_IN parent 1:1 classid 1:75 htb rate $[$RATE_IN/4]kbit ceil ${RATE_IN}kbit prio 3
tc class add dev $DEV_IN parent 1:1 classid 1:99 htb rate $[$RATE_IN/4]kbit ceil ${RATE_IN}kbit prio 4
tc qdisc add dev $DEV_IN parent 1:10 handle 10: pfifo limit 5
tc qdisc add dev $DEV_IN parent 1:25 handle 25: sfq perturb 10
tc qdisc add dev $DEV_IN parent 1:50 handle 50: sfq perturb 10
tc qdisc add dev $DEV_IN parent 1:75 handle 75: sfq perturb 10
tc qdisc add dev $DEV_IN parent 1:99 handle 99: sfq perturb 10
#### Маркировка пакетов
# добавить цепочку MYSHAPER-IN в таблицу mangle - сейчас мы настроим таблицу,которую будем
# использовать для фильтрациии установки fwmark
iptables -t mangle -N MYSHAPER-IN
iptables -t mangle -I POSTROUTING -o $DEV_IN -j MYSHAPER-IN
# маркируем пакеты с помощью fwmark - устанавливаем значения 10-99 в зависимости от
# нужного класса. Высший приоритет - 10.
# Низкоприоритетный трафик
iptables -t mangle -A MYSHAPER-IN -p tcp --sport 0:1024 -j MARK --set-mark 99
iptables -t mangle -A MYSHAPER-IN -p tcp --dport 0:1024 -j MARK --set-mark 99
# интернет-пейджер aol
iptables -t mangle -A MYSHAPER-IN -p tcp --sport 5190 -j MARK --set-mark 75
iptables -t mangle -A MYSHAPER-IN -p tcp --dport 5190 -j MARK --set-mark 75
# irc
iptables -t mangle -A MYSHAPER-IN -p tcp --sport 6667 -j MARK --set-mark 75
iptables -t mangle -A MYSHAPER-IN -p tcp --sport 9944 -j MARK --set-mark 75
iptables -t mangle -A MYSHAPER-IN -p tcp --dport 6667 -j MARK --set-mark 75
iptables -t mangle -A MYSHAPER-IN -p tcp --dport 9944 -j MARK --set-mark 75
# ICMP (ping) - высокий приоритет,
# будем удивлять друзей
iptables -t mangle -A MYSHAPER-IN -p icmp -j MARK --set-mark 25
# распознавание имен DNS (маленькие пакеты)
iptables -t mangle -A MYSHAPER-IN -p udp -j MARK --set-mark 25
# secure shell
iptables -t mangle -A MYSHAPER-IN -p tcp --dport 22 -j MARK --set-mark 10
iptables -t mangle -A MYSHAPER-IN -p tcp --sport 22 -j MARK --set-mark 10
# telnet (ew...)
iptables -t mangle -A MYSHAPER-IN -p tcp --dport 23 -j MARK --set-mark 25
iptables -t mangle -A MYSHAPER-IN -p tcp --sport 23 -j MARK --set-mark 25
# маленькие пакеты, скорее всего ACK-пакеты
iptables -t mangle -A MYSHAPER-IN -p tcp -m length --length :64 -j MARK --set-mark 25
#тут ускрил кого нибудь в офисе
iptables -t mangle -A MYSHAPER-IN -d 192.168.0.5 -j MARK --set-mark 10
# избыточно - смаркировать все неотмаркированые пакеты как 99 (низкий проиритет)
iptables -t mangle -A MYSHAPER-IN -m mark --mark 0 -j MARK --set-mark 99
tc filter add dev $DEV_IN parent 1:0 prio 0 protocol ip handle 10 fw flowid 1:10
tc filter add dev $DEV_IN parent 1:0 prio 1 protocol ip handle 25 fw flowid 1:25
tc filter add dev $DEV_IN parent 1:0 prio 2 protocol ip handle 50 fw flowid 1:50
tc filter add dev $DEV_IN parent 1:0 prio 3 protocol ip handle 75 fw flowid 1:75
tc filter add dev $DEV_IN parent 1:0 prio 4 protocol ip handle 99 fw flowid 1:99
echo "Shaper on $DEV_IN started ($RATE_IN kbit/s)"
;;
stop)
tc qdisc del dev $DEV_IN root 2> /dev/null > /dev/null
tc qdisc del dev $DEV_OUT root 2> /dev/null > /dev/null
iptables -t mangle -D POSTROUTING -o $DEV_OUT -j MYSHAPER-OUT 2> /dev/null > /dev/null
iptables -t mangle -F MYSHAPER-OUT 2> /dev/null > /dev/null
iptables -t mangle -X MYSHAPER-OUT 2> /dev/null > /dev/null
iptables -t mangle -D POSTROUTING -o $DEV_IN -j MYSHAPER-IN 2> /dev/null > /dev/null
iptables -t mangle -F MYSHAPER-IN 2> /dev/null > /dev/null
iptables -t mangle -X MYSHAPER-IN 2> /dev/null > /dev/null
echo "Shaper removed"
;;
restart)
$0 stop
$0 start
;;
status)
echo "[qdisc IN]"
tc -s qdisc show dev $DEV_IN
echo "[class IN]"
tc -s class show dev $DEV_IN
echo "[filter IN]"
tc -s filter show dev $DEV_IN
;;
*)
echo "Usage: $0 {start|stop|restart|status}"
;;
esac
exit 0
ОСНОВНАЯ ПРОБЛЕММА
теперь нужно на интерфейсе смотрящем в сеть eth1 сформировать каждому пользователю полосу "не выше" 1024\64 kbit\s
Уточню внимание: не на всю подсеть делить скорость 1024\64 kbit\s, а каждому пользователю выдать по "не выще" 1024\64 kbit\s
То есть:
192.168.0.2 (вася) - 1024\64 kbit\s
.......
192.168.0.7 (петя) - 1024\64 kbit\s
.......
192.168.0.30 (катя) - 1024\64 kbit\s
........
192.168.0.67 (марина) - 1024\64 kbit\s
.......и т. д.
Пока что получается ограничевать скорость только на подсеть. на каждого тоже,но скрипт получается нереально идиотский:
Код: Выделить всё
#!/bin/sh
IPTABLES=/sbin/iptables
#TC=/sbin/tc
DEV_IN=eth0
RATE=10000
RATES_INS=1024
case "$1" in
start)
########################## IN #############################
tc qdisc add dev $DEV_IN root handle 1:0 htb default 333
tc class add dev $DEV_IN parent 1:0 classid 1:1 htb rate ${RATE}kbit ceil ${RATE}kbit
tc class add dev $DEV_IN parent 1:1 classid 1:2 htb rate $[$RATES_INS/2]kbit ceil ${RATES_INS}kbit
#....
tc class add dev $DEV_IN parent 1:1 classid 1:7 htb rate $[$RATES_INS/2]kbit ceil ${RATES_INS}kbit
#....
tc class add dev $DEV_IN parent 1:1 classid 1:30 htb rate $[$RATES_INS/2]kbit ceil ${RATES_INS}kbit
#....
tc class add dev $DEV_IN parent 1:1 classid 1:67 htb rate $[$RATES_INS/2]kbit ceil ${RATES_INS}kbit
#....
tc class add dev $DEV_IN parent 1:1 classid 1:333 htb rate $[$RATES_INS/8]kbit ceil ${$RATES_INS/4]kbit #для особо умных,и тех кого я еще не добавил...
# И ТАК НА КАЖДОГО ПОЛЬЗОВАТЕЛЯ
tc qdisc add dev $DEV_IN parent 1:2 handle 2: sfq perturb 10
tc qdisc add dev $DEV_IN parent 1:7 handle 7: sfq perturb 10
tc qdisc add dev $DEV_IN parent 1:30 handle 30: sfq perturb 10
tc qdisc add dev $DEV_IN parent 1:67 handle 67: sfq perturb 10
tc qdisc add dev $DEV_IN parent 1:333 handle 333: sfq perturb 10
# И ТАК НА КАЖДОГО ПОЛЬЗОВАТЕЛЯ
#### Маркировка пакетов
# добавить цепочку MYSHAPER-IN в таблицу mangle - сейчас мы настроим таблицу,которую будем
# использовать для фильтрациии установки fwmark
iptables -t mangle -N MYSHAPER-IN
iptables -t mangle -I POSTROUTING -o $DEV_IN -j MYSHAPER-IN
#ТЕПЕРЬ ПЕРЕБЕРАЕМ ВСЕ IP!!!ЖЕСТЬ....
iptables -t mangle -A MYSHAPER-IN -d 192.168.0.2 -j MARK --set-mark 2
iptables -t mangle -A MYSHAPER-IN -d 192.168.0.7 -j MARK --set-mark 7
iptables -t mangle -A MYSHAPER-IN -d 192.168.0.30 -j MARK --set-mark 30
iptables -t mangle -A MYSHAPER-IN -d 192.168.0.67 -j MARK --set-mark 67
tc filter add dev $DEV_IN parent 1:0 protocol ip handle 2 fw flowid 1:2
tc filter add dev $DEV_IN parent 1:0 protocol ip handle 7 fw flowid 1:7
tc filter add dev $DEV_IN parent 1:0 protocol ip handle 30 fw flowid 1:30
tc filter add dev $DEV_IN parent 1:0 protocol ip handle 67 fw flowid 1:67
tc filter add dev $DEV_IN parent 1:0 protocol ip handle 333 fw flowid 1:333
# И ТАК НА КАЖДОГО ПОЛЬЗОВАТЕЛЯ
echo "Shaper on $DEV_IN started ($RATE_IN kbit/s)"
;;
stop)
tc qdisc del dev $DEV_IN root 2> /dev/null > /dev/null
tc qdisc del dev $DEV_OUT root 2> /dev/null > /dev/null
iptables -t mangle -D POSTROUTING -o $DEV_OUT -j MYSHAPER-OUT 2> /dev/null > /dev/null
iptables -t mangle -F MYSHAPER-OUT 2> /dev/null > /dev/null
iptables -t mangle -X MYSHAPER-OUT 2> /dev/null > /dev/null
iptables -t mangle -D POSTROUTING -o $DEV_IN -j MYSHAPER-IN 2> /dev/null > /dev/null
iptables -t mangle -F MYSHAPER-IN 2> /dev/null > /dev/null
iptables -t mangle -X MYSHAPER-IN 2> /dev/null > /dev/null
echo "Shaper removed"
;;
restart)
$0 stop
$0 start
;;
status)
echo "[qdisc IN]"
tc -s qdisc show dev $DEV_IN
echo "[class IN]"
tc -s class show dev $DEV_IN
echo "[filter IN]"
tc -s filter show dev $DEV_IN
;;
*)
echo "Usage: $0 {start|stop|restart|status}"
;;
esac
exit 0
Кто подскажет как упростить все это?!Очень прошу.
или может быть воспользоваться чем то другим?!